• Spring Boot 整合 MyBatis Plus实现多数据源的两种方式


    第一种:使用配置类的方式:

    项目结构

            

     xml依赖:

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <parent>
    6. <artifactId>multi-datasource-parentartifactId>
    7. <groupId>com.ganbogroupId>
    8. <version>1.0-SNAPSHOTversion>
    9. parent>
    10. <modelVersion>4.0.0modelVersion>
    11. <artifactId>multi-datasource-configartifactId>
    12. <properties>
    13. <maven.compiler.source>8maven.compiler.source>
    14. <maven.compiler.target>8maven.compiler.target>
    15. properties>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.bootgroupId>
    19. <artifactId>spring-boot-starter-webartifactId>
    20. dependency>
    21. <dependency>
    22. <groupId>com.baomidougroupId>
    23. <artifactId>mybatis-plus-boot-starterartifactId>
    24. <version>3.3.1version>
    25. dependency>
    26. <dependency>
    27. <groupId>com.baomidougroupId>
    28. <artifactId>mybatis-plus-generatorartifactId>
    29. <version>3.3.1.tmpversion>
    30. dependency>
    31. <dependency>
    32. <groupId>mysqlgroupId>
    33. <artifactId>mysql-connector-javaartifactId>
    34. <scope>runtimescope>
    35. dependency>
    36. <dependency>
    37. <groupId>org.springframework.bootgroupId>
    38. <artifactId>spring-boot-starter-testartifactId>
    39. <scope>testscope>
    40. dependency>
    41. <dependency>
    42. <groupId>org.projectlombokgroupId>
    43. <artifactId>lombokartifactId>
    44. <optional>trueoptional>
    45. dependency>
    46. dependencies>
    47. <build>
    48. <plugins>
    49. <plugin>
    50. <groupId>org.springframework.bootgroupId>
    51. <artifactId>spring-boot-maven-pluginartifactId>
    52. plugin>
    53. plugins>
    54. build>
    55. project>

    多数据源配置类(DataSource -> SqlsessionFactory -> SqlSessionTemplate -> DataSourceTransactionManager)

    DataSourceUserConfig 配置类:

    1. package com.multidb.configdemo.config;
    2. import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
    3. import org.apache.ibatis.session.SqlSessionFactory;
    4. import org.mybatis.spring.SqlSessionTemplate;
    5. import org.mybatis.spring.annotation.MapperScan;
    6. import org.springframework.beans.factory.annotation.Qualifier;
    7. import org.springframework.boot.context.properties.ConfigurationProperties;
    8. import org.springframework.boot.jdbc.DataSourceBuilder;
    9. import org.springframework.context.annotation.Bean;
    10. import org.springframework.context.annotation.Configuration;
    11. import org.springframework.context.annotation.Primary;
    12. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    13. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    14. import javax.sql.DataSource;
    15. @Configuration
    16. @MapperScan(basePackages = "com.multidb.configdemo.dao.user", sqlSessionTemplateRef = "userSqlSessionTemplate")
    17. public class DataSourceUserConfig {
    18. @Primary //设置主数据源
    19. @Bean(name = "userDataSource")
    20. @ConfigurationProperties(prefix = "spring.datasource.user")
    21. public DataSource userDataSource() {
    22. return DataSourceBuilder.create().build();
    23. }
    24. @Bean(name = "userSqlSessionFactory")
    25. public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception {
    26. //工厂bean SqlSessionFactory
    27. MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
    28. //设置数据源
    29. bean.setDataSource(dataSource);
    30. //加载映射文件
    31. bean.setMapperLocations(new PathMatchingResourcePatternResolver().
    32. getResources("classpath*:mapper/user/*.xml"));
    33. return bean.getObject();
    34. }
    35. // 数据源事务管理器
    36. public DataSourceTransactionManager db1TransactionManager(@Qualifier("userDataSource") DataSource dataSource) {
    37. return new DataSourceTransactionManager(dataSource);
    38. }
    39. @Bean(name = "userSqlSessionTemplate")
    40. public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    41. return new SqlSessionTemplate(sqlSessionFactory);
    42. }
    43. }

    DataSourceOrderConfig 配置类:

    1. package com.multidb.configdemo.config;
    2. import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
    3. import org.apache.ibatis.session.SqlSessionFactory;
    4. import org.mybatis.spring.SqlSessionTemplate;
    5. import org.mybatis.spring.annotation.MapperScan;
    6. import org.springframework.beans.factory.annotation.Qualifier;
    7. import org.springframework.boot.context.properties.ConfigurationProperties;
    8. import org.springframework.boot.jdbc.DataSourceBuilder;
    9. import org.springframework.context.annotation.Bean;
    10. import org.springframework.context.annotation.Configuration;
    11. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    12. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    13. import javax.sql.DataSource;
    14. @Configuration
    15. @MapperScan(basePackages = "com.multidb.configdemo.dao.order", sqlSessionTemplateRef = "orderSqlSessionTemplate")
    16. public class DataSourceOrderConfig {
    17. // @Primary
    18. @Bean(name = "orderDataSource")
    19. @ConfigurationProperties(prefix = "spring.datasource.order")
    20. public DataSource orderDataSource() {
    21. return DataSourceBuilder.create().build();
    22. }
    23. @Bean(name = "orderSqlSessionFactory")
    24. public SqlSessionFactory orderSqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception {
    25. //工厂bean SqlSessionFactory
    26. MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
    27. //设置数据源
    28. bean.setDataSource(dataSource);
    29. //加载映射文件
    30. bean.setMapperLocations(new PathMatchingResourcePatternResolver().
    31. getResources("classpath*:mapper/order/*.xml"));
    32. return bean.getObject();
    33. }
    34. // 数据源事务管理器
    35. public DataSourceTransactionManager db1TransactionManager(@Qualifier("orderDataSource") DataSource dataSource) {
    36. return new DataSourceTransactionManager(dataSource);
    37. }
    38. @Bean(name = "orderSqlSessionTemplate")
    39. public SqlSessionTemplate orderSqlSessionTemplate(@Qualifier("orderSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    40. return new SqlSessionTemplate(sqlSessionFactory);
    41. }
    42. }

    多个mapper接口:

      application.properties 配置文件

    1. spring:
    2. datasource:
    3. user:
    4. driver-class-name: com.mysql.cj.jdbc.Driver
    5. username: root
    6. password: root
    7. jdbc-url: jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
    8. order:
    9. driver-class-name: com.mysql.cj.jdbc.Driver
    10. username: root
    11. password: root
    12. jdbc-url: jdbc:mysql://127.0.0.1:3306/order?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
    13. mybatis-plus:
    14. # mapper-locations: classpath:mapper/*.xml # xml文件路径
    15. configuration:
    16. map-underscore-to-camel-case: true # 驼峰转换
    17. cache-enabled: false # 是否开启缓存
    18. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql
    19. # global-config: # 全局配置
    20. # db-column-underline: true # 数据库字段驼峰下划线转换
    21. # id-type: 0 # id自增类型(数据库id自增)

    第二种:使用@DS 注解 切换数据源

    新增pom依赖:

    1. <dependency>
    2. <groupId>com.baomidougroupId>
    3. <artifactId>dynamic-datasource-spring-boot-starterartifactId>
    4. <version>3.3.1version>
    5. dependency>

    application.yml 配置

    1. spring:
    2. datasource:
    3. dynamic:
    4. primary: user #设置默认的数据源或者数据源组,默认值即为master
    5. strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
    6. datasource:
    7. user:
    8. url: jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
    9. username: root
    10. password: root
    11. driver-class-name: com.mysql.jdbc.Driver #3.2.0开始支持SPI可省略此配置
    12. order:
    13. url: jdbc:mysql://127.0.0.1:3306/order?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
    14. username: root
    15. password: root
    16. driver-class-name: com.mysql.jdbc.Driver
    17. mybatis-plus:
    18. mapper-locations: classpath:mapper/**/*.xml #xml文件路径
    19. configuration:
    20. map-underscore-to-camel-case: true #驼峰转换
    21. cache-enabled: false #是否开启缓存
    22. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql
    23. # global-config: #全局配置
    24. # db-column-underline: true #数据库字段驼峰下划线转换
    25. # id-type: 0 #id自增类型(数据库id自增)

    添加 @DS注解 切换数据源

    1. import com.baomidou.dynamic.datasource.annotation.DS;
    2. import com.multidb.annotationdemo.dao.order.OrderDao;
    3. import com.multidb.annotationdemo.entity.order.Order;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Service;
    6. @Service
    7. @DS("order")
    8. public class OrderService {
    9. @Autowired
    10. OrderDao orderDao;
    11. public Order getOrder() {
    12. return orderDao.selectByPrimaryKey(1L);
    13. }
    14. }
    1. package com.multidb.annotationdemo.service;
    2. import com.baomidou.dynamic.datasource.annotation.DS;
    3. import com.multidb.annotationdemo.dao.user.UserDao;
    4. import com.multidb.annotationdemo.entity.user.User;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. @Service
    8. @DS("user")
    9. public class UserService {
    10. @Autowired
    11. UserDao userDao;
    12. public User getUser() {
    13. return userDao.selectByPrimaryKey(1L);
    14. }
    15. }

    启动类配置扫描mapper接口:

    1. @SpringBootApplication
    2. @MapperScan("com.multidb.annotationdemo.dao.**")
    3. public class Datasource1Application {
    4. public static void main(String[] args) {
    5. SpringApplication.run(Datasource1Application.class, args);
    6. }
    7. }

    测试

    1. @RestController
    2. public class IndexController {
    3. @Autowired
    4. UserService userService;
    5. @Autowired
    6. OrderService orderService;
    7. @GetMapping("/getUser")
    8. public User getUser() {
    9. return userService.getUser();
    10. }
    11. @GetMapping("/getOrder")
    12. public Order getOrder() {
    13. return orderService.getOrder();
    14. }
    15. }

    项目源码以及数据库脚本: multi-datasource-parent: Spring boot 整合 MyBatis 实现多数据源。

  • 相关阅读:
    Linux内存管理(三十二):直接内存规整详解
    C++ 队列!还是要从 STL 中的说起……
    逻辑运算介绍
    Python------学生管理(文件txt处理)
    ClickHouse 复制粘贴多行sql语句报错
    渗透测试tomcat错误信息泄露解决办法
    哪个版本的JVM最快?
    Python基础入门篇【41】--python中的时间包
    EasyRecovery14数据恢复软件官方功能简介
    Docker
  • 原文地址:https://blog.csdn.net/u010972055/article/details/127930188