这里记录我对Spring JDBC框架的学习。由于Spring JDBC和我之前做的工作有很多共同之处,学习经典Framework的设计,取长补短,为我所用。在这里,先佩服一下Rod JohnSon,他对数据库,JDBC的理解非常深。看Spring jdbc框架的设计和源代码,带给了我很多以前没有想到的东西。我们知道,Spring JDBC的主要目标是为了简化JDBC的编程,方便我们构建健壮的应用程序。这里,它的一个基本设计理念,就是将JDBC编程中变化的和不变化的分开。在JDBC中,什么是变化的?毫无疑问,SQL语句是变化的。那什么是不变化的?正确的使用JDBC的方式是不变化的。
先看一段代码。(自己的代码就不拿来做示范了,先看Rod书吧)
- public List getAvailableSeatlds(DataSource ds, int performanceld,
- int seatType) throws ApplicationException {
- String sql = "SELECT seat_id AS id FROM available_seats " +
- "WHERE performance_id = ? AND price_band_id = ?";List seatlds = new LinkedList();
- Connection con = null;
- PreparedStatement ps = null;
- ResultSet rs = null;
- try {
- con = ds.getConnection(); //1。建立Connection
- ps = con.prepareStatement(sql); //2。创建preparedStatement
- ps.setlnt(1, performanceld); //3。设置ps的参数
- ps.setlnt(2, seatType);
- rs = ps.executeQuery(); //4.执行查询
- while (rs.next()) { //5.解析ResultSet
int seatld = rs.getlnt(1); - seatlds.add(new Integer(seatld));
- }
- rs.close(); //6.关闭资源,做好善后工作。rs,ps,connection
- ps.close();
- }
- catch (SQLException ex) {
- throw new ApplicationException ("Couldn't run query [" + sql + "]", ex);
- }
- finally {
- try {
- if (con != null)
- con.close(); //如果没有连接池的话,不要轻易关。connection属于耗费资源:)
- }
- catch (SQLException ex) {
- // Log and ignore
- }
- }
- return seatlds;
- }
从上面看,什么是不变的。首先,咱们这个使用JDBC的方式是良好的,正确的,也是不变的,也就是workflow不变。其次,这里头的很多操作是不变的,比如说:关闭资源,处理异常。
◆什么是变的?设置PreparedStament的参数是变化的,利用PreparedStatement做什么是变化的。
◆还有什么是变的?取得Connection可能是变化的,我们可以从ConnectionPool中取,也可以裸从Database取。
◆还有什么是变的?在主工作流之外,还可以对PreparedStament设置一些属性。比如fetchSize等。
◆还有什么是变的?解析ResultSet是变的。但是可以抽象,都是从结果集中取得你想要的东西。
很好。经过分析,我们会自然而然的想到Template设计模式。用模板方法来描述我们的工作流。对于固定的操作,我们会把它建模为一些帮助类,利用这些类来完成固定操作,这些操作在Template方法中被调用。
对于哪些可以变的方法。我们也发现,其实它要实现的功能是一样的。抽象起来,我们可以用一些接口来描述这些功能。比如说数据库连接管理的功能。
设计取决于我们考虑问题的深度,以及我们对过程划分的粒度。
【编辑推荐】