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整合思路分析
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&characterEncoding=utf8&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通过事务控制解决这个问题。