先引入相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<groupId>com.pss</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 设置项目UTF-8 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<springboot.version>2.1.4.RELEASE</springboot.version>
<java.version>1.8</java.version>
<mysql.version>5.1.34</mysql.version>
<mybatis.version>1.3.0</mybatis.version>
<druid.dbpool.version>1.1.10</druid.dbpool.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.dbpool.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</project>
在mybatis-spring-boot-starter中已经包含mybatis-spring的依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
mybatis-spring的官网:http://www.mybatis.org/spring/zh/index.html
什么是 MyBatis-Spring?
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
mybatis配置中mybatis-config.xml包含常用的environments(数据源)、settings(配置)、mappers(映射文件)。整合spring后mybatis-config.xml就不需要了。
1)数据源交给spring管理
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
// 省略数据源配置代码
return dataSource;
}
2)SqlSessionFactory使用spring管理
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
// 设置XML目录
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath*:mapper/*Mapper.xml");
factory.setMapperLocations(resources);
// 设置mybatis setting
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
factory.setConfiguration(configuration);
return factory.getObject();
}
3) application.xml 写上扫描包实例化@Bean。如果使用springboot启动类的方式就不需要这个文件了。
<?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:annotation-config/>
<context:component-scan base-package="com.pss"/>
</beans>
4)Mapper测试代码
package com.pss.mybatis_spring.dao;
import com.pss.mybatis_spring.model.SysUser;
import java.util.List;
public interface SysUserMapper {
List<SysUser> selectAll();
}
<?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.pss.mybatis_spring.dao.SysUserMapper">
<select id="selectAll" resultType="com.pss.mybatis_spring.model.SysUser">
select * from sys_user
</select>
</mapper>
5)测试
public class Application {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
SqlSessionFactory sqlSessionFactory = context.getBean("sqlSessionFactory", SqlSessionFactory.class);
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);
List<SysUser> sysUsers = mapper.selectAll();
System.out.println(sysUsers.size());
} finally {
if (null != sqlSession) {
sqlSession.close();
}
}
}
}
现在已经完成通过sqlSessionFactory使用mybatis了。在官网中发现以下说明:
使用 MyBatis API
使用 MyBatis-Spring,你可以继续直接使用 MyBatis 的 API。只需简单地使用 SqlSessionFactoryBean 在 Spring 中创建一个 SqlSessionFactory,然后按你的方式在代码中使用工厂即可。
public class UserDaoImpl implements UserDao {
// SqlSessionFactory 一般会由 SqlSessionDaoSupport 进行设置
private final SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public User getUser(String userId) {
// 注意对标准 MyBatis API 的使用 - 手工打开和关闭 session
try (SqlSession session = sqlSessionFactory.openSession()) {
return session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
}
}
}
小心使用此选项,错误地使用会产生运行时错误,更糟糕地,会产生数据一致性的问题。直接使用 API 时,注意以下弊端:
-
它不会参与到 Spring 的事务管理之中。
-
如果 SqlSession 使用与 Spring 事务管理器使用的相同 DataSource,并且有进行中的事务,代码将会抛出异常。
-
MyBatis 的 DefaultSqlSession 是线程不安全的。如果在 bean 中注入了它,将会发生错误。
-
使用 DefaultSqlSession 创建的映射器也不是线程安全的。如果你将它们注入到 bean 中,将会发生错误。
-
你必须确保总是在 finally 块中来关闭 SqlSession。
接下来不直接使用sqlSession,如果直接getBean("sysUserMapper") 会提示找不到Bean。我找了mybatis官方文档看了一下。通过使用MapperFactoryBean注入参数就可以实现,方法的确可行只是每个都要声明太累了。
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
后面又在 mybatis-spring的文档中看到解决方案:
@MapperScan
当你正在使用 Spring 的基于 Java 的配置时(也就是 @Configuration),相比于使用 <mybatis:scan/>,你会更喜欢用 @MapperScan。
@MapperScan 注解的使用方法如下:
@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {
// ...
}
这个注解具有与之前见过的 <mybatis:scan/> 元素一样的工作方式。它也可以通过 markerInterface 和 annotationClass 属性设置标记接口或注解类。通过配置 sqlSessionFactory 和 sqlSessionTemplate 属性,你还能指定一个 SqlSessionFactory 或 SqlSessionTemplate。
加上扫描mapper的注解后再次测试
SysUserMapper sysUserMapper = context.getBean("sysUserMapper", SysUserMapper.class);
List<SysUser> sysUsers = sysUserMapper.selectAll();
System.out.println(sysUsers.size());
日志如下:
16:38:38.299 [main] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [com.mysql.jdbc.JDBC4Connection@59221b97] will not be managed by Spring
16:38:38.303 [main] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - ==> Preparing: select * from sys_user
16:38:38.324 [main] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - ==> Parameters:
16:38:38.712 [main] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - <== Total: 1850
16:38:38.713 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@716a7124]
处理完后,sqlSession也自动关闭了。