Spring两大核心思想:IoC和AOP
IoC:控制反转,Spring容器可以完成对象的创建,属性注入,对象管理等工作
AOP:面向切面,在不修改原有业务逻辑的情况下,数显对原有业务的增强
1.Spring可以对MyBatis提供哪些支持?
SpringIoC
需要创建数据源DataSource
SqlSessionFactory对象
SqlSession对象
DAO对象
Spring AOP
使用Spring提供的事务管理切面类,完成对MyBatis数据库操作中的事务管理
2.Spring整合MyBatis准备工作
2.1 创建Maven工程
2.2 部署MyBatis框架
1.添加依赖:MySQL驱动,mybatis
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
**2.创建mybatis-config文件(无需进行配置)
**
<?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>
2.3 部署Spring框架
添加依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.13.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.13.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
2.4 添加Spring整合MyBatis的依赖
mybatis-spring
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
3.Spring整合MyBatis整合配置
3.1 整合Druid连接池
添加依赖
Druid
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
创建druid.properties
druid.driver=com.mysql.jdbc.Driver
druid.url=jdbc:mysql://localhost:3306/db2?characterEncoding=utf-8
druid.username=
druid.password=
## 连接池参数
## 初始化连接数
druid.pool.init = 1
## 保留最小连接数
druid.pool.minIdle = 3
## 最大连接数
druid.pool.maxActive = 20
## 最多等待时间30000ms
druid.pool.timeout=30000
在applicationContext.xml中配置DruidDataSource
<!--加载druid.properties属性文件-->
<context:property-placeholder location="druid.properties"/>
<!--依赖Spring容器完成数据源DataSource的创建-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${druid.driver}"/>
<property name="url" value="${druid.url}"/>
<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>
3.2 整合MyBatis-创建SqlSessionFactory
依赖Spring容器创建MyBatis的SqlSessionFactory对象
<!--依赖Spring容器完成MyBatis的SqlSessionFactory对象的创建-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--配置数据源-->
<property name="dataSource" ref="dataSource"/>
<!--配置映射文件的配置-->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
<!--自动配置别名-->
<property name="typeAliasesPackage" value="com.lxr.bean"/>
<!--配置MyBatis主配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
3.3 整合MyBatis-创建Mapper
<!--加载DAO包中的所有接口,通过sqlSessionFactory获取SqlSession,然后创建所有的DAO接口对象,存储在Spring容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.lxr.dao"/>
</bean>
4.Spring整合MyBatis整合AOP配置
使用Spring提供的事务管理切面类 完成DAO中增删改操作事务管理
因为Spring是自动管理提交事务
isolation 设置事务的隔离级别READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE
SERIALIZABLE:串行化,T1在执行的过程中,T2既不能读也不能写
REPEATABLE_READ:可重复读,T1在执行的过程中,T2只能读,不能改,T2可以添加数据(幻读)
READ_COMMITTED:读已提交,T1在执行的过程中,T2可以读也可以写,但是T1只能读取到T2提交后的数据(幻读)(不可重复读)
READ_UNCOMMITTED:读未提交,T1在执行的过程中,T2既可以读也可以写,T1可以读取到T2未提交的数据(脏读)
propagation 设置事务的传播机制
调用这个方法怎么参与到之前的之前的事务中去,没有该怎么办
REQUIRED,SUPPORTS
REQUIRED:如果上层方法没有事务,则创建一个新的事务,如果已经存在事务,则加入到事务中
SUPPORTS:如果上层方法没有事务,则以非事务方式执行,如果已经存在事务,则加入到事务中
NESTED:如果上层方法没有事务,则创建一个新的事务,如果已经存在事务,则嵌套到当前事务中
REQUIRES_NEW:如果上层方法没有事务,则创建一个新的事务,如果已经存在事务,则将当前事务挂起
NOT_SUPPORTED:如果上层方法没有事务,则以非事务方式执行,如果已经存在事务,则将当前事务挂起
NEVER:如果上层方法没有事务,则以非事务方式执行,如果已经存在事务,则抛出异常
MANDATORY:如果上层方法已经存在事务,则加入到事务中执行,如果不存在事务则抛出异常
4.1 Spring AOP事务管理配置-XML配置
<!--1.将Spring提供的事务管理类配置给Spring容器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--2.通过Spring jdbc提供的tx标签,声明事务管理策略-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<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"/>
<tx:method name="query*" isolation="REPEATABLE_READ" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!--3.将事务管理策略以AOP配置 运用到DAO操作方法-->
<aop:config>
<aop:pointcut id="crud" expression="execution(* com.lxr.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="crud"/>
</aop:config>
4.2 Spring AOP事务管理配置-注解配置
在Spring进行事务管理的方法上添加 @Transactional 注解
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDAO userDAO;
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.SUPPORTS)
public List<User> listUsers(){
return userDAO.queryUsers();
}
}
applicationContext.xml中配置事务管理,声明使用注解配置
<!--1.将Spring提供的事务管理类配置给Spring容器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--2.声明使用注解完成事务配置-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>