Spring学习笔记【十三】整合Mybatis

整合Mybatis

01 Spring为什么要与持久层技术进行整合

  1. JavaEE开发需要持久层进行数据库的访问操作
  2. Mybatis进行持久开发过程中存在大量的代码冗余
  3. Spring基于模板设计模式对于上述持久层技术进行了封装

02 Mybatis的开发步骤

  1. 创建实体

  2. 在配置文件中对实体设置别名

  3. 建立数据库表

  4. 创建Dao接口

  5. 实现Mapper文件

  6. 注册Mapper文件

  7. Mybatis中API的调用

    出现的问题:配置繁琐,代码冗余

03 相关信息


使用的技术是:ioc

能够把mybatis和spring集成到一起,像一个框架一样,是因为ioc能够创建对象,
可以把mybatis框架中的对象创建集成到spring中,交个spring统一进行管理,开发人员只需要面向一个spring就可以了


使用spring创建的对象
独立的数据库连接池对象,使用mybatis中的连接池开发效率是比较低的,使用阿里巴巴使用的durid连接SqlSessionFactory对象
创建出来的dao对象

04 基本使用步骤

4.1 搭建开发环境

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.13</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.9</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.6</version>
    </dependency>

4.2 Spring配置文件的配置

对下面的两行代码进行整合

 InputStream inputStream = Resources.getResourceAsStream("dao.xml");
 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  • 创建了SqlSessionFactory对象
    • 现在提供了SqlSessionFactoryBean对象,来取代SqlSessionFactory对象
    • 读取了Mybatis的主配置文件,现在使用属性注入的方式,取代读取Mybatis的主配置文件的过程
  • Mybatis的主配置文件,在主配置文件中主要进行了
    • 进行实体类的别名配置,取而代之的是dataSource对象
    • 数据库信息的配置,取而代之的是dataSource属性
    • Mapper文件的注册,取而代之的是mapperLocations属性,这个属性是一个Resource数组,使用list标签 进行注入
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
      <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
      <property name="url" value="jdbc:mysql://localhost:3306/chat?serverTimezone=UTC"></property>
      <property name="username" value="root"></property>
      <property name="password" value="123456"/>
   </bean>
   <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource"></property>
      <property name="typeAliasesPackage" value="com.spring.mybatis.model"/>
      <property name="mapperLocations">
         <list>
            <value>classpath:com.spring.mybatis.mapper/*Mapper.xml</value>
         </list>
      </property>
   </bean>

对下面两行代码进行优化:主要是获取Mapper对象

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  • 获取Mapper对象
    • 现在提供了MapperScannerConfigurer对象进行代替
    • 获取Mapper对象,首先是要获取SqlSession对象,使用sqlSessionFactoryBeanName属性
    • 获取Mapper对象的位置
<!--创建Mapper对象-->
   <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
      <property name="basePackage" value="com.spring.mybatis.Mapper"></property>
   </bean>

4.2 编码

只需要编写spring的配置文件和每个dao对应的mapper文件

不需要编写mybatis的主配置文件

  • spring配置文件
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
   <bean id="beanPostProcessorTest" class="com.spring.jdk.BeanPostProcessorTest"></bean>
   <bean id="userService" class="com.spring.jdk.UserServiceImpl"></bean>
   <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
      <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
      <property name="url" value="jdbc:mysql://localhost:3306/chat?serverTimezone=UTC"></property>
      <property name="username" value="root"></property>
      <property name="password" value="123456"/>
   </bean>
   <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource"></property>
      <property name="typeAliasesPackage" value="com.spring.mybatis.model"/>
      <property name="mapperLocations">
         <list>
            <value>classpath:com.spring.mybatis.mapper/*Mapper.xml</value>
         </list>
      </property>
   </bean>
   <!--创建Mapper对象-->
   <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
      <property name="basePackage" value="com.spring.mybatis.Mapper"></property>
   </bean>
</beans>
  • 获取Mapper对象
ApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext1.xml");
UserMapper userMapper = (UserMapper) ac.getBean("userMapper");

05 细节分析

  1. Spring与Mybatis整合之后,Mapper不提交事务,数据能够插入数据库中
  2. 因为Spring与Mybatis整合的时候,引入了外部连接池对象,保持自动的事务提交这个机制,不需要手工进行事务的操作,也能进行事务的提交。未来实战中,还是会手工控制事务(多条SQL) 一起成功,一起失败,后续Spring会通过事务控制解决这个问题
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佩奇inging

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值