mybatisplus 配置多数据源
MyBatisPlus(简称MP)是一个基于MyBatis框架的扩展工具,旨在简化数据库操作,提供了CRUD(创建、读取、更新、删除)以及更多高级功能。在大型项目中,常常需要配置多个数据源来处理不同的业务需求,例如:一个数据源用于核心业务,另一个数据源用于日志记录等。本文将详细介绍如何在Java项目中使用MyBatisPlus配置多数据源。 一、引入依赖 我们需要在项目中添加MyBatisPlus和Spring Boot的多数据源支持相关的依赖。如果是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-boot-starter</artifactId> <version>3.x.x</version> </dependency> <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> ``` 这里请替换`3.x.x`为MyBatisPlus的最新版本。 二、配置多数据源 在Spring Boot的application.yml或application.properties文件中,我们需要配置多个数据源。以下是一个示例配置: ```yaml spring: datasource: primary: url: jdbc:mysql://localhost:3306/main_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: password driver-class-name: com.mysql.jdbc.Driver secondary: url: jdbc:mysql://localhost:3306/secondary_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: password driver-class-name: com.mysql.jdbc.Driver ``` 这里,我们配置了两个数据源,分别名为primary和secondary,对应不同的数据库连接信息。 三、配置DataSource 接下来,我们需要自定义一个配置类,使用Spring的`@Configuration`注解,实现`DataSourceConfigurer`接口,并重写`configureDataSources`方法: ```java @Configuration public class DataSourceConfig implements DataSourceConfigurer { @Value("${spring.datasource.primary.url}") private String primaryUrl; @Value("${spring.datasource.primary.username}") private String primaryUsername; @Value("${spring.datasource.primary.password}") private String primaryPassword; @Value("${spring.datasource.secondary.url}") private String secondaryUrl; @Value("${spring.datasource.secondary.username}") private String secondaryUsername; @Value("${spring.datasource.secondary.password}") private String secondaryPassword; @Override public void configureDataSources(DataSourceBuilderRegistry registry) { // 主数据源 DataSourceProperties primaryProperties = new DataSourceProperties(); primaryProperties.setUrl(primaryUrl); primaryProperties.setUsername(primaryUsername); primaryProperties.setPassword(primaryPassword); DataSource primaryDataSource = primaryProperties.initializeDataSourceBuilder().build(); // 从数据源 DataSourceProperties secondaryProperties = new DataSourceProperties(); secondaryProperties.setUrl(secondaryUrl); secondaryProperties.setUsername(secondaryUsername); secondaryProperties.setPassword(secondaryPassword); DataSource secondaryDataSource = secondaryProperties.initializeDataSourceBuilder().build(); registry.register("primary", primaryDataSource); registry.register("secondary", secondaryDataSource); } } ``` 这个配置类将数据源信息注入到Spring容器中。 四、配置事务管理器 为了让Spring能够正确处理多数据源的事务,还需要配置事务管理器: ```java @Configuration @EnableTransactionManagement public class TransactionManagerConfig { @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager(DataSource primaryDataSource) { return new DataSourceTransactionManager(primaryDataSource); } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager(DataSource secondaryDataSource) { return new DataSourceTransactionManager(secondaryDataSource); } } ``` 五、配置MyBatisPlus 为了使MyBatisPlus与多数据源配合,我们需要创建两个MapperFactoryBean,分别对应两个数据源: ```java @Configuration public class MyBatisPlusConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Bean(name = "primarySqlSessionFactory") public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryTransactionManager") PlatformTransactionManager transactionManager) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(primaryDataSource); factoryBean.setTransactionManager(transactionManager); return factoryBean.getObject(); } @Bean(name = "secondarySqlSessionFactory") public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryTransactionManager") PlatformTransactionManager transactionManager) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(secondaryDataSource); factoryBean.setTransactionManager(transactionManager); return factoryBean.getObject(); } @Bean(name = "primarySqlSessionTemplate") public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean(name = "secondarySqlSessionTemplate") public SqlSessionTemplate secondarySqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加你需要拦截的规则,如全局参数、分页插件等 return interceptor; } @Bean public MybatisPlusConfiguration mybatisPlusConfiguration() { MybatisPlusConfiguration configuration = new MybatisPlusConfiguration(); return configuration; } } ``` 至此,我们已经完成了MyBatisPlus与多数据源的配置。在业务代码中,可以使用`@Autowired`和`@Qualifier`注解来指定使用哪个数据源进行操作,或者通过编程式方式切换数据源。 六、使用多数据源 在Service层,可以通过`@Resource`或`@Autowired`注解来注入不同数据源的`BaseMapper`,例如: ```java @Service public class PrimaryService { @Resource(name = "primaryBaseMapper") private BaseMapper primaryBaseMapper; // 使用主数据源执行SQL public void doSomething() { primaryBaseMapper.insert(new YourEntity()); } } @Service public class SecondaryService { @Resource(name = "secondaryBaseMapper") private BaseMapper secondaryBaseMapper; // 使用从数据源执行SQL public void doSomethingElse() { secondaryBaseMapper.insert(new AnotherEntity()); } } ``` 总结: MyBatisPlus配置多数据源主要涉及引入依赖、配置数据源、配置事务管理器、配置MyBatisPlus以及在业务代码中选择合适的数据源进行操作。通过这种方式,我们可以灵活地处理项目中的复杂数据访问需求,确保不同业务逻辑可以独立地运行在不同的数据库上。