Spring的事务配置+mybatis整合

Posted 牛牛最爱喝兽奶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring的事务配置+mybatis整合相关的知识,希望对你有一定的参考价值。

Spring的声明式事务和mybatis

Spring事务

首先事务(Transaction)是面向关系型数据库(RDBMS)企业应用程序的重要组成部分,用来确保数据的完整性和一致性。
事务具有以下 4 个特性,即原子性(要么都做要么都不做)、一致性(一致性状态转移)、隔离性(一个事务不受干扰,互不打扰)和持久性(事务提交之后对数据库修改是永久性的),这 4 个属性称为 ACID 特性。
spring对事务的管理有两种方式,一种基于编程式事务管理,通过编写代码实现事务管理。另一种基于AOP技术实现声明式事务。

编程式事务管理是通过编写代码实现的事务管理,灵活性高,但难以维护。

Spring 声明式事务管理在底层采用了 AOP 技术,其最大的优点在于无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。
PlatformTransactionManager、TransactionDefinition 和 TransactionStatus 是事务的 3 个核心接口。

重点介绍声明式事务:
1.基于XML方式声明式事务管理

<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
                <property name="driverClassName" value="$jdbc.driverClassName"/>
                <property name="url" value="$jdbc.url"/>
                <property name="password" value="$jdbc.password"/>
                <property name="username" value="$jdbc.name"/>
        </bean>

        <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
                <property name="dataSource" ref="dataSource"/>
        </bean>
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dataSource"/>
        </bean>
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
                <tx:attributes>
                        <tx:method name="upd*" propagation="SUPPORTS" read-only="true"/>
                        <tx:method name="ins*" read-only="true"/>
                </tx:attributes>
        </tx:advice>
                <aop:config>
                        <aop:aspect id="aspect" ref="proxy">
                                <aop:pointcut id="point" expression="execution(* com.xiaoliu.pojo.jdbctemplate.*.*(..))"/>
                                <aop:before method="before" pointcut-ref="point"/>
                                <aop:after method="after" pointcut-ref="point"/>
                                <aop:around method="around" pointcut-ref="point"/>
                        </aop:aspect>

                </aop:config>

        <bean class="com.xiaoliu.pojo.jdbctemplate.UserDao1" id="userDao1"/>
        <bean class="com.xiaoliu.pojo.jdbctemplate.UserProxy" id="proxy"/>

测试:

 public void test02()
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config-04.xml");
        UserDao1 user = applicationContext.getBean("userDao1",UserDao1.class);
        JdbcTemplate jdbcTemplate = applicationContext.getBean(JdbcTemplate.class);
       user.insert(jdbcTemplate);
    

在 Spring 中,声明式事务除了可以使用 XML 实现外,还可以使用 Annotation 注解。使用注解实现可以减少代码之间的耦合度。<tx:annotation-driven transaction-manager="txManager"/>在需要使用事务的业务类或者方法中添加注解 @Transactional,并配置 @Transactional 的参数。
propagation:设置事务的传播行为;
isolation:设置事务的隔离级别;
readOnly:设置是读写事务还是只读事务;
timeout:事务超时事件(单位:s)。

Isolation 属性用于设置事务的隔离级别:
DEFAULT 默认
READ_UNCOMMITED 读未提交, 可以出现 (脏读 不可重复读 幻度)
READ_COMMITED 读已提交 防止脏读,(不可重复读 幻读)
REPEATABLE_READ 可重复读 防止 脏读和不可重复读 (可能会出现幻读)
SERIALIZABLE 串行话 防止脏读 幻读 不可重复度

事务的传播行为

REQUIRED 默认值
如果当前有事务,就在事务中执行,如果当前没有事务,就新建一个事务
SUPPORTS
如果当前有事务 在事务中执行,如果当前没有事务,就在非事务状态下执行
MANDATORY
必须在事务内执行,如果当前有事务就在事务中执行,如果当前没有事务,则报错
Requires_new
必须在事务中执行,如果当前没有事务,要新建事务,如果当前有事务,则把当前事务挂起

NOT_Supported
必须在非事务下执行,如果当前没有事务就正常执行,如果当前有事务,将事务挂起

NEVER
必须在非事务状态下指向性,如果当前没有事务 则正常执行,如果有事务—报错
NESTED
必须在事务状态下执行,如果哦没有事务就新建事务,如果当前有事务,则创建一个嵌套事务。

spring整合mybatis

配置文件:

 <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="$jdbc.driverClassName"/>
        <property name="url" value="$jdbc.url"/>
        <property name="password" value="$jdbc.password"/>
        <property name="username" value="$jdbc.name"/>
    </bean>

    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    
   <bean name="userMapperPlus" class="org.mybatis.spring.mapper.MapperFactoryBean">
      <property name="mapperInterface" value="com.xiaoliu.mapper.UserMapperPlus"/>
       <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
   </bean>

mapper接口

public interface UserMapperPlus 
	 List<User> selectAll();
	 User selectByUsername(String username);
	 int insertUser(User record);
	  
	 int deleteByPrimaryKey(String id);
	 
	 int updateByPrimaryKey(User user);

mapper.xml

  <select id="selectByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">

    select
     *
    from user
    where username = #username,jdbcType=VARCHAR
  </select>

以上是关于Spring的事务配置+mybatis整合的主要内容,如果未能解决你的问题,请参考以下文章

spring整合mybatis是如何配置事务的?

Spring的事务配置+mybatis整合

Spring的事务配置+mybatis整合

spring整合mybatis配置 事务管理

MyBatis与Spring的整合

SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源配置 MyBatis事务控制druid 监控)