Spring foundation--declarative transaction control that comes with spring based on XML configuration

Earlier, we wrote the connection tool class and the transaction management tool class for transaction control. It is a bit troublesome to write by ourselves. Spring provides us with the transaction control class DataSourceTransactionManager, which saves us the steps of writing. At the same time, we use jdbcTemplate to perform CRUD operations. .
Custom transaction control: XML configuration transaction control
We need to import spring-tx coordinates on the original basis

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

Remove the two tool classes and modify the permanent layer implementation class to use jdbcTemplate to implement CRUD

Note: The JdbcDaoSupport class is inherited here, and we do not need to import jdbcTemplate to write sql statements directly using the method of the parent class.

public class AccountImpl extends JdbcDaoSupport implements IAccount {
    
    
    /*private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }*/

    @Override
    public Account selectById(int accountId) {
    
    
        List<Account> accounts = super.getJdbcTemplate().query("select *from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),accountId);
        return accounts.isEmpty()?null:accounts.get(0);
    }

    @Override
    public Account selectByName(String accountName) {
    
    
        List<Account> accounts = super.getJdbcTemplate().query("select *from account where name = ?",new BeanPropertyRowMapper<Account>(Account.class),accountName);
        if (accounts.isEmpty()) {
    
    
            return null;
        } else if (accounts.size()>1) {
    
    
            throw new RuntimeException("结果集不唯一");
        } else {
    
    
            return accounts.get(0);
        }
    }

    @Override
    public void updateByID(Account account) {
    
    
        super.getJdbcTemplate().update("update account set name = ?, money = ? where id = ?",account.getName(),account.getMoney(),account.getId());
    }
}

Bean.xml
transaction control configuration steps
1. Configure transaction manager
2. Configure transaction notification
At this point we need to import transaction constraints tx namespace and constraints, and also need aop
Use tx:advice tag to configure transaction notification
Attribute:
id: Give the transaction notification a unique identifier
transaction-manager: provide a transaction manager reference for the transaction notification
3. Configure the entry point expression of AOP
4. Establish the corresponding relationship between the transaction notification and the entry point expression
5. The attributes of the configuration transaction
are in Inside the transaction notification tx:advice tag

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 配置业务层 -->
    <bean id="accountService" class="org.example.service.impl.accountServiceImpl">
        <property name="accountI" ref="account"></property>
    </bean>

    <!-- 配置实体类 -->
    <bean id="account" class="org.example.dao.impl.AccountImpl">
<!--        <property name="jdbcTemplate" ref="jdbcTemplate"></property>-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://121.41.229.122:3306/spring"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>


    <!-- spring中基于XML的声明式事务控制配置步骤
     1,配置事务管理器
     2.配置事务的通知
            此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的
                使用tx:advice标签配置事务通知
                    属性:
                        id:给事务通知起一个唯一标识
                        transaction-manager:给事务通知提供一个事务管理器引用
     3.配置AOP的切入点表达式
     4.建立事务通知和切入点表达式的对应关系
     5、配置事务的属性
               是在事务的通知tx:advice标签的内部
     -->


    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 配置数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 配置事务的属性
                isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。
                propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。
                read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
                timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。
                rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。
                no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。
        -->
        <!-- 在给具体方法配置属性时,一个一个配置太麻烦,我们可以通过设置name属性的通配进行配置,
         增删改类方法一个属性,查询类方法一个属性,这就要求我们在给属性命名时要按规范命名-->
        <tx:attributes>
            <tx:method name="*" read-only="false" propagation="REQUIRED"/>
            <tx:method name="select*" read-only="true" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>

    <!-- 配置AOP -->
    <aop:config>
        <!-- 配置切入点表达式 -->
        <aop:pointcut id="pt1" expression="execution(* org.example.service.*.*(..))"/>
        <!-- 建立切入点表达式和事务通知的对应关系 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
    </aop:config>
</beans>

In this way, we can still achieve transaction control without writing tool classes.

Guess you like

Origin blog.csdn.net/qq_44660367/article/details/108772337