🏆本文收录于 《Spring Boot从入门到精通》 ,专门攻坚指数提升
本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。
环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
本文将介绍如何在Spring Boot框架下使用mybatis-plus实现多数据源配置。多数据源配置是一个常见的需求,在实际项目中也经常遇到,因此掌握多数据源配置的技巧是非常重要的。
本文将为大家介绍如何使用Spring Boot和mybatis-plus实现多数据源配置。我们将分别介绍如何配置多个数据源以及如何使用mybatis-plus来操作这些数据源。除此之外,我们还将给出一个简单的测试用例来验证代码的正确性。
首先,我们需要在pom.xml文件中添加依赖:
<!--配置多数据源-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
示例截图如下:
在Spring Boot框架下配置多个数据源只需要在application.properties文件中加入多组数据源的配置即可。例如,我们配置两个数据源,分别为db1和db2:
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
slave_1:
driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
url: jdbc:mysql://127.0.0.1:3306/test_db2?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
在以上配置中,我们为两个数据源分别配置了url、username和password。需要注意的是,我们在url中使用了不同的数据库名称来区分不同的数据源。
示例截图如下:
在配置mybatis-plus上,我们需要创建两个数据源的配置类,分别为db1和db2。这两个配置类需要分别继承AbstractDataSourceConfig,并且需要通过使用@MapperScan注解来初始化mybatis-plus的SqlSessionFactory和MapperScannerConfigurer。
我们这里给出db1数据源的代码示例:
@Configuration
@MapperScan(basePackages = {"com.example.db1.mapper"}, sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Db1DataSourceConfig extends AbstractDataSourceConfig {
@Autowired
@Qualifier("db1DataSource")
private DataSource db1DataSource;
@Bean(name = "db1SqlSessionFactory")
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
return super.createSqlSessionFactory(dataSource);
}
@Bean(name = "db1SqlSessionTemplate")
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Override
public DataSource dataSource() {
return db1DataSource;
}
@Override
public MybatisPlusProperties getMybatisPlusProperties() {
MybatisPlusProperties properties = new MybatisPlusProperties();
properties.setMapperLocations(new String[]{"classpath:mapper/db1/**/*.xml"});
return properties;
}
}
在以上代码中,我们使用@MapperScan注解来扫描指定目录下的Mapper接口,同时指定SqlSessionTemplate使用的SqlSessionFactory名称(即“db1SqlSessionFactory”)。我们在配置中也指定了Mapper文件的路径。
类似地,在db2数据源的配置中,我们只需要修改相关的名称即可。
在编写Mapper接口时,我们需要指定使用的数据源。我们可以通过在Mapper接口上加上@DS注解来指定当前执行的方法使用的数据源。例如:
@DS("db1")
public interface UserMapperDb1 extends BaseMapper<User> {
//...
}
@DS("db2")
public interface UserMapperDb2 extends BaseMapper<User> {
//...
}
以上代码中,我们分别为db1和db2数据源编写了一个UserMapper接口,并通过@DS注解指定了使用的数据源。
最后,我们为我们的代码编写一个简单的测试用例来验证代码的正确性。我们可以在测试用例中通过使用@Autowired注入指定的Mapper接口来操作对应的数据源。例如:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MultiDataSourceTest {
@Autowired
private UserMapperDb1 userMapperDb1;
@Autowired
private UserMapperDb2 userMapperDb2;
@Test
public void test() {
User user1 = new User();
user1.setName("张三");
user1.setAge(18);
userMapperDb1.insert(user1); // 保存至db1
User user2 = new User();
user2.setName("李四");
user2.setAge(20);
userMapperDb2.insert(user2); // 保存至db2
List<User> userList1 = userMapperDb1.selectList(null);
List<User> userList2 = userMapperDb2.selectList(null);
Assert.assertEquals(userList1.size(), 1); // db1中应有1条记录
Assert.assertEquals(userList2.size(), 1); // db2中应有1条记录
}
}
在以上测试用例中,我们使用了两个Mapper接口来分别向db1和db2数据源中插入了一条记录,并在之后使用了两个Mapper接口来查询各自的数据源中的记录条数。
本文介绍了如何在Spring Boot框架下使用mybatis-plus实现多数据源配置。具体地,我们分别说明了如何配置多个数据源、如何配置mybatis-plus以及如何编写Mapper接口和测试用例。实践证明,多数据源配置在实际业务场景中非常常见,通过本文的学习,读者可以掌握多数据源配置的技巧,对于日后的项目开发工作也将会有很大的帮助。