springboot整合多数据源配置方式

目录

  • 简介
  • 一、表结构
  • 二、多数据源整合
    • 1. springboot+mybatis使用分包方式整合
      • 1.1 主要依赖包
    • 1.2 application.yml 配置文件
      • 1.3 建立连接数据源的配置文件
        • 1.4 具体实现
        • 2. springboot+druid+mybatisplus使用注解整合
          • 2.1 主要依赖包
            • 2.2 application.yml 配置文件
              • 2.3 给使用非默认数据源添加注解@DS
              【springboot整合多数据源配置方式】
              简介 主要介绍两种整合方式,分别是 springboot+mybatis 使用分包方式整合,和 springboot+druid+mybatisplus 使用注解方式整合。

              一、表结构 在本地新建两个数据库,名称分别为db1db2,新建一张user表,表结构如下:

              SQL代码:
              CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(25) NOT NULL COMMENT '姓名',`age` int(2) DEFAULT NULL COMMENT '年龄',`sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别:0-男,1-女',`addr` varchar(100) DEFAULT NULL COMMENT '地址',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8


              二、多数据源整合
              1. springboot+mybatis使用分包方式整合

              1.1 主要依赖包
              • spring-boot-starter-web
              • mybatis-spring-boot-starter
              • mysql-connector-java
              • lombok
              pom.xml 文件如下:
              4.0.0org.springframework.bootspring-boot-starter-parent2.1.9.RELEASE com.examplemultipledatasource0.0.1-SNAPSHOTmultipledatasourceDemo project for Spring Boot1.8org.springframework.bootspring-boot-starter-weborg.mybatis.spring.bootmybatis-spring-boot-starter2.1.0mysqlmysql-connector-javaruntimeorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin


              1.2 application.yml 配置文件
              server:port: 8080 # 启动端口spring:datasource: db1: # 数据源1jdbc-url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverdb2: # 数据源2jdbc-url: jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

              注意事项
              各个版本的 springboot 配置 datasource 时参数有所变化,例如低版本配置数据库 url 时使用 url 属性,高版本使用 jdbc-url 属性,请注意区分。

              1.3 建立连接数据源的配置文件
              第一个配置文件
              @Configuration@MapperScan(basePackages = "com.example.multipledatasource.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")public class DataSourceConfig1 {@Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源)@Bean("db1DataSource")@ConfigurationProperties(prefix = "spring.datasource.db1") //读取application.yml中的配置参数映射成为一个对象public DataSource getDb1DataSource(){return DataSourceBuilder.create().build(); }@Primary@Bean("db1SqlSessionFactory")public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db1/*.xml")); return bean.getObject(); }@Primary@Bean("db1SqlSessionTemplate")public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory); }}

              第二个配置文件
              @Configuration@MapperScan(basePackages = "com.example.multipledatasource.mapper.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")public class DataSourceConfig2 {@Bean("db2DataSource")@ConfigurationProperties(prefix = "spring.datasource.db2")public DataSource getDb1DataSource(){return DataSourceBuilder.create().build(); }@Bean("db2SqlSessionFactory")public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db2/*.xml")); return bean.getObject(); }@Bean("db2SqlSessionTemplate")public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){return new SqlSessionTemplate(sqlSessionFactory); }}


              1.4 具体实现
              项目结构如下:

              注意事项
              • 在 service 层中根据不同的业务注入不同的 dao 层
              • 如果是主从复制- -读写分离:比如 db1 中负责增删改,db2 中负责查询。但是需要注意的是负责增删改的数据库必须是主库(master)

              2. springboot+druid+mybatisplus使用注解整合
              2.1 主要依赖包
              • spring-boot-starter-web
              • mybatis-plus-boot-starter
              • dynamic-datasource-spring-boot-starter # 配置动态数据源
              • druid-spring-boot-starter # 阿里的数据库连接池
              • mysql-connector-java
              • lombok
              pom.xml 文件如下:
              4.0.0org.springframework.bootspring-boot-starter-parent2.1.9.RELEASE com.examplemutipledatasource20.0.1-SNAPSHOTmutipledatasource2Demo project for Spring Boot1.8org.springframework.bootspring-boot-starter-webcom.baomidoumybatis-plus-boot-starter3.2.0com.baomidoudynamic-datasource-spring-boot-starter2.5.6mysqlmysql-connector-javaruntimecom.alibabadruid-spring-boot-starter1.1.20org.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-pluginlocal1local1truelocal2local2


              2.2 application.yml 配置文件
              server:port: 8080spring:datasource:dynamic:primary: db1 # 配置默认数据库datasource:db1: # 数据源1配置url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverdb2: # 数据源2配置url: jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverdurid:initial-size: 1max-active: 20min-idle: 1max-wait: 60000autoconfigure:exclude:com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置

              DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,其会在原生的spring.datasource下找 url, username, password 等。动态数据源 URL 等配置是在 dynamic 下,因此需要排除,否则会报错。排除方式有两种,一种是上述配置文件排除,还有一种可以在项目启动类排除:
              @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args); }}


              2.3 给使用非默认数据源添加注解@DS
              @DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。
              注解在 service 实现或 mapper 接口方法上,不要同时在 service 和 mapper 注解。
              @DS("db2") public interface UserMapper extends BaseMapper {}@Service@DS("db2")public class ModelServiceImpl extends ServiceImpl implements IModelService {}@Select("SELECT * FROM user")@DS("db2")List selectAll();

              到此这篇关于springboot整合多数据源配置的文章就介绍到这了,更多相关springboot整合多数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

                推荐阅读