11、整合MyBatis
MyBatis 整合 Spring ,实际上就是由 Spring 来完成 MyBatis 的工作
11.1、环境搭建
1、数据库和实体类
user表
User类
/**
* ID
*/
private long id;
/**
* 名称
*/
private String name;
/**
* 密码
*/
private String password;
2、导包
-
MyBatis
- MyBatis 框架:mybatis
- 数据库连接:mysql-connector-java
- Spring
- Spring 框架:spring-webmvc
- AOP:aspectjweaver
- 整合
- 整合框架:mybatis-spring
- Spring 操作数据库:spring-jdbc
- JUnit
<dependencies>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- 数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
<!-- MyBatis整合Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- Spring操作数据库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
11.2、MyBatis原生
先编写原生的 MyBatis,再用 MyBatis 整合 Spring 替代。
1、mybatis-config配置
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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
</configuration>
2、工具类
MyBatisUtils.java
用于构建 sqlSessionFactory 和 获取 SqlSession 实例。
public class MyBatisUtils {
static SqlSessionFactory sqlSessionFactory;
// 从XML中构建SqlSessionFactory
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取SqlSession实例
*
* @return SqlSession实例
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
3、Mapper
UserMapper
public interface UserMapper {
/**
* 查询所有用户
* @return 用户列表
*/
List<User> listUsers();
}
UserMapper.xml
放在 UserMapper 接口的同个包下,建议放在 resouces 目录下(若放在 Java 目录下要考虑 Maven 资源过滤问题)
<?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="indi.jaywee.mapper.UserMapper">
<select id="listUsers" resultType="user">
select * from mybatis.user
</select>
</mapper>
-
别名:pojo 要使用全限类名,如果要使用别名需要在配置文件中设置;
-
注册:Mapper.xml 需要在配置文件中注册。
<typeAliases> <package name="indi.jaywee.pojo"/> </typeAliases> <mappers> <package name="indi.jaywee.dao"/> </mappers>
4、测试
对 UserMapper 的测试类,可以理解为 Service 层。
因为 MVC 架构开发中,mapper 层(DAO)就是由 Service 层调用。
@Test
public void test(){
// 获取sqlSession
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 获取Mapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.listUsers();
for (User user : users) {
System.out.println(user);
}
}
11.3、MyBatis整合
MyBatis 整合 Spring ,实际上就是由 Spring 来完成 MyBatis 的工作
1、mybatis-spring配置
mybatis-spring.xml
专门用于Spring 配置 MyBatis 配置,相当于 MyBatis 中的工具类 + 配置文件。
- 数据源:在 MyBatis 中的 mybatis-config 设置;
-
sqlSessionFactory:在 MyBatis 中的工具类中构建;
- 绑定数据源:在 MyBatis 的工具类中通过流读取;
- 绑定 MyBatis 配置文件:导入 mybatis-config 的配置;
- 注册 Mapper :在 MyBatis 的 mybatis-config 中配置;
- 还可以配置其他 MyBatis 中的其他配置:别名、设置等等!
- sqlSessionTemplate:在 MyBatis 中的工具类中获得 sqlSession ;
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="密码"/>
</bean>
<!-- sqlSessionFactory
1、可以实现mybatis-config中所有的配置,取代mybatis-config的工作;
2、也可以绑定 mybatis-config ,二者同时存在
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 绑定数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 绑定MyBatis配置文件 -->
<property name="configLocation" value="mybatis-config.xml"/>
<!-- 注册Mapper-->
<property name="mapperLocations" value="indi/jaywee/mapper/*.xml"/>
</bean>
<!-- SqlSessionTemplate
类似MyBatis中的SqlSession,
没有setter,只能通过构造器注入
-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
</beans>
2、applicationContext配置
合并其他配置文件,作为Spring 总配置。
使用如下:
-
合并其他配置文件:导入的配置文件专门用于处理某项功能,分工明确。如整合 MyBatis,有关 MyBatis 的配置都在
mybatis-spring.xml
中完成; - 注册Bean:在 applicationContext 中注册 Bean,而导入
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="mybatis-spring.xml"/>
</beans>
3、Mapper接口实现类【!】
相比原生的 MyBatis ,需要添加接口实现类:使用 SqlSessionTemplate 获取 Mapper 接口并执行方法。
原因:在 MVC 三层架构中,Service 层调用 DAO 层方法, DAO 层要执行 SQL 语句,就必须先获得 SqlSession。
因此,需要创建一个类来获得 SqlSession,Service 层应专注于调用 DAO 层方法,所以这些工作应该在 DAO 层完成。因此需要添加这个接口实现类。
public class UserMapperImpl implements UserMapper{
/**
* SqlSessionTemplate:获取Mapper接口,执行方法
*/
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<User> listUsers() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.listUsers();
}
}
**注意:Spring 中的实体类,需要在配置文件中注册 Bean **
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="mybatis-spring.xml"/>
<!-- Mapper接口实现类 -->
<bean id="userMapperImpl" class="indi.jaywee.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSessionTemplate"/>
</bean>
</beans>
4、测试
对 UserMapper 的测试类,可以理解为 Service 层。
因为 MVC 架构开发中,mapper 层(DAO)就是由 Service 层调用。
@Test
public void testSpring() {
// 实例化容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取Bean
UserMapper userMapper = context.getBean("userMapperImpl", UserMapper.class);
List<User> users = userMapper.listUsers();
for (User user : users) {
System.out.println(user);
}
}