一、Spring整合MyBatis
Spring的IoC和AOP如何为MyBatis提供便利?
1.1 Spring对MyBatis提供的支持
Spring 对象工厂(IoC)可以完成SqlSessionFactory、sqlSession 、Mapper对象的创建
Spring AOP思想可以完成MyBatis操作中的事务管理
1.2 Spring整合MyBatis配置—IoC支持
1.2.1 创建maven项目,完成MyBatis框架部署
-
添加依赖
<!-- MySQL数据库驱动jar --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- MyBatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
-
创建MyBatis核心配置文件(无需配置数据库连接信息,因为接下来连接的创建是由Spring对象工厂完成,配置工作由spring完成)
<?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>
1.2.2 在项目中部署Spring框架
-
添加依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.7.RELEASE</version> </dependency>
-
创建配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
1.2.3 MyBatis与Sping进行整合
-
mybatis-spring
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency>
-
通过spring容器完成数据源PooledDataSource、SqlSessionFactory(SqlSessionFactoryBean)、MapperScannerConfigurer实例的创建
-
在resources目录下创建jdbc.properties文件,并完成数据库连接信息的配置
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/db_bims jdbc.username=root jdbc.password=admin123
-
在Spring配置文件 applicationContext.xml中加载 jdbc.properties并创建数据源 DataSource对象
<!--加载属性文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--创建MyBatis数据源--> <bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
-
Spring配置文件 applicationContext.xml中配置,创建SqlSessionFactory对象
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--配置数据源--> <property name="dataSource" ref="dataSource"/> <!--配置映射文件--> <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"></property> <!--配置别名--> <property name="typeAliasesPackage" value="com.qfedu.pojo"/> <!--加载MyBatis主配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean>
-
Spring配置文件 applicationContext.xml中配置,创建MapperScannerConfigurer对象,用于完成DAO的扫描及对象的创建
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.qfedu.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean>
1.3 配置数据库连接池—Druid
1.3.1 添加druid依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
1.3.2 在resource目录创建druid的属性文件 druid.properties
druid.driver=com.mysql.jdbc.Driver
druid.url=jdbc:mysql://localhost:3306/db_bims
druid.username=root
druid.password=admin123
druid.pool.init=1
druid.pool.mindIdel=3
druid.pool.maxActive=20
druid.pool.maxWait=30000
1.3.3 在Spring配置文件加载druid.prperties,创建Druid的数据源对象
<context:property-placeholder location="classpath:druid.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
<!--配置基本的jdbc连接信息-->
<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.minIdel}"/>
<property name="maxActive" value="${druid.pool.maxActive}"/>
<property name="maxWait" value="${druid.pool.maxWait}"/>
<!-- timeBetweenEvictionRunsMillis : 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- minEvictableIdleTimeMillis : 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<!--testOnBorrow和testOnReturn 建议配置为TRUE,防止取到的连接不可用 -->
<!--testOnBorrow : 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能-->
<property name="testOnBorrow" value="true" />
<!--testOnReturn : 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能-->
<property name="testOnReturn" value="false" />
<!-- poolPreparedStatements : 打开PSCache -->
<property name="poolPreparedStatements" value="true" />
<!-- maxPoolPreparedStatementPerConnectionSize : 指定每个连接上PSCache的大小 -->
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- defaultAutoCommit : 这里配置提交方式,默认就是TRUE,可以不用配置 -->
<property name="defaultAutoCommit" value="true" />
</bean>
1.4 Spring整合MyBatis配置—AOP支持(声明式事务)
Spring AOP支持—事务管理
- 事务隔离级别的管理
- 事务传播机制的管理
1.4.1 将spring-jdbc提供的事务管理类(DataSourceTransactionManager)加载到Spring容器
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
1.4.2 配置事务管理策略
<!--定义事务管理策略-->
<tx:advice id="transactionAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="list*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
1.4.3 配置事务管理范围
<aop:config>
<aop:pointcut id="dao_pc" expression="execution(* com.qfedu.dao.*.*(..))"/>
<aop:advisor advice-ref="transactionAdvice" pointcut-ref="dao_pc"></aop:advisor>
</aop:config>
1.5 事务隔离级别
事务隔离级别
两个事务之间的相互影响程度
事务传播机制
方法调用者事务与当前方法事务的传播关系
SUPPORTS 如果不存在外部事务,则不开启事务;如果存在外部事务,则合并外外部事务中(适合查询操作)
REQUIRED 如果不存在外部事务,则开启新事务;如果存在外部事务,则合并外外部事务中(适合更新操作)
(请补充剩下的5种)
1.6 Spring整合MyBatis配置—AOP支持(注解式事务)
1.6.1 将spring-jdbc提供的事务管理类(DataSourceTransactionManager)加载到Spring容器
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
1.6.2 声明事务使用注解配置
<tx:annotation-driven transaction-manager="txManager"/>
1.6.3 在需要事务管理的方法上通过@Transactional
注解配置事务管理策略
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDAO bookDAO;
public void setBookDAO(BookDAO bookDAO) {
this.bookDAO = bookDAO;
}
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void addBook(Book book) {
int i = bookDAO.addBook(book);
System.out.println(i>0?"添加成功":"添加失败");
}
}