本文将详细讲解如何在Spring Boot项目中使用Mybatis多数据源,完整的攻略包括以下几个步骤:
- 添加项目依赖
- 创建数据源配置类
- 创建Mybatis配置类
- 创建Mapper接口和Mapper.xml文件
- 测试访问多数据源
下面,我们将逐一进行讲解。
1. 添加项目依赖
在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
其中,spring-boot-starter-jdbc
和 spring-boot-starter-data-jpa
用于创建基于JPA的单一数据源,mybatis-spring-boot-starter
是Mybatis官方提供的Spring Boot集成包。
如果需要使用多个数据源,还需要添加 druid
数据源和 mysql-connector-java
依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
druid-spring-boot-starter
是Druid数据源的Spring Boot集成包。
2. 创建数据源配置类
在 src/main/java
目录下创建一个名为 datasource
的包,然后在此包下创建 FirstDataSourceConfig
和 SecondDataSourceConfig
两个类,分别用于配置第一个和第二个数据源。
@Configuration
@MapperScan(basePackages = "com.example.mapper.first", sqlSessionFactoryRef = "firstSqlSessionFactory")
@EnableTransactionManagement
public class FirstDataSourceConfig {
@Bean(name = "firstDataSource")
@ConfigurationProperties(prefix = "spring.datasource.first")
@Primary
public DataSource firstDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "firstSqlSessionFactory")
@Primary
public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 设置mybatis配置文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/first/*.xml"));
bean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
return bean.getObject();
}
@Bean(name = "firstTransactionManager")
@Primary
public DataSourceTransactionManager firstTransactionManager(@Qualifier("firstDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "firstSqlSessionTemplate")
@Primary
public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
@Configuration
@MapperScan(basePackages = "com.example.mapper.second", sqlSessionFactoryRef = "secondSqlSessionFactory")
@EnableTransactionManagement
public class SecondDataSourceConfig {
@Bean(name = "secondDataSource")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource secondDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "secondSqlSessionFactory")
public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 设置mybatis配置文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/second/*.xml"));
bean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
return bean.getObject();
}
@Bean(name = "secondTransactionManager")
public DataSourceTransactionManager secondTransactionManager(@Qualifier("secondDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "secondSqlSessionTemplate")
public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
这两个类都需要使用 @Configuration
注解来声明,该注解表明这是一个Spring配置类。
其中,FirstDataSourceConfig
和 SecondDataSourceConfig
类都有三个核心方法:
- xxxDataSource:用于创建数据源(
@Bean
注解表示方法返回值是一个Bean); - xxxSqlSessionFactory:用于创建SqlSessionFactory(通过
@Qualifier
指定数据源Bean); - xxxTransactionManager 和 xxxSqlSessionTemplate:用于配置事务管理器和SqlSessionTemplate。
配置类中的 @MapperScan
注解用于扫描 com.example.mapper.first
和 com.example.mapper.second
包下的Mapper接口,sqlSessionFactoryRef
参数指定使用的SqlSessionFactory。
3. 创建Mybatis配置类
在 src/main/java
目录下创建 MybatisConfig
类,用于配置Mybatis相关的配置。
@Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return (Configuration configuration) -> {
// 开启驼峰命名规则
configuration.setMapUnderscoreToCamelCase(true);
// 显示sql语句
configuration.setLogImpl(StdOutImpl.class);
};
}
}
该类使用了 @Configuration
注解,表示它是一个Spring配置类,在此类中定义了一个 ConfigurationCustomizer
,以开启Mybatis的驼峰命名和显示SQL语句的功能。使用 @Bean
来声明这个 ConfigurationCustomizer
Bean。
4. 创建Mapper接口和Mapper.xml文件
在 com.example.mapper.first
和 com.example.mapper.second
包下分别创建两个Mapper接口和对应的Mapper.xml文件。
以 FirstMapper
为例:
FirstMapper.java
:
public interface FirstMapper {
List<First> listAll();
}
FirstMapper.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.example.mapper.first.FirstMapper">
<resultMap id="first" type="com.example.entity.first.First">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="listAll" resultMap="first">
select * from first
</select>
</mapper>
其中,namespace
用于指定这个Mapper接口的全限定名。
FirstMapper.xml
文件中包含了两个部分:
- resultMap:用于将查询结果映射到Java对象。
- select:用于配置具体的SQL查询,以及使用的resultMap。
5. 测试访问多数据源
在Spring Boot应用中可以使用 @Autowired
来注入不同的数据源对象。
以 FirstController
为例:
@RestController
@RequestMapping("/first")
public class FirstController {
@Autowired
private FirstMapper firstMapper;
@GetMapping("/listAll")
public List<First> listAll() {
return firstMapper.listAll();
}
}
在此演示中,我们使用@RestController注解声明一个控制器,并使用@Autowired注解来注入FirstMapper对象。
同样的,我们也可以创建一个 SecondController
来访问第二个数据源。
至此,我们已经完成了Spring Boot + Mybatis多数据源的配置,同时也完成了测试。
附上完整代码的Github地址:https://github.com/X-TJ/springboot-mybatis-multi-datasource
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解springboot+mybatis多数据源最简解决方案 - Python技术站