本篇文章为你整理了Spring(十五):Spring整合MyBatis的两种方式()的详细内容,包含有 Spring(十五):Spring整合MyBatis的两种方式,希望能帮助你了解 Spring(十五):Spring整合MyBatis的两种方式。
在学习之前,我们先了解一个网站mybatis-spring,这是mybatis-spring整合的官方文档,里面有详细的教程,网址如下:
https://mybatis.org/spring/zh/index.html
一、什么是mybatis-spring
以下是mybatis-spring官方给出的介绍:
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和SqlSession并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
二、需要导入的包
dependencies
!-- https://mvnrepository.com/artifact/junit/junit --
dependency
groupId junit /groupId
artifactId junit /artifactId
version 4.13.2 /version
scope test /scope
/dependency
!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --
dependency
groupId org.springframework /groupId
artifactId spring-webmvc /artifactId
version 5.3.23 /version
/dependency
dependency
groupId org.aspectj /groupId
artifactId aspectjweaver /artifactId
version 1.9.9.1 /version
/dependency
!-- mysql驱动--
!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --
dependency
groupId mysql /groupId
artifactId mysql-connector-java /artifactId
version 8.0.30 /version
/dependency
!-- mybatis--
!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --
dependency
groupId org.mybatis /groupId
artifactId mybatis /artifactId
version 3.5.10 /version
/dependency
!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --
dependency
groupId org.mybatis /groupId
artifactId mybatis-spring /artifactId
version 2.0.7 /version
/dependency
!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --
dependency
groupId org.springframework /groupId
artifactId spring-jdbc /artifactId
version 5.3.23 /version
/dependency
/dependencies
三、方式一:SqlSessionTemplate
SqlSessionTemplate,官方文档中有这样一段说明:
SqlSessionTemplate是 MyBatis-Spring 的核心。作为SqlSession的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的SqlSession。SqlSessionTemplate是线程安全的,可以被多个 DAO 或映射器所共享使用。
当调用 SQL 方法时(包括由getMapper()方法返回的映射器中的方法),SqlSessionTemplate将会保证使用的SqlSession与当前 Spring 的事务相关。 此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的DataAccessExceptions。
由于模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用SqlSessionTemplate来替换 MyBatis 默认的DefaultSqlSession实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。
1.建立实体类User
package com.jms.pojo;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
public void setId(int id) {
this.id = id;
public String getUsername() {
return username;
public void setUsername(String username) {
this.username = username;
public String getPassword() {
return password;
public void setPassword(String password) {
this.password = password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username=" + username + \ +
", password=" + password + \ +
};
}
2.建立Mapper接口UserMapper
package com.jms.mapper;
import com.jms.pojo.User;
import java.util.List;
public interface UserMapper {
List User selectUsers();
}
3.建立Mapper.xml配置文件UserMapper.xml
?xml version="1.0" encoding="UTF-8" ?
!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
mapper namespace="com.jms.mapper.UserMapper"
select id="selectUsers" resultType="user"
select * from mybaties.user
/select
/mapper
4.建立MyBatis配置文件mybatis-config.xml
?xml version="1.0" encoding="UTF-8" ?
!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"
configuration
typeAliases
package name="com.jms.pojo"/
/typeAliases
/configuration
现在的MyBatis配置文件中我们只需要配置别名(typeAlias)和设置(set)的内容,至于愿意,在下面进行解释。
5.建立一个spring配置文件,用于配置MyBatis的内容
?xml version="1.0" encoding="UTF-8"?
beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"
数据源DataSource
使用Spring的数据源代替Mybatis的配置,Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource
bean id="dataSource"
property name="driverClassName" value="com.mysql.jdbc.Driver"/
property name="url" value="jdbc:mysql://localhost:3306/MyBaties?useSSL=true amp;useUnicode=true amp;characterEncoding=UTF-8"/
property name="username" value="root"/
property name="password" value="123456"/
/bean
!--SqlSessionFactor--
bean id="sqlSessionFactory"
property name="dataSource" ref="dataSource" /
!--绑定MyBatis配置文件--
property name="configLocation" value="mybatis-config.xml"/
property name="mapperLocations" value="classpath:com/jms/mapper/*.xml"/
/bean
!--SqlSessionTemplate:实现了SqlSession接口,具有SqlSession的功能--
bean id="sqlSessionTemplate"
constructor-arg index="0" ref="sqlSessionFactory"/
/bean
/beans
这里有三个Bean,一个是数据源,一个是工厂,一个是SqlSessionTemplate;SqlSessionTemplate实现了SqlSession接口,也是我们一会要用到的东西。
SqlSessionFactory,官方文档中有这样一段说明:
SqlSessionFactory有一个唯一的必要属性:用于 JDBC 的DataSource。这可以是任意的DataSource对象,它的配置方法和其它 Spring 数据库连接是一样的。
一个常用的属性是configLocation,它用来指定 MyBatis 的 XML 配置文件路径。它在需要修改 MyBatis 的基础配置非常有用。通常,基础配置指的是 settings 或 typeAliases 元素。
需要注意的是,这个配置文件并不需要是一个完整的 MyBatis 配置。确切地说,任何环境配置( environments ),数据源( DataSource )和 MyBatis 的事务管理器( transactionManager )都会被忽略。SqlSessionFactoryBean会创建它自有的 MyBatis 环境配置(Environment),并按要求设置自定义环境的值。
如果 MyBatis 在映射器类对应的路径下找不到与之相对应的映射器 XML 文件,那么也需要配置文件。这时有两种解决办法:第一种是手动在 MyBatis 的 XML 配置文件中的 mappers 部分中指定 XML 文件的类路径;第二种是设置工厂 bean 的mapperLocations属性。
也就是说我们仅需要在MyBatis的配置文件中配置别名或设置,其他都在SqlSessionFactory的Bean中进行配置即可。
6.建立一个实现类UserMapperImpl
实现UserMapper接口
package com.jms.mapper;
import com.jms.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
@Override
public List User selectUsers() {
UserMapper userMapper = sqlSessionTemplate.getMapper(UserMapper.class);
return userMapper.selectUsers();
}
可以看到,我们把原来SqlSession的操作封装到了一个实现类里,也就是说,此时我们只需要调用实现类的方法就可以调用需要的方法。
7.将实现类注入Bean
这里我们建立一个新的Spring配置文件applicationContext.xml,并且引用刚刚配置了Mybatis内容的配置文件
?xml version="1.0" encoding="UTF-8"?
beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"
import resource="spring-mybatis.xml"/
bean id="userMapperImpl"
property name="sqlSessionTemplate" ref="sqlSessionTemplate"/
/bean
/beans
8.测试
@Test
public void test01() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapperImpl userMapper = applicationContext.getBean("userMapperImpl", UserMapperImpl.class);
List User userList = userMapper.selectUsers();
for (User user : userList) System.out.println(user);
}
测试结果如下:
没有问题。
四、方式二:SqlSessionDaoSupport
官方文档说明如下:
SqlSessionDaoSupport是一个抽象的支持类,用来为你提供SqlSession。调用getSqlSession()方法你会得到一个SqlSessionTemplate。
在这个类里面,通常更倾向于使用MapperFactoryBean,因为它不需要额外的代码。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类,那么这个类就很有用了。
SqlSessionDaoSupport需要通过属性设置一个sqlSessionFactory或SqlSessionTemplate。如果两个属性都被设置了,那么SqlSessionFactory将被忽略。
前四步与方式一相同,我们直接从第五步开始:
5.配置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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"
数据源DataSource
使用Spring的数据源代替Mybatis的配置,Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource
bean id="dataSource"
property name="driverClassName" value="com.mysql.jdbc.Driver"/
property name="url" value="jdbc:mysql://localhost:3306/MyBaties?useSSL=true amp;useUnicode=true amp;characterEncoding=UTF-8"/
property name="username" value="root"/
property name="password" value="123456"/
/bean
!--SqlSessionFactor--
bean id="sqlSessionFactory"
property name="dataSource" ref="dataSource" /
!--绑定MyBatis配置文件--
property name="configLocation" value="mybatis-config.xml"/
property name="mapperLocations" value="classpath:com/jms/mapper/*.xml"/
/bean
/beans
此时我们不用再去注入SqlSessionTemplate,因为我们能通过getsession()方法直接获取。
6.建立一个实现类UserMapperImpl2
package com.jms.mapper;
import com.jms.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
@Override
public List User selectUsers() {
return getSqlSession().getMapper(UserMapper.class).selectUsers();
}
这个实现类需要继承SqlSessionDaoSupport抽象类
7.将实现类注入Bean
bean id="userMapperImpl2"
property name="sqlSessionFactory" ref="sqlSessionFactory"/
/bean
这里属性sqlSessionFactory和sqlSessionTemplate二选一即可,由于我们没有注入SqlSessionTemplate,所以这里选择工厂属性。
8.测试
@Test
public void test01() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapperImpl2 userMapper = applicationContext.getBean("userMapperImpl2", UserMapperImpl2.class);
List User userList = userMapper.selectUsers();
for (User user : userList) System.out.println(user);
}
测试结果:
没有问题
(本文仅作个人学习记录用,如有纰漏敬请指正)
以上就是Spring(十五):Spring整合MyBatis的两种方式()的详细内容,想要了解更多 Spring(十五):Spring整合MyBatis的两种方式的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。