Spring整合MyBatis

6 篇文章 0 订阅
3 篇文章 0 订阅

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值