Spring整合MyBatis

本文最后更新于:1 年前

Spring两大核心思想:IoC 和 AOP

  • IoC : 控制反转,Spring容器可以完成对象的创建、属性注入、对象管理等工作。

  • AOP : 面向切面,在不修改原有业务逻辑的情况下,实现原有业务的增强。

Spring可以对MyBatis提供哪些支持?

  • 『IoC支持』: SpringIoC可以为MyBatis完成DataSource、SqlSessionFactory、SqlSession以及DAO对象的创建。

  • 『AOP支持』: 使用Spring提供的事务管理切面类完成对MyBatis数据库操作中的事务管理。

Spring整合MyBatis环境

1. 创建Maven工程

2. 部署MyBatis框架

  1. 添加依赖

    • Mysql驱动
    • mybatis
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <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配置文件(创建配置文件之后无需进行任何配置)

    1
    2
    3
    4
    5
    6
    <?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>

3. 部署Spring框架

  1. 添加依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.13.RELEASE</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.2.13.RELEASE</version>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.13.RELEASE</version>
    </dependency>
  2. 创建Spring配置文件:applicationContext.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?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>

4. 添加Spring整合MyBatis的依赖

mybatis-spring就是mybatis提供的兼容Spring的补丁。

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>

整合IoC配置

1. 整合Druid连接池

  1. 添加druid的依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
    </dependency>
  2. 创建 druid.properties 属性文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    druid.driver=com.mysql.jdbc.Driver
    druid.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false
    druid.username=root
    druid.password=admin123

    ## 连接池参数
    druid.pool.init=1
    druid.pool.minIdle=3
    druid.pool.maxActive=20
    druid.pool.timeout=30000
  3. 在applicationContext.xml中配置DruidDataSource

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!--加载druid.properties属性文件-->
    <context:property-placeholder location="classpath:druid.properties"/>

    <!--依赖Spring容器完成数据源DataSource的创建-->
    <bean id="druidDataSource" 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>

2. 整合MyBatis—创建SqlSessionFactory

未整合Spring时手动创建过程

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

1
2
3
4
5
6
7
8
9
10
11
<!--依赖Spring容器完成MyBatis的SqlSessionFactory对象的创建-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!--配置数据源-->
<property name="dataSource" ref="druidDataSource"/>
<!--配置mapper文件的路径-->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"/>
<!--配置需要定义别名的实体类的包-->
<property name="typeAliasesPackage" value="cc.gaojie.pojo"/>
<!--可选:配置MyBatis的主配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

3. 整合MyBatis-创建Mapper

1
2
3
4
5
<!--加载dao包中的所有DAO接口,通过sqlSessionFactory获取SqlSession,然后创建所有的DAO接口对象,存储在Spring容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="cc.gaojie.dao"/>
</bean>

4. 案例测试

User.java
UserDao.java
UserMapper.xml
applicationContext.xml
UserDaoTest.java

UserService.java
UserServiceImpl.java
image-20220829120314687
applicationContext.xml
UserServiceTest.java

整合AOP配置

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

事务的隔离级别

isolation用于设置事务隔离级别:READ_UNCOMMITTED ,READ_COMMITTED , REPEATABLE_READ , SERIALIZABLE。

事务的传播机制

propagation设置事务的传播机制。

  • REQUIRED:如果上层方法没有事务,则创建一个新的事务;如果已经存在事务,则加入到事务中。

  • SUPPORTS:如果上层方法没有事务,则以非事务方式执行;如果已经存在事务,则加入到事务中。

  • REQUIRES_NEW:如果上层方法没有事务,则创建一个新的事务;如果已经存在事务,则将当前事务挂起。

  • NOT_SUPPORTED:如果上层方法没有事务,则以非事务方式执行;如果已经存在事务,则将当前事务挂起。

  • NEVER:如果上层方法没有事务,则以非事务方式执行;如果已经存在事务,则抛出异常。

  • MANDATORY:如果上层方法已经存在事务,则加入到事务中执行;如果不存在事务则抛出异常。

  • NESTED:如果上层方法没有事务,则创建一个新的事务;如果已经存在事务,则嵌套到当前事务中。

事务管理配置—XML配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!--1.将Spring提供的事务管理配置配置给Spring容器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"/>
</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(* cc.gaojie.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="crud"/>
</aop:config>

事务管理配置—注解配置

  1. 在applicationContext.xml中配置事务管理,声明使用注解方式进行事务配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!--使用注解进行事务管理前提是 IoC需要进行注解配置-->
    <context:annotation-config/>
    <context:component-scan base-package="cc.gaojie"/>

    <!--1.将Spring提供的事务管理配置配置给Spring容器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="druidDataSource"/>
    </bean>

    <!--2.声明使用注解完成事务配置-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
  2. 在需要Spring进行事务管理的方法上添加@Transactional注解

    1
    2
    3
    4
    @Transactional(isolation = Isolation.REPEATABLE_READ ,propagation = Propagation.SUPPORTS )
    public List<User> listUsers() {
    return userDAO.queryUsers();
    }