文章目录
Spring——整合Mybatis
整合就是将不同的框架放在一个项目中,共同使用它们的技术,发挥它们的优点,并形成互补。
在进行整合之前都要准备整合环境。导入相关jar包。
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<!--Spring操作数据库,还需要spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<!--aop织入依赖-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!--整合Mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
1、回顾Mybatis
-
搭建数据库
CREATE DATABASE `mybatis`; USE `mybatis`; CREATE TABLE `user`( `id` INT(20) NOT NULL PRIMARY KEY, `nema` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`)VALUES (1,'张三','123456'), (2,'李四','123457'), (3,'王五','123458')
-
编写实体类
@Data public class User { private int id; private String name; private String pwd; }
-
编写核心配置文件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.cheng.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="19990802"/> </dataSource> </environment> </environments> <mappers> <mapper class="com.cheng.dao.UserMapper"/> </mappers> </configuration>
-
编写接口
public interface UserMapper { public List<User> selectUser(); }
-
编写Mapper.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.cheng.dao.UserMapper"> <select id="selectUser" resultType="user"> select * from mybatis.user; </select> </mapper>
-
测试
@Test public void test() throws IOException { String resources = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resources); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sessionFactory.openSession(true); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.selectUser(); for (User user : userList) { System.out.println(user); } }
2、Mybatis-Spring
2.1、什么是Mybatis-Spring
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession
并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException
。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
MyBatis-Spring 需要以下版本:
MyBatis-Spring | MyBatis | Spring Framework | Spring Batch | Java |
---|---|---|---|---|
2.0 | 3.5+ | 5.0+ | 4.0+ | Java 8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java 6+ |
3、整合Mybatis两种方式
整合上面的Mybatis例子
3.1、方式一:SqlSessionFactoryBean
在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder
来创建 SqlSessionFactory
的。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean
来创建。
步骤1.创建SqlSessionFactory
SqlSessionFactory
有一个唯一的必要属性:用于 JDBC 的 DataSource
。
<!--定义一个数据源 使用spring的数据源替换mybatis的配置里的数据源,由spring来管理
这里使用spring提供的JDBC:org.springframework.jdbc.datasource
-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="19990802"/>
</bean>
<!--定义SqlSessionFactory
可使用 SqlSessionFactoryBean来创建SqlSessionFactory
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<!--绑定mybatis的配置文件-->
<!--configLocation:用来指定 MyBatis 的 XML 配置文件路径-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--注册mapper-->
<property name="mapperLocations" value="classpath:com/cheng/dao/*.xml"/>
</bean>
为什么可使用 SqlSessionFactoryBean来创建SqlSessionFactory:
- 这是因为
SqlSessionFactoryBean
实现了 Spring 的FactoryBean
接口。 这意味着由 Spring 最终创建的 bean 并不是SqlSessionFactoryBean
本身,而是工厂类(SqlSessionFactoryBean
)的 getObject() 方法的返回结果。这种情况下,Spring 将会在应用启动时为你创建SqlSessionFactory
,并使用sqlSessionFactory
这个名字存储起来。
步骤二:创建SqlSessionTemplate
-
SqlSessionTemplate
是 MyBatis-Spring 的核心。作为SqlSession
的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的SqlSession
。SqlSessionTemplate
是线程安全的,可以被多个 DAO 或映射器所共享使用。 -
整合前,我们所有的操作都是用sqlSession来执行,整合后用SqlSessionTemplate来执行
<!--SqlSessionTemplate就是我们是用的sqlSession 这里我们通过SqlSessionFactory得到了sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--因为SqlSessionTemplate没有set方法,所有用构造方法注入sqlSessionFactory-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
步骤三:编写接口的实现类
UserMapperImpl
package com.cheng.dao;
import com.cheng.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
//整合前,我们所有的操作都是用sqlSession来执行,整合后用SqlSessionTemplate来执行
private SqlSessionTemplate sqlSession;
//set方法把sqlSessionTemplate注入到spring容器中
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
步骤四:把实现类注入到spring中
<bean id="userMapperImpl" class="com.cheng.dao.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
步骤五:测试
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapperImpl = context.getBean("userMapperImpl", UserMapper.class);
List<User> userList = userMapperImpl.selectUser();
for (User user : userList) {
System.out.println(user);
}
}
3.2、方式二:SqlSessionDaoSupport
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供 SqlSession
。调用 getSqlSession()
方法你会得到一个 SqlSessionTemplate
,之后可以用于执行 SQL 方法。
步骤一:和方式一步骤一相同
步骤二:编写接口的实现类
UserMapperImpl2
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
public List<User> selectUser() {
SqlSession sqlSession = getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
//可以将上面三行代码简写成下面一行
//return getSqlSession().getMapper(UserMapper.class).selectUser();
}
}
步骤三:把实现类注入到spring中
<bean id="userMapperImpl2" class="com.cheng.dao.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
SqlSessionDaoSupport
需要通过属性设置一个 sqlSessionFactory
或 SqlSessionTemplate
。
步骤四:测试
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapperImpl = context.getBean("userMapperImpl2", UserMapper.class);
List<User> userList = userMapperImpl.selectUser();
for (User user : userList) {
System.out.println(user);
}
}