Spring与MyBatis的整合是一种常用的组合,可以有效地结合Spring的依赖注入和事务管理功能与MyBatis的持久层框架进行整合。
思路分析
我们在学习Mybatis的独立开发时是这样的
其中并没有引入Spring来进行ioc管理,均由Mybatis管理,现在我们要整合Spring-Mybatis,那么首先就要分清楚哪些该交由Spring管理,哪些交由Mybatis管理。
Mybatis核心代码
@Test
public void testGetAllEmp() throws IOException {
//加载核心配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//实例化SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory factory = factoryBuilder.build(reader);
//创建SqlSession
SqlSession sqlSession = factory.openSession();
//获取mapper
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> empList = mapper.getAllEmp();
empList.forEach(System.out::println);
sqlSession.close();
}
在这一套代码中,我们用到的SqlSession是由Factory生成的,我们只需要拿过来使用即可,其最核心的对象是SqlSessionFactory
我们再来分析Myabatis的配置文件
其中初始化映射配置,也就是Mappers标签中是随着业务的变化而变化的,其他的都是SqlSessionFactory的配置信息,包括数据库连接信息,配置数据源等。因此我们得出结论Mybatis应该管理SqlSessionFactory。
引入依赖
<dependencies>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.9</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- MySql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- spring持久化层jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.0.9</version>
</dependency>
<!-- spring整合Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.2</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
其中,整合mybatis-spring的依赖隶属于mybtatis,并非是spring的。
注意统一我们的版本,否则无法使用
环境配置
基于全注解开发
配置数据源
@Configuration
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
配置Spring
@Configuration
@ComponentScan("com.wal")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
}
@ComponentScan是开启扫描,@PropertySource是引入我们的外部数据库配置文件,这样在上方我们配置数据源的时候才可以有数据引入
配置Mybatis
@Configuration
public class MybatisConfig {
private SqlSessionFactoryBean sqlSessionFactory;
@Bean
public SqlSessionFactoryBean SqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb =
new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.wal");
ssfb.setDataSource(dataSource);
return ssfb;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.wal");
return msc;
}
}
这个两个@bean分别是创建sqlSessionFactory的bean, mapper映射文件的bean
有了这写基础的配置类就可以使用了
基于xml开发
我们一般都基于全注解开发,但是这个也要了解
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>
<!-- 添加日志,打印在控制台-->
<settings>
<setting name="logIml" value="STDOUT_LOGGING"/>
</settings>
<!-- 为类和包名起别名-->
<typeAliases>
<package name="com.wal.mapper" />
</typeAliases>
<mappers>
<package name="com.wal.mapper"/>
</mappers>
</configuration>
不在mybatis中配置太多,数据源等均在交给spring来管理
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"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="com.wal"/>
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 创建事务管理的bean-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"/>
</bean>
<!-- 开启事务的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
快速使用
创建如下三层架构,记得加上注解@Component(Controller,Service,Mapper)这样才可以让spring扫描到
Controller层
最上方的注解是 Junit5 的测试单元,相当于ApplicationContext创建ioc容器,并getBean
这里详情Spring整合Junit5
Service层
Mapper层
映射文件
测试
成功结合了Mybtais和Spring