环境搭建和依赖导入
Spring是支持无缝整合MyBatis的,首先需要导入依赖和搭建环境:
<dependencies><!--junit包--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><!--jdbc依赖--><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.1.10.RELEASE</version></dependency><!--spring需要的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.10.RELEASE</version></dependency><!--aspectJ AOP 织入器--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency><!--mybatis-spring整合包--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency></dependencies>
<!--配置Maven静态资源过滤问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
配置spring-dao.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">
<!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="wujiahao269139"/>
</bean>
<!--配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--连接数据源-->
<property name="dataSource" ref="dataSource"/>
<!--关联Mybatis配置文件,可以理解为引入mybatis-config.xml-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--注册映射器,即xxxMapper.xml,这一步无需再到mybatis-config.xml中注册
xxxMapper.xml-->
<property name="mapperLocations" value="classpath:com/wjh/dao/*.xml"/>
</bean>
<!--注册sqlSessionTemplate,相当于mybatis中的sqlSession 关联sqlSessionFactory-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!--利用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!--注册Bean-->
<bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
<!--给属性注入值-->
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
</beans>
可以看到spring-dao.xml的配置完成可以配置mybatis-config.xml文件,其实mybatis-confiig.xml配置文件可以完全不需要,但是为了体现mybatis,mybatis-confiig.xml文件通常用于配置settings和别名:
<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>
<settings>
<!-- 配置mybatis自动开启驼峰映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.wjh"/>
</typeAliases>
</configuration>
前面提到SqlSessionTemplate,在spring中,我们需要为dao接口写一个实现类,其中的一个属性就需要包含sqlSessionTemplate来进行数据的增删改查,而这个属性必须具有set方法来注入值,如:
package com.wjh.dao;
import com.wjh.po.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
/**
* @author wjh
* @date 2021/7/17 21:35
* @Package com.wjh.dao
*/
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSessionTemplate; //私有化
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
@Override
public List<User> listUser() {
UserMapper userMapper=sqlSessionTemplate.getMapper(UserMapper.class);
return userMapper.listUser();
}
}
配置解析
Spring要和MyBatis一起使用,需要在Spring上下文中定义至少两样东西:SqlSessionFactory和至少一个数据映射器类(是一个负责将数据库中的一行数据映射到一个对象的类,在mybatis-spring中使用SqlSessionTemplate)。
SqlSessionFactory配置
在mybatis-spring中使用SqlSessionFactoryBean来创建SqlSessionFactory,即上述配置的:
<!--配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--连接数据源-->
<property name="dataSource" ref="dataSource"/>
<!--关联Mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--注册映射器,即xxxMapper.xml-->
<property name="mapperLocations" value="classpath:com/wjh/dao/*.xml"/>
</bean>
首先,SqlSessionFactory需要一个数据源,这里就是上述配置的id为dataSource数据源:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="wujiahao269139"/>
</bean>
然后,如果mybatis-config.xml配置文件存在的话,我们还需要关联配置文件(configLocation属性),也就是:
<property name="configLocation" value="classpath:mybatis-config.xml"/>
如果mybatis的xxxMapper.xml文件也在改文件注册(使用mapperLocations属性),则:
<property name="mapperLocations" value="classpath:com/wjh/dao/*.xml"/>
上面的*.xml代表com.wjh.dao包下面的所有xml文件
SqlSessionTemplate配置
SqlSessionTemplate是无缝代替mybatis中的SqlSession的类,是mybatis-spring的核心类,它由SqlSessionFactory使用构造器注入完成注入:
<!--注册sqlSessionTemplate,相当于mybatis中的sqlSession 关联sqlSessionFactory-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!--利用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
最后就是需要注册接口的实现类了,而接口的实现需要注入SqlSessionTemplate属性,比如:
<!--注册Bean-->
<bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
<!--给属性注入值,即注入上面的sqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)-->
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
属性名是sqlSessionTemplate,注入的值是上面id为sqlSessionTemplate的Bean,然后就可以使用sqlSessionTemplate来进行增删改查:
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
@Override
public List<User> listUser() {
UserMapper userMapper=sqlSessionTemplate.getMapper(UserMapper.class);
return userMapper.listUser();
}
}
这就是spring-dao.xml的一些配置解析,用来配置mybatis-spring的使用,专注于持久层的配置,一般不用于其它配置,在spring的主配置文件导入spring-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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--导入spring-dao.xml-->
<import resource="spring-dao.xml"/>
<!--设置支持注解-->
<context:annotation-config/>
<!--设置扫描的包-->
<context:component-scan base-package="com.wjh"/>
</beans>
上述通过配置文件注入SqlSessionTemplate是一种方式,而mybatis-spring1.2.3版新增加了一种获取SqlSessionTemplate的方法:是dao接口的实现类继承SqlSessionDaoSupport类,直接使用其中的getSqlSession方法获取SqlSessionTemplate即可,这一的话配置文件需要作一定的修改:
<!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!--利用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!--注册Bean-->
<bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
<!--给属性注入值,即注入上面的sqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)-->
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
修改成:
<!--注册Bean-->
<bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
<!--sqlSessionTemplate属性变为sqlSessionFactory属性,注入SqlSessionTemplate的
实例对象变为注入SqlSessionFactory的实例对象-->
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
下面是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);
}
}
protected SqlSessionTemplate createSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
public final SqlSessionFactory getSqlSessionFactory() {
return this.sqlSessionTemplate != null ? this.sqlSessionTemplate.getSqlSessionFactory() : null;
}
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public SqlSession getSqlSession() {
return this.sqlSessionTemplate;
}
public SqlSessionTemplate getSqlSessionTemplate() {
return this.sqlSessionTemplate;
}
protected void checkDaoConfig() {
Assert.notNull(this.sqlSessionTemplate, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required");
}
}
