学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】
Spring持久层整合 第一章、持久层整合
1.Spring框架为什么要与持久层技术进行整合
- JavaEE开发需要持久层进行数据库的访问操作。
- JDBC MyBatis、Hibernate进行持久开发过程存在大量的代码冗余
- Spring基于模板设计模式对与上述的持久层技术进行了封装
2.Spring可以与那些持久层技术进行整合?
-
JDBC
工具:JDBCTemplate
-
Hibernate(JPA)
工具:HibernateTemplate
-
MyBatis
工具:SqlSessionFactoryBean MapperScannerConfigure
第二章、Spring与MyBatis整合
本质:就是对MyBatis目前不满意的地方进行整合,从而让MyBatis开发变得更整洁
1.MyBatis开发步骤的回顾
- 实体
- 实体别名
- 建立表
- 创建DAO接口
- 实现Mapper文件
- 注册Mapper文件
- MybatisAPI调用
2.Mybatis在开发过程中存在的问题
- 配置繁琐(2.实体别名,6.注册Mapper文件) 代码冗余(7.API调用)
3.Spring与Mybatis整合思路分析
4.Spring与Mybatis整合的开发步骤
-
配置文件(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>
-
编码
实战经常根据需求 写的代码
- 实体
- 表
- 创建DAO接口
- 实现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&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>
-
编码
- 编码
- 表
- DAO接口
- Mapper文件配置
6.Spring与Mybatis整合细节
-
问题:Spring与Mybatis整合后,为什么DAO不提交事务,但是数据能够插入数据库中?
Connection -—> tx
Mybatis(Connection)
本质上控制连接对象(Connection) —→连接池(DataSource)
-
Mybatis提供的连接池对象 --→创建Connection
Connection.setAutoCommit(false) 手工的控制了事务、操作完成后,手工提交
-
Druid(C3P0) DBCP)作为连接池 —→创建Connection
Druid保持自动控制事务,Connection.setAutoCommit的参数为true,一条sql 自动提交
答案:因为Spring与Mybatis整合时,引入了外部连接池对象,保持自动的事务提交机制,不需要手工进行事务的操作也能自动提交。
注意:未来实战中,还会手工控制事务(多条sql一起成功,一起失败),后续Spring通过事务控制解决这个问题。
-