十一、整合MyBatis
目录: 导入相关jar包、MyBatis代码编写、MyBatis-Spring
1.导入相关jar包
1)junit
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
2)mybatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
3)mysql-connector-java
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
4)spring相关
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.8</version>
</dependency>
5)aspectJ AOP织入器
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
6)mybatis-spring整合
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
7)配置Maven静态资源过滤问题
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2.MyBatis代码编写
1)编写pojo实体类
package com.ping.pojo;
public class User {
private int id;
private String name;
private String pwd;
}
2)实现mybatis的配置文件
<?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.ping.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=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/> <property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.ping.dao"/>
</mappers>
</configuration>
3)编写UserDao接口
public interface UserMapper {
public List<User> selectUser();
}
4)编写接口对应的Mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ping.dao.UserMapper">
<select id="selectUser" resultType="User">
select * from user
</select>
</mapper>
5)编写测试类
@Test
public void selectUser() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.selectUser();
for (User user: userList) {
System.out.println(user);
}
sqlSession.close();
}
3.MyBatis-Spring
引入Spring之前需要了解mybatis-spring包中的一些重要类。
mybatis-spring官网:http://www.mybatis.org/spring/zh/index.html
1)什么是 MyBatis-Spring?
MyBatis-Spring会将MyBatis代码无缝地整合到Spring中。
2)基础知识
在开始使用MyBatis-Spring之前,需要熟悉Spring和MyBati 这两个框架和有关它们的术语。
MyBatis-Spring需要以下版本:
MyBatis-Spring | MyBatis | Spring | Spring Batch | Java |
---|---|---|---|---|
2.0 | 3.5+ | 5.0+ | 4.0+ | Java 8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java 6+ |
如果使用Maven作为构建工具,仅需要在pom.xml中加入以下依赖即可。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
要和Spring一起使用 MyBatis,需要在Spring应用上下文中定义至少两样东西:一个SqlSessionFactory和至少一个数据映射器类。
在MyBatis-Spring中,可使用SqlSessionFactoryBean来创建SqlSessionFactory。 要配置这个工厂bean,只需要把下面代码放在Spring的XML配置文件中:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
注意:SqlSessionFactory需要一个DataSource(数据源)。 这可以是任意的DataSource ,只需要和配置其它Spring数据库连接一样配置它就可以了。
在基础的MyBatis用法中,是通过SqlSessionFactoryBuilder来创建SqlSessionFactory的。而在MyBatis-Spring中,则使用SqlSessionFactoryBean来创建。
在MyBatis中,可以使用SqlSessionFactory来创建SqlSession。一旦获得一个session之后,可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,可以关闭 session。
SqlSessionFactory有一个唯一的必要属性:用于JDBC的DataSource。这可以是任意的DataSource对象,它的配置方法和其它Spring数据库连接是一样的。
一个常用的属性是configLocation,它用来指定MyBatis的XML配置文件路径。它在需要修改MyBatis的基础配置非常有用。通常,基础配置指的是<settings>或<typeAliases>元素。
需要注意的是,这个配置文件并不需要是一个完整的MyBatis配置。确切地说,任何环境配置(<environments>),数据源(<DataSource>)和MyBatis的事务管理器
(<transactionManager>)都会被忽略。SqlSessionFactoryBean会创建它自有的MyBatis环境配置(Environment),并按要求设置自定义环境的值。
SqlSessionTemplate是MyBatis-Spring的核心。作为SqlSession的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的SqlSession。
模板可以参与到Spring的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,应该总是用SqlSessionTemplate来替换MyBatis默认的DefaultSqlSession实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。
可以使用SqlSessionFactory作为构造方法的参数来创建SqlSessionTemplate对象。
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
现在,这个bean就可以直接注入到DAO bean中了。需要在bean中添加一个SqlSession属性,就像下面这样:
public class UserDaoImpl implements UserDao {
private SqlSession sqlSession;
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public User getUser(String userId) {
return sqlSession.getMapper…;
}
}
按下面这样,注入SqlSessionTemplate:
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
<property name="sqlSession" ref="sqlSession" />
</bean>
3)第一种整合方式
① 引入Spring配置文件beans.xml。
<?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">
②配置数据源替换mybaits的数据源。
<!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
<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=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
③配置SqlSessionFactory,关联MyBatis。
<!--配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--关联Mybatis-->
<property name="configLocation" value="classpath:mybatis- config.xml"/>
<property name="mapperLocations" value="classpath:com/ping/dao/*.xml"/>
</bean>
④注册sqlSessionTemplate,关联sqlSessionFactory。
<!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--利用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
⑤增加Dao接口的实现类,私有化sqlSessionTemplate。
public class UserDaoImpl implements UserMapper {
//sqlSession不用自己创建了,Spring来管理
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
⑥注册bean实现。
<bean id="userDao" class="com.kuang.dao.UserDaoImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
⑦测试。
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserMapper mapper = (UserMapper) context.getBean("userDao");
List<User> user = mapper.selectUser();
System.out.println(user);
}
⑧结果成功输出,现在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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<configuration>
<typeAliases>
<package name="com.ping.pojo"/>
</typeAliases>
</configuration>
4)第二种整合方式
mybatis-spring1.2.3版以上才有。
Dao继承Support类,直接利用getSqlSession()获得,然后直接注入SqlSessionFactory。比起方式一,不需要管理SqlSessionTemplate,而且对事务的支持更加友好,可跟踪源码查看。
SqlSessionDaoSupport
SqlSessionDaoSupport是一个抽象的支持类,用来为你提供SqlSession。调用getSqlSession()方法会得到一个SqlSessionTemplate,之后可以用于执行SQL方法,就像下面这样:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User getUser(String userId) {
return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
}
}
在这个类里面,通常更倾向于使用MapperFactoryBean,因为它不需要额外的代码。但是,如果需要在DAO中做其它非MyBatis的工作或需要一个非抽象的实现类,那么这个类就很有用了。
SqlSessionDaoSupport需要通过属性设置一个sqlSessionFactory或SqlSessionTemplate。如果两个属性都被设置了,那么SqlSessionFactory将被忽略。
假设类UserMapperImpl是SqlSessionDaoSupport的子类,可以编写如下的Spring配置来执行设置:
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
①将写的UserDaoImpl修改一下。
public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
public List<User> selectUser() {
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
return mapper.selectUser();
}
}
②修改bean的配置。
<bean id="userDao" class="com.ping.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
③测试。
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserMapper mapper = (UserMapper) context.getBean("userDao");
List<User> user = mapper.selectUser();
System.out.println(user);
}
总结:整合到spring中以后可以完全不要mybatis的配置文件,除了这些方式可以实现整合之外,还可以使用注解来实现,等后面SpringBoot的时候还会测试整合。