12、整合 MyBatis
12.1 步骤:
- 导入相关 jar 包
- junit
- mybatis
- mysql 数据库
- spring 相关的
- aop 织入
- mybatis-spring
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring 操作数据库的话,还需要一个spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
注意:配置Maven静态资源过滤问题
<!--在 build 中配置resources,来防止资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 编写配置文件
- 代码实现
12.2 MyBatis 回顾
-
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> <!--<typeAlias type="com.song.pojo.User" alias="User"/>--> <package name="com.song.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=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <!--<mapper resource="com/song/mapper/UserMapper.xml"/>--> <mapper class="com.song.mapper.UserMapper"/> </mappers> </configuration>
-
编写实体类
@Data public class User { private int id; private String name; private String pwd; }
-
编写 UserMapper 接口
public interface UserMapper { public List<User> selectUser(); }
-
UserMapper 的配置文件 UserMapper.xml
<?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.song.mapper.UserMapper"> <select id="selectUser" resultType="user"> select * from mybatis.user </select> </mapper>
-
测试
@Test public void test1() throws IOException { String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = factory.openSession(true); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.selectUser(); for (User u : users){ System.out.println(u); } sqlSession.close(); }
12.3 MyBatis-Spring
MyBatis-Spring 简介:
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。
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+ |
整合方式一:
步骤:
-
引入 Spring 配置文件 spring-dao.xml【这个 xml 文件可以作为一个固定的模板使用】
-
编写数据源配置【取代 mybatis-config.xml 中的
】 -
编写sqlSessionFactory配置【取代 mybatisUtils.class 中 SqlSessionFactory 建立过程】
-
编写sqlSessionTemplate配置【也就是 MyBatis 中的 sqlSession 】
注意:sqlSessionTemplate 只能使用构造器注入 sqlSessionFactory,因为它没有 setter 方法
SqlSessionTemplate
是 MyBatis-Spring 的核心。作为SqlSession
的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的SqlSession
。SqlSessionTemplate
是线程安全的,可以被多个 DAO 或映射器所共享使用。<?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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--DataSource:使用 spring 的数据源替换 MyBatis 的配置 c3p0 druid--> <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=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <!--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/song/mapper/*.xml"/> </bean> <!-- org.mybatis.spring.SqlSessionTemplate:就是我们使用的sqlSession --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--只能使用构造器注入 sqlSessionFactory,因为它没有 set 方法--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> </beans>
-
需要给接口加实现类 UserMapperImpl
因为要把 UserMapper 注入到 Spring 容器中管理,但是 UserMapper 是一个接口,所以需要一个实现类,把这个实现类注入到 Spring 容器中。
public class UserMapperImpl implements UserMapper { // 原来所有的操作,都使用sqlSession来执行,现在都使用 SqlSessionTemplate private SqlSessionTemplate sqlSession; // 使用 set 注入 SqlSessionTemplate 对象 public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
-
将自己写的实现类 UserMapperImpl,注入到 Spring 中,applicationContext.xml 会通过
<import>
标签整合其他 Spring 的 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" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://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"> <import resource="spring-dao.xml"/> <bean id="userMapper" class="com.song.mapper.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean> </beans>
-
测试使用即可
@Test public void test2(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper userMapper = context.getBean("userMapper", UserMapper.class); List<User> users = userMapper.selectUser(); for (User u : users){ System.out.println(u); } }
注意:
MyBatis 的核心配置文件实际上都可以被 Spring 整合,但是通常会将取别名 <typeAliases>
和设置 <settings>
操作保留在核心配置文件中配置。
<?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>
<!--<typeAlias type="com.song.pojo.User" alias="User"/>-->
<package name="com.song.pojo"/>
</typeAliases>
<!--设置-->
<!--<settings>-->
<!--<setting name="" value=""/>-->
<!--</settings>-->
</configuration>
整合方式二
mybatis-spring 1.2.3 版本以上的才有这个。
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供SqlSession
。调用getSqlSession()
方法你会得到一个SqlSessionTemplate
,之后可以用于执行 SQL 方法。
也就是说,不用我们手动通过 sqlSessionFactory
来创建 SqlSessionTemplate
,SqlSessionDaoSupport
已经帮我们创建好了,我们只需要通过其中的 getSqlSession()
方法就可以拿到这个 SqlSessionTemplate
对象。比起方式一,不需要管理 SqlSessionTemplate,而且对事务的支持更加友好 。
SqlSessionDaoSupport
源码如下:
public abstract class SqlSessionDaoSupport extends DaoSupport {
private SqlSessionTemplate sqlSessionTemplate;
public SqlSessionDaoSupport() {
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (this.sqlSessionTemplate == null || sqlSessionFactory != this.sqlSessionTemplate.getSqlSessionFactory()) {
this.sqlSessionTemplate = this.createSqlSessionTemplate(sqlSessionFactory);
}
}
public SqlSession getSqlSession() {
return this.sqlSessionTemplate;
}
....
}
步骤:
-
修改整合方式一中的 UserDaoImpl,只需要继承
SqlSessionDaoSupport
,使用getSqlSession()
方法得到 sqlSession。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(); } }
-
修改 bean 配置文件 applicationContext.xml,注意,在这个 bean 中注入的是 sqlSessionFactory
<bean id="userMapper2" class="com.song.mapper.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
-
spring-dao.xml 中获取 sqlSession 的 bean 就可以不需要了
-
测试
@Test public void test2(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper userMapper = context.getBean("userMapper2", UserMapper.class); List<User> users = userMapper.selectUser(); for (User u : users){ System.out.println(u); } }
总结:
整合到 Spring 以后可以完全不要 MyBatis 的配置文件,除了这些方式可以实现整合之外,我们还可以使用注解来实现。