gpt4 book ai didi

spring - TransactionTemplate 与 JdbcTemplate

转载 作者:行者123 更新时间:2023-12-01 07:00:59 27 4
gpt4 key购买 nike

Spring 框架提供了两种编程事务管理的方法:

  • 使用 TransactionTemplate .
  • 使用 PlatformTransactionManager直接执行。

  • 以上描述在这里: http://static.springsource.org/spring/docs/2.0.8/reference/transaction.html
    Spring站点没有提到 JdbcTemplate这里。据我了解 JdbcTemplate还在内部管理事务,这也是在程序中完成的。
    那么 TransactionTemplate之间的基本区别是什么?和 JdbcTemplate ?

    最佳答案

    JdbcTemplate不是事务管理器。它只是 native JDBC 操作的辅助类:

    This is the central class in the JDBC core package. It simplifies the use of JDBC and helps to avoid common errors. It executes core JDBC workflow, leaving application code to provide SQL and extract results. This class executes SQL queries or updates, initiating iteration over ResultSets and catching JDBC exceptions and translating them to the generic, more informative exception hierarchy defined in the org.springframework.dao package.


    TransactionTemplate顺便说一句也不是事务管理器,它是一个

    Template class that simplifies programmatic transaction demarcation and transaction exception handling.


    PlatformTransactionManager (以及 AbstractPlatformTransactionManager 的其他子类) 是事务管理器 ,正如其中
  • 确定是否存在现有交易;
  • 应用适当的传播行为;
  • 必要时暂停和恢复交易;
  • 在提交时检查仅回滚标志;
  • 对回滚应用适当的修改(实际回滚或仅设置回滚);
  • 触发注册的同步回调(如果事务同步处于事件状态)。

  • 所以这个类负责实际的事务处理,而不是 TransactionTemplate ,如果您想以编程方式实现它而不是声明性事务处理,则将使用它。 (参见 this 博客,虽然已经过时,但您会看到声明式和手动式的区别)

    引自 Spring 3 Reference .

    注意:在整个 Spring Framework 中,您还会发现其他 *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()
    });

    }

    关于spring - TransactionTemplate 与 JdbcTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6558871/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com