SSM复习-Spring整合MyBatis

复习

Spring两大核心思想 :IOC和AOP
IOC:控制反转,Spring容器可以完成对象的创建、属性注入、对象管理等工作
AOP:面向切面,在不修改原有业务逻辑的情况下,实现原有业务的增强

Spring可以对Mybatis提供哪些支持

Spring IOC

  • 数据源DataSource、 SqlSessionFactory、 SqlSession、 DAO等对象创建
    Spring AOP
  • 使用Spring提供的事务管理切面类完成对MyBatis数据库操作中的事务管理

Spring整合MyBatis

  • 创建Maven工程

部署MyBatis框架

  1. mysql驱动
  2. mybatis
<dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
    </dependencies>
  • 创建MyBatis配置文件
    创建配置文件之后无需进行任何配置
    mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>

部署Spring框架

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.19.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.19.RELEASE</version>
        </dependency>
         <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>

Spring配置文件

applicationContext.xml

<?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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

    
</beans>

添加Spring整合MyBatis依赖

  • mybatis-spring就是mybatis提供的兼容Spring的补丁
 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

Spring整合MyBatis配置

整合druid连接池

  • 添加druid的依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
druid.driver=com.mysql.cj.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
druid.username=root
druid.password=root
## 连接池参数
# 初始化连接池个数
druid.pool.init=3
# 最少空闲连接数
druid.pool.minIdle=5
# 最大激活数
druid.pool.maxActive=20
# 超时时间
druid.pool.timeout=30000

  • 在applicationContext.xml中配置DruidDataSource
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--加载druid.properties属性文件-->
    <context:property-placeholder location="druid.properties"/>
    <!--依赖Spring容器完成数据源DataSource的配置-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${druid.url}"/>
        <property name="driverClassName" value="${druid.driver}"/>
        <property name="username" value="${druid.username}"/>
        <property name="password" value="${druid.password}"/>

        <property name="initialSize" value="${druid.pool.init}"/>
        <property name="minIdle" value="${druid.pool.minIdle}"/>
        <property name="maxActive" value="${druid.pool.maxActive}"/>
        <property name="maxWait" value="${druid.pool.timeout}"/>
    </bean>

</beans>

整合MyBatis-创建SqlSessionFactory

依赖Spring容器创建MyBatis的SqlSessionFactory对象

<!--依赖Spring容器完成SqlSessionFactory的配置-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--数据源配置-->
 <property name="dataSource" ref="dataSource"/>
        <!--mapper映射文件的位置-->
 <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
        <!--可选:实体类所在包类型别名-->
 <property name="typeAliasesPackage" value="com.qfedu.pojo"/>
        <!--可选:配置mybats主配置文件,解决二级缓存等自定义配置,-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
  • 创建表
create table users(
user_id int primary key auto_increment,
user_name varchar(20) not null unique,
user_pwd varchar(20) not null,
user_realname varchar(20) not null,
user_img varchar(100) not null
);

整合mybatis创建Mapper

applicationContext.xml中配置Mapper扫描所在的包

    <!--加载mapper包中的所有Mapper接口,通过sqlSessionFactory获取sqlSession,
    然后创建所有的Mapper接口对象,存储在Spring容器
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.qfedu.mapper"/>
    </bean>

测试

  • 创建数据库中的表
create table users(
user_id int primary key auto_increment,
user_name varchar(20) not null unique,
user_pwd varchar(20) not null,
user_realname varchar(20) not null,
user_img varchar(100) not null
);
  • 创建实体类
package com.qfedu.pojo;

import lombok.Data;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/12 23:14
 * @Description
 */
@Data
public class User {
    private int userId;
    private String userName;
    private String userPwd;
    private String realName;
    private String userImg;
}

  • 创建Mapper
package com.qfedu.mapper;

import com.qfedu.pojo.User;

import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/12 23:17
 * @Description
 */
public interface UserMapper {
    public List<User>listUser();
}
  • 创建Mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qfedu.mapper.UserMapper">
    <select id="listUser" resultType="User">
        SELECT
            user_id AS userId,
            user_name AS userName,
            user_pwd AS userPwd,
            user_realname AS realName,
            user_img AS userImg
        FROM
            users
    </select>
</mapper>
  • 单元测试
package com.qfedu.mapper;
import com.qfedu.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/13 7:45
 * @Description
 */
public class UserMapperTest {

    @Test
    public void listUser() {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper=context.getBean("userMapper",UserMapper.class);
        userMapper.listUser().forEach(System.out::println);
    }
}
  • 测试结果
    在这里插入图片描述

整合mybatis使用示例

  • maven依赖
   <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.19.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.19.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
  • mybatis主配置文件 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
  • 数据库连接池配置文件 druid.properties
druid.driver=com.mysql.cj.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
druid.username=root
druid.password=root
## 连接池参数
# 初始化连接池个数
druid.pool.init=3
# 最少空闲连接数
druid.pool.minIdle=5
# 最大激活数
druid.pool.maxActive=20
# 超时时间
druid.pool.timeout=30000

  • spring配置文件 applicationContext.xml
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--添加组件扫描-->
    <context:annotation-config/>
    <context:component-scan base-package="com.qfedu.service"/>
    <!--加载druid.properties属性文件-->
    <context:property-placeholder location="druid.properties"/>
    <!--依赖Spring容器完成数据源DataSource的配置-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${druid.url}"/>
        <property name="driverClassName" value="${druid.driver}"/>
        <property name="username" value="${druid.username}"/>
        <property name="password" value="${druid.password}"/>

        <property name="initialSize" value="${druid.pool.init}"/>
        <property name="minIdle" value="${druid.pool.minIdle}"/>
        <property name="maxActive" value="${druid.pool.maxActive}"/>
        <property name="maxWait" value="${druid.pool.timeout}"/>
    </bean>
    <!--依赖Spring容器完成SqlSessionFactory的配置-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <!--数据源配置-->
        <property name="dataSource" ref="dataSource"/>
        <!--mapper映射文件的位置-->
        <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
        <!--可选:实体类所在包类型别名-->
        <property name="typeAliasesPackage" value="com.qfedu.pojo"/>
        <!--可选:配置mybats主配置文件,解决二级缓存等自定义配置,-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!--加载mapper包中的所有Mapper接口,通过sqlSessionFactory获取sqlSession,
    然后创建所有的Mapper接口对象,存储在Spring容器
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.qfedu.mapper"/>
    </bean>
</beans>
  • 实体类
package com.qfedu.pojo;

import lombok.Data;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/12 23:14
 * @Description
 */
@Data
public class User {
    private int userId;
    private String userName;
    private String userPwd;
    private String realName;
    private String userImg;
}
  • Mapper类 UserMapper.java
package com.qfedu.mapper;

import com.qfedu.pojo.User;

import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/12 23:17
 * @Description
 */
public interface UserMapper {
    public List<User>listUser();
}

  • Mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qfedu.mapper.UserMapper">
    <select id="listUser" resultType="User">
        SELECT
            user_id AS userId,
            user_name AS userName,
            user_pwd AS userPwd,
            user_realname AS realName,
            user_img AS userImg
        FROM
            users
    </select>
</mapper>
  • service接口
package com.qfedu.service;

import com.qfedu.pojo.User;

import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/13 21:49
 * @Description
 */
public interface UserService {
    List<User> listUser();
}

  • service实现类
package com.qfedu.service.impl;

import com.qfedu.mapper.UserMapper;
import com.qfedu.pojo.User;
import com.qfedu.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/13 21:49
 * @Description
 */
@Service(value = "userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public List<User>listUser(){
        return userMapper.listUser();
    }
}

  • 单元测试
package com.qfedu.mapper;
import com.qfedu.pojo.User;
import com.qfedu.service.UserService;
import com.qfedu.service.impl.UserServiceImpl;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/13 7:45
 * @Description
 */
public class UserMapperTest {

    @Test
    public void listUser() {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper=context.getBean("userMapper",UserMapper.class);
        userMapper.listUser().forEach(System.out::println);
    }
    @Test
    public void list(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserServiceImpl userService=context.getBean("userService", UserServiceImpl.class);
        userService.listUser().forEach(System.out::println);
    }
}

Spring整合MyBatis整合AOP配置

使用Spring提供的事务管理切面类,完成DAO中增删改查操作的事务管理

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--添加组件扫描-->
    <context:annotation-config/>
    <context:component-scan base-package="com.qfedu.service"/>
    <!--加载druid.properties属性文件-->
    <context:property-placeholder location="druid.properties"/>
    <!--依赖Spring容器完成数据源DataSource的配置-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${druid.url}"/>
        <property name="driverClassName" value="${druid.driver}"/>
        <property name="username" value="${druid.username}"/>
        <property name="password" value="${druid.password}"/>

        <property name="initialSize" value="${druid.pool.init}"/>
        <property name="minIdle" value="${druid.pool.minIdle}"/>
        <property name="maxActive" value="${druid.pool.maxActive}"/>
        <property name="maxWait" value="${druid.pool.timeout}"/>
    </bean>
    <!--依赖Spring容器完成SqlSessionFactory的配置-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <!--数据源配置-->
        <property name="dataSource" ref="dataSource"/>
        <!--mapper映射文件的位置-->
        <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
        <!--可选:实体类所在包类型别名-->
        <property name="typeAliasesPackage" value="com.qfedu.pojo"/>
        <!--可选:配置mybats主配置文件,解决二级缓存等自定义配置,-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!--加载mapper包中的所有Mapper接口,通过sqlSessionFactory获取sqlSession,
    然后创建所有的Mapper接口对象,存储在Spring容器
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.qfedu.mapper"/>
    </bean>
    <!--将Spring提供的事务管理配置给Spring容器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--配置数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--通过Spring jdbc提供的tx标签,声明事务管理策略-->
    <tx:advice transaction-manager="transactionManager" id="txAdvice">
        <tx:attributes>
            <!--insert开头的方法,isolation(事务隔离级别):REPEATABLE_READ(可重复读)
            propagation(事务传播机制):REQUIRED(支持当前事务)
            -->
            <tx:method name="insert*" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
            <!--
            list开头的方法,isolation(事务隔离级别):REPEATABLE_READ(可重复读)
            propagation(事务传播机制):SUPPORTS(支持当前事务,如果当前没有事务,就以非事务方式执行)
            -->
            <tx:method name="query*" isolation="REPEATABLE_READ" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
</beans>

在这里插入图片描述
单元测试

package com.qfedu.mapper;


import com.qfedu.pojo.User;
import com.qfedu.service.UserService;
import com.qfedu.service.impl.UserServiceImpl;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/13 7:45
 * @Description
 */
public class UserMapperTest {
    @Test
    public void list(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserServiceImpl userService=context.getBean("userService", UserServiceImpl.class);
        userService.queryUser().forEach(System.out::println);
    }
}

测试结果
在这里插入图片描述

事务隔离级别

isolation:

  • READ_UNCOMMITTED(读未提交)
  • READ_COMMITTED(读已提交,不可重复读)
  • REPEATABLE_READ(可重复读,工作中推荐这种事务隔离级别)
  • SERIALIZABLE(串行化)
    在这里插入图片描述

事务传播机制

propagation

  • REQUIRED: 如果上层方法没有事务,则创建一个新的事务;如果已经存在事务,则加入到事务中
  • SUPPORTS 如果上层没有事务,则以非事务方式执行;如果已经存在事务,则加入到事务中。
  • MANDATORY:如果上层方法已经存在事务,则加入到事务中执行。如果不存在事务则抛出异常。
  • REQUIRES_NEW:如果上层方法没有事务,则创建一个新的事务;如果已经存在事务,则将事务挂起。
  • NOT_SUPPORTED:如果上层方法没有事务,则以非事务方式执行;如果已经存在事务,则将当前事务挂起。
  • NEVER:如果上层方法没有事务,则以非事务方式执行;如果已经存在事务,则抛出异常。
  • NESTED:如果上层方法没有事务,则创建一个新的事务;如果已经存在事务,则嵌套到当前事务中。

Spring AOP事务管理配置(基于XML)

applicationContext.xml

   <!--将Spring提供的事务管理配置给Spring容器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--配置数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--通过Spring jdbc提供的tx标签,声明事务管理策略-->
    <tx:advice transaction-manager="transactionManager" id="txAdvice">
        <tx:attributes>
            <!--insert开头的方法,isolation(事务隔离级别):REPEATABLE_READ(可重复读)
            propagation(事务传播机制):REQUIRED(支持当前事务)
            -->
            <tx:method name="insert*" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
            <tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
            <tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
            <!--
            list开头的方法,isolation(事务隔离级别):REPEATABLE_READ(可重复读)
            propagation(事务传播机制):SUPPORTS(支持当前事务,如果当前没有事务,就以非事务方式执行)
            -->
            <tx:method name="query*" isolation="REPEATABLE_READ" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
    <!--将事务管理策略以AOP配置,应用于DAO操作方法 -->
        <aop:pointcut id="crud" expression="execution(* com.qfedu.service.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="crud"/>
    </aop:config>

Spring AOP事务管理配置(基于注解)

  • 配置事务管理,声明使用注解方式进行事务配置
    applicationContext.xml
    <!--加载druid.properties属性文件-->
    <context:property-placeholder location="druid.properties"/>
    <!--依赖Spring容器完成数据源DataSource的配置-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${druid.url}"/>
        <property name="driverClassName" value="${druid.driver}"/>
        <property name="username" value="${druid.username}"/>
        <property name="password" value="${druid.password}"/>

        <property name="initialSize" value="${druid.pool.init}"/>
        <property name="minIdle" value="${druid.pool.minIdle}"/>
        <property name="maxActive" value="${druid.pool.maxActive}"/>
        <property name="maxWait" value="${druid.pool.timeout}"/>
    </bean>
   <!--将Spring提供的事务管理配置给Spring容器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--配置数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--声明使用注解完成事务配置-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
  • 在需要Spring进行事务管理的方法上添加注解@Transactional
package com.qfedu.service.impl;

import com.qfedu.mapper.UserMapper;
import com.qfedu.pojo.User;
import com.qfedu.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2022/1/13 21:49
 * @Description
 */
@Service(value = "userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Transactional
    @Override
    public List<User>listUser(){
        return userMapper.queryUser();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值