首页 文章

TransactionTemplate与JdbcTemplate

提问于
浏览
2

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 回答

  • 17

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

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

    顺便说一句 TransactionTemplate 也不是交易经理,它是一个

    模板类,简化了程序化事务划分和事务异常处理 .

    PlatformTransactionManager (以及 AbstractPlatformTransactionManager 的其他子类) is a transaction manager ,如同在其中

    • 确定是否存在现有交易;

    • 应用适当的传播行为;
      如有必要,

    • 暂停和恢复交易;

    • 检查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()  
        });
    
    }
    

相关问题