Spring与持久层整合【Spring学习笔记八】

176 阅读2分钟

1、持久层整合

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

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

1.2、Spring可以与哪些持久层技术进行整合?

1. JDBC
	|- JDBCTemplate
2. Hibernate
	|- HibernateTemplate
3. MyBatis
	|- SqlSessionFactoryBean MapperScannerConfigure

2、Spring与MyBatis整合

2.1、MyBatis开发步骤的回顾

1. 实体
2. 实体别名
3.4. 创建DAO接口
5. 实现Mapper文件
6. 注册Mapper文件
7. MyBatisAPI的调用

2.2、MyBatis在开发过程中存在问题

配置繁琐  代码冗余

1. 实体
2. 实体别名  配置繁琐
3.4. 创建DAO接口
5. 实现Mapper文件
6. 注册Mapper文件   配置繁琐
7. MyBatisAPI的调用   代码冗余

2.3、Spring与MyBatis整合思路分析

微信截图_20211106212737.png

2.4、Spring与MyBatis整合的开发步骤

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

    #配置 是需要配置⼀次
    <bean id="dataSource" class=""/>
    
    <!--创建SqlSessionFactory-->
    <bean id="ssfb" class="SqlSessionFactoryBean">
        <property name="dataSource" ref=""/>
        <property name="typeAliasesPackage">
            指定 实体类所在的包 com.baizhiedu.entity    User
    												Product
        </property>
        <property name="mapperLocations">
        	指定 配置⽂件(映射⽂件)的路径 还有通⽤配置
        	com.baizhiedu.mapper/*Mapper.xml
        </property>
    </bean>
    
    <!--DAO接⼝的实现类 session ---> session.getMapper() --- xxxDAO实现类对象 	XXXDAO ---> xXXDAO -->
    <bean id="scanner" class="MapperScannerConfigure">
        <property name="sqlSessionFactoryBeanName" value="ssfb"/>
        <property name="basePacakge">
        	指定 DAO接⼝放置的包 com.baizhiedu.dao
        </property>
    </bean>
    
  • 编码

    # 实战经常根据需求 写的代码
    1. 实体
    2.3. 创建DAO接口
    4. 实现Mapper文件
    

2.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>8.0.22</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.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT"/>
        <property name="username" value="root"/>
        <property name="password" value="889977"/>
    </bean>
    
    <!--创建SqlSessionFactory-->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="typeAliasesPackage" value="cn.edu.njtech.entity"></property>
        <property name="mapperLocations">
            <list>
                <value>classpath:mapper/*Mapper.xml</value>
            </list>
        </property>
    </bean>
    
    <!--创建DAO对象-->
    <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
    
        <property name="basePackage" value="cn.edu.njtech.dao"></property>
    </bean>
    
  • 编码

    1. 实体
    2.3. DAO接口
    4. Mapper文件配置
    

2.6、Spring与MyBatis整合细节

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

        Connection --> tx
        
        Mybatis(Connection)
        本质上控制连接对象(Connection) ---> 连接池(DataSource)
        
    1. Mybatis提供的连接池对象 ---> 创建Connection
    	Connection.setAutoCommit(false) ⼿⼯的控制了事务 , 操作完成后,⼿⼯提交
    	
    2. Druid(C3P0 DBCP)作为连接池 ---> 创建Connection
    	Connection.setAutoCommit(true) true默认值 保持⾃动控制事务,⼀条sql ⾃动提交
    	
    答案:因为Spring与Mybatis整合时,引⼊了外部连接池对象,保持⾃动的事务提交这个机制(Connection.setAutoCommit(true)),不需要⼿⼯进⾏事务的操作,也能进⾏事务的提交
    
    注意:未来实战中,还会⼿⼯控制事务(多条sql⼀起成功,⼀起失败),后续Spring通过事务控制解决这个问题。