Spring整合MyBatis
一、Spring可以对MyBatis提供哪些支持?
IoC支持 SpringIoc可以为MyBatis完成DataSource、SqlSessionFactroy、SqlSession以及Dao对象的创建
AOP支持 使用Spring提供的事务管理切面类完成对Mybatis数据库操作中的事务管理
二、项目部署
2.1、部署Mybatis
依赖
<dependencies>
<!-- mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
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.2、部署spring框架
依赖
<!-- spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- aop依赖-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
</beans>
2.3、添加spring-mybatis依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
三、Spring整合Mybatis整合配置
3.1、整合Druid连接池
-
添加依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <!--springJDBC--> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.7.RELEASE</version> </dependency>
-
创建druid.propertise文件(前面的key是可以随便起名字的)
druid.driver=com.mysql.jdbc.Driver druid.url=jdbc:mysql://localhost:3306/student?characterEncoding=utf-8 druid.username=root druid.password=256793 ## 连接池参数 druid.pool.init=1; druid.pool.minIdle=3; druid.pool.maxActive=20; druid.pool.maxWait=30000;
-
在applicationContext.xml配置DruidDataSource
之前我们在mybatis-config配置druid连接池的参数,现在我们交给spring管理
注意我写的注释
<!--加载druid.properties配置文件 里面有druid的配置信息, spring容器需要给DruidDataSource对象的属性赋值--> <context:property-placeholder location="classpath:druid.properties"/> <!--把DruidDataSource类交给spring容器管理--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- 这些值都是从druid.properties配置文件拿的--> <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.initialSize}"/> <property name="minIdle" value="${druid.pool.minIdle}"/> <property name="maxActive" value="${druid.pool.maxActive}"/> <property name="maxWait" value="${druid.pool.maxWait}"/> </bean>
3.2、spring创建session
<!--在mybatis中sess互相sionFactory是需要mybatis-config配置文件的,因为配置文件有相应的属性,所以这里就对sessionFactory进行依赖注入--
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--对sessionFactory对象所需进行依赖注入-->
<!--数据源-->
<property name="dataSource" ref="druidDataSource"/>
<!--mapper映射文件-->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
<property name="typeAliasesPackage" value="com.xxp.bean"/>
<property name="configLocation" value="mybatis-config.xml"/>
</bean>
3.2、spring创建Dao接口对象
<!-- 让spring容器创建Dao接口的对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
<!-- value是dao包的路径-->
<property name="basePackage" value="com.xxp.dao"/>
</bean>
3.3、springAOP事务管理器配置
spring事务管理分为两种:
1、声明式事务
2、编程式事务
3.3.1、声明式事务
声明式事务分2种:
1.基于xml配置(不方便)
2.注解(推荐使用,比较灵活)
基于xml配置
配置事务管理器(基于xml配置)
<!--将事务管理器交给spring管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"/>
</bean>
配置事务的管理策略(基于xml配置)
参数isolation表示事务的隔离级别
参数propagation表示事务的传播特性
<!--通过spirng jdbc提供的tx来声明事务的管理策略-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--isolation事务的隔离级别 propagation事务的传播属性-->
<tx:attributes>
<tx:method name="insert*" isolation="READ_COMMITTED" propagation="REQUIRED"/>
<tx:method name="delete*" isolation="READ_COMMITTED" propagation="REQUIRED"/>
<tx:method name="update*" isolation="READ_COMMITTED" propagation="REQUIRED"/>
<tx:method name="query*" isolation="READ_COMMITTED" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
配置切点和切面(基于xml配置)
xpression="execution(* com.xxp.service..(…))"表示service层中的所以方法都为切点
<aop:config>
<aop:pointcut id="pointCut" expression="execution(* com.xxp.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
</aop:config>
缺点很明显,事务管理策略配置生效是有局限性的,service里面的方法的名字必须以insert*、delete*、update*、query*开头
基于注解配置
配置事务管理器(基于注解)
<!--将事务管理器交给spring管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"/>
</bean>
声明使用注解方式配置
<tx:annotation-driven transaction-manager="transactionManager"/>
之后在想要使用事务的方法上直接加上@Transactional注解就行
注意@Transactional的几个参数
参数isolation表示事务的隔离级别
参数propagation表示事务的传播特性
@Transactional
public int insert(Student student) {
return studentDao.insert();
}