Spring整合MyBatis

一、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?"添加成功":"添加失败");
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值