Spring整合MyBatis
复习
Spring两大核心思想 :IOC和AOP
IOC:控制反转,Spring容器可以完成对象的创建、属性注入、对象管理等工作
AOP:面向切面,在不修改原有业务逻辑的情况下,实现原有业务的增强
Spring可以对Mybatis提供哪些支持
Spring IOC
- 数据源DataSource、 SqlSessionFactory、 SqlSession、 DAO等对象创建
Spring AOP - 使用Spring提供的事务管理切面类完成对MyBatis数据库操作中的事务管理
Spring整合MyBatis
- 创建Maven工程
部署MyBatis框架
- mysql驱动
- 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.properties
druid连接池配置属性列表
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();
}
}