简述Spring JDBC的学习

开发 后端
本文介绍Spring JDBC的基本设计理念,就是将JDBC编程中变化的和不变化的分开。

这里记录我对Spring JDBC框架的学习。由于Spring JDBC和我之前做的工作有很多共同之处,学习经典Framework的设计,取长补短,为我所用。在这里,先佩服一下Rod JohnSon,他对数据库,JDBC的理解非常深。看Spring jdbc框架的设计和源代码,带给了我很多以前没有想到的东西。我们知道,Spring JDBC的主要目标是为了简化JDBC的编程,方便我们构建健壮的应用程序。这里,它的一个基本设计理念,就是将JDBC编程中变化的和不变化的分开。在JDBC中,什么是变化的?毫无疑问,SQL语句是变化的。那什么是不变化的?正确的使用JDBC的方式是不变化的。

先看一段代码。(自己的代码就不拿来做示范了,先看Rod书吧)

  1. public List getAvailableSeatlds(DataSource ds, int performanceld,    
  2.         int seatType) throws ApplicationException {         
  3.      String sql = "SELECT seat_id AS id FROM available_seats " +    
  4.                    "WHERE performance_id = ? AND price_band_id = ?";List seatlds = new LinkedList();    
  5.     Connection con = null;    
  6.       PreparedStatement ps = null;    
  7.       ResultSet rs = null;    
  8.      try {    
  9.         con = ds.getConnection();   //1。建立Connection  
  10.        ps = con.prepareStatement(sql);  //2。创建preparedStatement  
  11.         ps.setlnt(1, performanceld);  //3。设置ps的参数  
  12.        ps.setlnt(2, seatType);  
  13.        rs = ps.executeQuery();      //4.执行查询
  14.        while (rs.next()) {         //5.解析ResultSet
  15.         int seatld = rs.getlnt(1);    
  16.           seatlds.add(new Integer(seatld));    
  17.        }                                                                                                                        
  18.        rs.close();                //6.关闭资源,做好善后工作。rs,ps,connection  
  19.        ps.close(); 
  20.          }    
  21.       catch (SQLException ex) {    
  22.        throw new ApplicationException ("Couldn't run query [" + sql + "]", ex);    
  23.      }    
  24.      finally {    
  25.         try {    
  26.          if (con != null)    
  27.           con.close();  //如果没有连接池的话,不要轻易关。connection属于耗费资源:)  
  28.        }    
  29.        catch (SQLException ex) {    
  30.          // Log and ignore    
  31.        }    
  32.      }    
  33.      return seatlds;    
  34.     }    

从上面看,什么是不变的。首先,咱们这个使用JDBC的方式是良好的,正确的,也是不变的,也就是workflow不变。其次,这里头的很多操作是不变的,比如说:关闭资源,处理异常。
◆什么是变的?设置PreparedStament的参数是变化的,利用PreparedStatement做什么是变化的。
◆还有什么是变的?取得Connection可能是变化的,我们可以从ConnectionPool中取,也可以裸从Database取。
◆还有什么是变的?在主工作流之外,还可以对PreparedStament设置一些属性。比如fetchSize等。
◆还有什么是变的?解析ResultSet是变的。但是可以抽象,都是从结果集中取得你想要的东西。
    
很好。经过分析,我们会自然而然的想到Template设计模式。用模板方法来描述我们的工作流。对于固定的操作,我们会把它建模为一些帮助类,利用这些类来完成固定操作,这些操作在Template方法中被调用。

对于哪些可以变的方法。我们也发现,其实它要实现的功能是一样的。抽象起来,我们可以用一些接口来描述这些功能。比如说数据库连接管理的功能。

设计取决于我们考虑问题的深度,以及我们对过程划分的粒度。

【编辑推荐】

  1. Spring MVC框架的高级配置(上)
  2. Spring MVC框架的高级配置(下)
  3. 用Factory Bean让Spring配置动起来
  4. Spring AOP使用心得
  5. Acegi安全框架在基于Spring框架应用
责任编辑:佚名 来源: JavaEye
相关推荐

2009-06-30 17:03:49

Spring集成Str

2009-06-24 11:39:45

学习JSF

2009-06-29 17:17:57

Spring

2009-07-20 10:42:55

Spring JDBC

2009-09-29 17:22:30

Hibernate S

2009-07-15 17:11:31

JDBC的概念

2009-09-25 11:27:19

Hibernate J

2009-06-08 17:56:00

SpringJDBC事务

2018-12-12 22:33:47

2009-06-19 18:38:01

Spring

2009-07-14 17:01:24

JDBC基础

2022-12-09 08:00:00

深度学习人工智能机器学习

2009-07-23 13:30:46

JDBC事务

2018-04-23 14:49:31

表征句子深度学习自然语言

2021-05-13 07:58:05

JDBC接口PreparedSta

2018-07-24 09:38:35

JavaMySQLJDBC

2018-07-20 14:58:16

深度学习梯度下降损失函数

2009-09-23 09:16:25

Hibernate复合

2010-07-27 14:52:37

Batch Telne

2012-09-19 15:06:45

Lucene
点赞
收藏

51CTO技术栈公众号