TransactionTemplate与JdbcTemplate

时间:2011-07-02 18:36:08

标签: spring

Spring Framework提供了两种程序化事务管理方法:

1)使用TransactionTemplate。

2)直接使用PlatformTransactionManager实现。

上面提到的是http://static.springsource.org/spring/docs/2.0.8/reference/transaction.html

Spring网站在这里没有提到JDBC模板。根据我的理解,jdbc模板也在内部管理事务,这也是在程序中完成的。那么最基本的差异是什么 TransactionTemplate和jdbc tempalte。

1 个答案:

答案 0 :(得分:17)

JdbcTemplate不是交易管理员。它只是本机JDBC操作的辅助类:

  

这是JDBC核心包中的中心类。它简化了JDBC的使用,有助于避免常见错误。它执行核心JDBC工作流,使应用程序代码提供SQL并提取结果。此类执行SQL查询或更新,启动对ResultSet的迭代并捕获JDBC异常并将它们转换为org.springframework.dao包中定义的通用的,更具信息性的异常层次结构。

顺便说一下,

TransactionTemplate也不是交易管理员,而是

  

简化程序化事务划分和事务异常处理的模板类。

PlatformTransactionManager(以及AbstractPlatformTransactionManager的其他子类)是一个事务管理器,就像在其中一样

  • 确定是否存在现有交易;
  • 应用适当的传播行为;
  • 如有必要,暂停并恢复交易;
  • 检查commit上的rollback-only标志;
  • 在回滚时应用适当的修改(实际回滚或仅设置回滚);
  • 触发已注册的同步回调(如果事务同步处于活动状态)。

所以这个类负责实际的事务处理,而不是TransactionTemplate,如果你想要在程序上实现它而不是声明式事务处理,那么将使用它。 (参见this博客,虽然已经过时了,但你会看到声明和手册之间的区别)

来自Spring 3 Reference的报价。

注意:在整个Spring框架中,您还可以找到其他* Template类:HibernateTemplate,JmsTemplate等。它们都遵循相同的模式:模板类从根本上减少了您需要编写的代码量,因为所有这些 - 被称为样板代码的人将由他们处理。示例(来自here):

没有JdbcTemplate

private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void insert(Customer customer){

    String sql = "INSERT INTO CUSTOMER " +
            "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
    Connection conn = null;

    try {
        conn = dataSource.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, customer.getCustId());
        ps.setString(2, customer.getName());
        ps.setInt(3, customer.getAge());
        ps.executeUpdate();
        ps.close();

    } catch (SQLException e) {
        throw new RuntimeException(e);

    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {}
        }
    }
}

使用JdbcTemplate

private DataSource dataSource;
private JdbcTemplate jdbcTemplate;

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void insert(Customer customer){

    String sql = "INSERT INTO CUSTOMER " +
        "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";

    jdbcTemplate = new JdbcTemplate(dataSource);

    jdbcTemplate.update(sql, new Object[] { customer.getCustId(),
        customer.getName(),customer.getAge()  
    });

}