Springboot整合多数据源配置流程详细讲解

 更新时间:2023年03月27日 10:12:15   作者:疯狂-小子  
这篇文章主要介绍了Springboot整合多数据源配置流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

主要介绍两种整合方式,分别是 springboot+mybatis 使用分包方式整合,和 springboot+druid+mybatisplus 使用注解方式整合。

多数据源整合

1. springboot+mybatis使用分包方式整合

1.1 主要依赖包

spring-boot-starter-web
mybatis-spring-boot-starter
mysql-connector-java

pom.xml jar包如下:

<!-- spring 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mysql 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

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.qizhidao.demo.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")publicclassDataSourceConfig1 {
    @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 {
        SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
        bean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath*:mapping/db1/*.xml"));
        return bean.getObject();
    }
    @Primary@Bean("db1SqlSessionTemplate")public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        returnnewSqlSessionTemplate(sqlSessionFactory);
    }
}

第二个配置文件

@Configuration@MapperScan(basePackages = "com.example.demon.mapper.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")publicclassDataSourceConfig2{
    @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

pom.xml 引入jar如下:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>2.5.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.20</version></dependency>

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)publicclassApplication {
  publicstaticvoidmain(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

2.3 给使用非默认数据源添加注解@DS

@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。

注解在 service 实现或 mapper 接口方法上,不要同时在 service 和 mapper 注解。

@DS("db2")publicinterfaceUserMapperextendsBaseMapper<User> {
}
@Service@DS("db2")publicclassModelServiceImplextendsServiceImpl<ModelMapper, Model> implementsIModelService {}
  @Select("SELECT * FROM user")@DS("db2")
  List<User> selectAll();

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

相关文章

  • JAVA使用Ldap操作AD域的方法示例

    JAVA使用Ldap操作AD域的方法示例

    这篇文章主要介绍了JAVA使用Ldap操作AD域的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java手动实现Redis的LRU缓存机制

    Java手动实现Redis的LRU缓存机制

    在Java中LRU的实现方式是使用HashMap结合双向链表,HashMap的值是双向链表的节点,双向链表的节点也保存一份key value。
    2021-05-05
  • Mybatis和orcale update语句中接收参数为对象的实例代码

    Mybatis和orcale update语句中接收参数为对象的实例代码

    Mybatis的 mapper.xml 中 update 语句使用 if 标签判断对像属性是否为空值。本文重点给大家介绍Mybatis和orcale update语句中接收参数为对象的实例代码,需要的朋友参考下吧
    2017-09-09
  • Java实现HTTPS连接的示例代码

    Java实现HTTPS连接的示例代码

    现在的网络世界,安全性是大家都非常关注的问题,特别是对于咱们这些程序员来说,所以,理解并实现HTTPS连接,对于保护咱们的数据安全是极其重要的,下面我们就来学习一下在Java中如何实现HTTPS连接吧
    2023-12-12
  • Springboot使用异步请求提高系统的吞吐量详解

    Springboot使用异步请求提高系统的吞吐量详解

    这篇文章主要介绍了Springboot使用异步请求提高系统的吞吐量详解,和同步请求相对,异步不需要等待响应,随时可以发送下一次请求,如果是同步请求,需要将信息填写完整,再发送请求,服务器响应填写是否正确,再做修改,需要的朋友可以参考下
    2023-08-08
  • JVM指令的使用深入详解

    JVM指令的使用深入详解

    这篇文章主要给大家介绍了关于JVM指令使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Java实现Executors类创建常见线程池

    Java实现Executors类创建常见线程池

    本文主要介绍了Java实现Executors类创建常见线程池,在Java中,可以通过Executors工厂类提供四种常见类型的线程池,下面就来介绍一下这四种的方法实现,感兴趣的可以了解一下
    2023-11-11
  • 注入jar包里的对象,用@autowired的实例

    注入jar包里的对象,用@autowired的实例

    这篇文章主要介绍了注入jar包里的对象,用@autowired的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot 工程中的异常处理方式

    SpringBoot 工程中的异常处理方式

    这篇文章主要介绍了SpringBoot 工程中的异常处理方式,帮助大家更好的理解和学习使用springboot框架,感兴趣的朋友可以了解下
    2021-02-02
  • java实现即赋值也判断的写法示例

    java实现即赋值也判断的写法示例

    这篇文章主要为大家介绍了java实现即赋值也判断的写法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论