理则支持JDBC、JTA等多种事务资源。这为我们提供了更多的选择,从而也使得我们的
系统部署更加灵活。
对Spring事务管理机制进行简单分析之后,我们将结合持久层封装的具体事务应用机制,对Spring中的事务管理进行更具实效的探讨。
持久层封装
JDBC
Spring对JDBC进行了良好的封装,通过提供相应的模板和辅助类,在相当程度上降低了JDBC操作的复杂性。并且得益于Spring良好的隔离
设计,JDBC封装类库可以脱离SpringContext独立使用,也就是说,即使系统并没有采用Spring作为结构性框架,我们也可以单独使用Spring的JDBC部分(spring-dao.jar)来改善我们的代码。作为对比,首先让我们来看一段传统的JDBC代码:
Connectionconn=null;
Statementstmt=null;
try{
conn=dataSource.getConnection();
stmt=con.createStatement();
stmt.executeUpdate("UPDATEuserSETage=18WHEREid='erica'");
}finally{
if(stmt!=null){
try{
stmt.close();
}catch(SQLExceptionex){
logger.warn("ExceptioninclosingJDBCStatement",ex);
}
}
if(conn!=null){
try{
conn.close();
}catch(SQLExceptionex){
logger.warn("ExceptioninclosingJDBCConnection",ex);
}
}
}
类似上面的代码非常常见。为了执行一个SQL语句,我们必须编写22行代码,而其中21行与应用逻辑并无关联,并且,这样的代码还会在系统其他地方(也许是每个需要数据库访问的地方)重复出现。
于是,大家开始寻找一些设计模式以改进如此的设计,Template模式的应用是其中一种典型的改进
方案。Spring的JDBC封装,很大一部分就是借助Template模式实现,它提供了一个优秀的JDBC模板库,借助这个工具,我们可以简单有效的对传统的JDBC编码方式加以改进。下面是借助SpringJDBCTemplate修改过的代码,这段代码完成了与上面代码相同的功能。
JdbcTemplatejdbcTemplate=newJdbcTemplate(dataSource);
jdbcTemplate.update("UPDATEuserSETage=10WHEREid='erica'");
可以看到,两行代码完成了上面需要19行代码实现的功能。所有冗余的代码都通过合理的抽象汇集到了JdbcTemplate中。无需感叹,借助Template模式,我们大致也能实现这样一个模板,不过,Spring的设计
者已经提前完成了这一步骤。org.springframework.jdbc.core.