Spring整合mybatis
思想是跟使用mybatis一样的。
-
编写数据源
-
Spring注入sqlsessionFactory
-
Spring注入sqlSessionTemplate
-
需要给接口添加实现类
-
将实现类注入到Spring中
-
测试
-
官方文档:http://mybatis.org/spring/zh/index.html
-
需要用到的依赖:junit、mybatis、mysql-connection、spring-mvc(它包含了很多依赖包)、aspectjweaver、mybatis-spring,spring-jdbc
-
<dependencies> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.5</version> </dependency> </dependencies>
-
新建application.xml,导入mybatis的配置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" 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"> <import resource="spring-mybatis.xml"/> </beans>
-
编写spring-mybatis.xml,思路:
-
配置引用外部数据
-
注入数据源的bean,注意设置驱动
-
注入sqlSessionFactory的bean,注意绑定spring-mybatis.xml,绑定mapper(也可不绑定mapper)
-
<?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> <!--注意设置的顺序--> <!--引入外部配置文件--> <properties resource="db.properties"/> <!--mybatis设置--> <settings> <!--文档官网查看功能解释https://mybatis.org/mybatis-3/zh/configuration.html#settings--> <setting name="mapUnderscoreToCamelCase" value="false"/> <!--日志打印,可设置别的日志,参考官网文档--> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <!--可设置别名--> <typeAliases> <!--规定javaBean的别名,可在mapper.xml中直接使用别名--> <!-- <typeAlias type="pojo.User" alias="User"/>--> <!--自动扫描包,包下的javaBean自动设置别名,使用时使用类名的首字母小写即可,可用注解@Alis方式给Javabean起别名--> <package name="pojo"/> </typeAliases> </configuration>
-
注入sqlSession的Bean,注意SqlSessionTemplate的参数注入参数是用构造方法即注入sqlSessionFactory
-
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--导入外部数据库配置文件:多个文件使用逗号隔开,同属性名,取加载在最后的那个属性--> <context:property-placeholder location="classpath:db.properties"/> <!--使用spring的数据源替换mybatis的配置 c3p0 dbcp 使用Spring提供的jdbc:org.springframework.jdbc.dataSource.DriverManagerDataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbcDriver}"/> <property name="url" value="${jdbcUrl}"/> <property name="username" value="${jdbcUsername}"/> <property name="password" value="${jdbcPassword}"/> </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:dao/UserMapper.xml"/> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--注入sqlFactory,无set方法,查看SqlSessionTemplate原码--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> </beans>
-
给接口添加实现类,因为session要交给spring管理,要写个实现类注入spring,调用session,执行sql
-
//UserMapper接口
package dao;
import org.apache.ibatis.annotations.Param;
import pojo.User;
public interface UserMapper {
User getUserById(@Param("id") int id);
}
//UserMapper接口实现类
package dao;
import org.mybatis.spring.SqlSessionTemplate;
import pojo.User;
/**
* @Author: nsk
* @Description:
* @Date: create in 2021/4/14 20:46
*/
public class UserMapperImpl implements UserMapper{
//所有操作用session执行,现在使用sessionTemplate执行
private SqlSessionTemplate sessionTemplate;
//要在spring配置中生效注入,必须写set方法
public void setSessionTemplate(SqlSessionTemplate sessionTemplate) {
this.sessionTemplate = sessionTemplate;
}
public User getUserById(int id) {
UserMapper mapper = sessionTemplate.getMapper(UserMapper.class);
return mapper.getUserById(id);
}
}
```
-
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可以使用mybatis-config中的alis别名-->
<mapper namespace="dao.UserMapper">
<select id="getUserById" resultType="user">
select * from user where id = #{id}
</select>
</mapper>
```
-
applicationContext.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"
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">
<import resource="spring-mybatis.xml"/>
<!--spring要管理sqlSession,要写个实现类注入spring-->
<bean id="UserMapperImpl" class="dao.UserMapperImpl">
<property name="sessionTemplate" ref="sqlSession"/>
</bean>
</beans>
```
-
测试,因为我们是用spring管理,所以要先使用applicationContext.xml,使用里面的bean
-
@Test
public void getUser(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper mapper = context.getBean(UserMapperImpl.class);
User user = mapper.getUserById(2);
System.out.println(user);
}
```
更加简单的方法:使用mybatis提供的类
-
实现类使用继承的方式:
-
package dao; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.support.SqlSessionDaoSupport; import pojo.User; /** * @Author: nsk * @Description: * @Date: create in 2021/4/14 20:46 */ public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{ public User getUserById(int id) { return getSqlSession().getMapper(UserMapper.class).getUserById(id); } }
-
其实继承的这个类原码中跟我们上面的方法做了同样的事情,创建SqlSessionTemplate,然后调用
-
然后可以使用getSession()获取session
-
注意:如果使用这个方式的话,那在spring中注册UserMapperImpl2的bean的时候是使用set方法注入SqlSessionFactory的。因为我们本来要在实现类中注入session,但是我们使用这个方式,他使用了set设置SqlSessionFactory,所以我们要给实现类注入SqlSessionFactory
-
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <import resource="spring-mybatis.xml"/> <!--spring要管理sqlSession,要写个实现类注入spring--> <bean id="UserMapperImpl" class="dao.UserMapperImpl"> <property name="sessionTemplate" ref="sqlSession"/> </bean> <bean id="UserMapperImpl2" class="dao.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> </beans>
-
测试
@Test
public void getUser2(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper mapper = context.getBean(UserMapperImpl2.class);
User user = mapper.getUserById(2);
System.out.println(user);
}
```