文章目录
整合Mybatis
01 Spring为什么要与持久层技术进行整合
- JavaEE开发需要持久层进行数据库的访问操作
- Mybatis进行持久开发过程中存在大量的代码冗余
- Spring基于模板设计模式对于上述持久层技术进行了封装
02 Mybatis的开发步骤
-
创建实体
-
在配置文件中对实体设置别名
-
建立数据库表
-
创建Dao接口
-
实现Mapper文件
-
注册Mapper文件
-
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 细节分析
- Spring与Mybatis整合之后,Mapper不提交事务,数据能够插入数据库中
- 因为Spring与Mybatis整合的时候,引入了外部连接池对象,保持自动的事务提交这个机制,不需要手工进行事务的操作,也能进行事务的提交。未来实战中,还是会手工控制事务(多条SQL) 一起成功,一起失败,后续Spring会通过事务控制解决这个问题