Spring5学习随笔-整合MyBatis(持久层)、连接池、Mapper文件

发布时间 2023-11-20 23:21:10作者: 扬眉剑出鞘

学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】

Spring持久层整合 第一章、持久层整合

1.Spring框架为什么要与持久层技术进行整合

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

2.Spring可以与那些持久层技术进行整合?

  1. JDBC

    工具:JDBCTemplate

  2. Hibernate(JPA)

    工具:HibernateTemplate

  3. MyBatis

    工具:SqlSessionFactoryBean MapperScannerConfigure

第二章、Spring与MyBatis整合

本质:就是对MyBatis目前不满意的地方进行整合,从而让MyBatis开发变得更整洁

1.MyBatis开发步骤的回顾

  1. 实体
  2. 实体别名
  3. 建立表
  4. 创建DAO接口
  5. 实现Mapper文件
  6. 注册Mapper文件
  7. MybatisAPI调用

2.Mybatis在开发过程中存在的问题

  1. 配置繁琐(2.实体别名,6.注册Mapper文件) 代码冗余(7.API调用

3.Spring与Mybatis整合思路分析

4.Spring与Mybatis整合的开发步骤

  1. 配置文件(ApplicationContext.xml)进行相关配置

    **#配置 是只需要配置一次
    <!-- 连接池 四个参数 driverClassName、url、username、password、-->**
    <bean id="dataSource" class=""/>
    <!--创建SqlSessionFactory-->
    <bean id="ssfb" class="SqlSessionFactoryBean">
    		<property name="dataSource" ref=""/>
    		<property name="typeAliasesPackage">
    				**指定实体类所在的包 com.baizhi.entity**
    		</property>
    		<property name="mapperLocations">
    				**指定 配置文件的路径以及通用配置**
    				com.baizhi.mapper/*Mapper.xml
    		</property>
    </bena>
    
    <!--DAO接口的实现类
    		session--->session.getMapper() ---xxxDAO实现类对象
    		XXXDAO ---> xXXDAO
    -->
    <bean id="scanner" class="MapperScannerConfigure">
    		<property name="sqlSessionFactoryBeanName" value="ssfb"/>
    		<property name="basePackage">
    				**指定DAO接口放置的包 com.baizhi.dao**
    		</property>
    </bean>
    
  2. 编码

    实战经常根据需求 写的代码

    1. 实体
    2. 创建DAO接口
    3. 实现Mapper文件

5.Spring与Mybatis整合编码

  • 搭建开发环境(jar)

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.1.14.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.18</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    
  • Spring配置文件的配置

    <!--连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false&amp;allowPublicKeyRetrieval=true"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    <!-- 创建SqlSessionFactory SqlSessionFactoryBean-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.baizhi.entity"/>
        <property name="mapperLocations">
            <list>
                <value>classpath:com.baizhi.mapper/*Mapper.xml</value>
            </list>
        </property>
    </bean>
    <!--创建DAO对象 MapperScannerConfigure-->
    <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        <property name="basePackage" value="com.baizhi.dao"/>
    </bean>
    
  • 编码

    1. 编码
    2. DAO接口
    3. Mapper文件配置

6.Spring与Mybatis整合细节

  • 问题:Spring与Mybatis整合后,为什么DAO不提交事务,但是数据能够插入数据库中?

    Connection -—> tx

    Mybatis(Connection)

    本质上控制连接对象(Connection) —→连接池(DataSource)

    1. Mybatis提供的连接池对象 --→创建Connection

      Connection.setAutoCommit(false) 手工的控制了事务、操作完成后,手工提交

    2. Druid(C3P0) DBCP)作为连接池 —→创建Connection

      Druid保持自动控制事务,Connection.setAutoCommit的参数为true,一条sql 自动提交

    答案:因为Spring与Mybatis整合时,引入了外部连接池对象,保持自动的事务提交机制,不需要手工进行事务的操作也能自动提交。

    注意:未来实战中,还会手工控制事务(多条sql一起成功,一起失败),后续Spring通过事务控制解决这个问题。