springboot实现多数据源整合mybatis版(代码片段)

守夜人爱吃兔子 守夜人爱吃兔子     2022-12-08     293

关键词:

前言

本篇博客只讲如何从零到壹地再Spring Boot项目中实现多数据源配置,不谈源码(后续上Spring Boot自动配置等源码)。

本篇博客内容基于Spring Boot Version 2.5.1

背景

一个项目中需要连接多个数据源,我们需要在 业务 层不同的接口访问不同的数据源,此时我们就需要整合项目适配多数据源,本篇博客由此展开。

实现步骤

1、配置文件中配置多个数据源参数

在datasource之后添加标识对应数据源的字符,如我案例中的action、quotation,下面贴详细代码

Notice: 这里的url 配置项这里必须写 jdbc-url,否则会报参数不合法异常。

 spring:
   datasource:
     # 行情中心
     quotation:
       driver-class-name: com.mysql.cj.jdbc.Driver
       jdbc-url: jdbc:mysql://10.253.49.32:3306/quotation_test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
       username: root
       password: 123456
     # 实战项目对应数据库
     action:
       driver-class-name: com.mysql.cj.jdbc.Driver
       jdbc-url: jdbc:mysql://localhost:3306/stupid_kid_action?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
       username: root
       password: 123456

2、定义访问不同数据源对应的接口和xml文件

  1. 访问不同数据源的接口按照目录分开,单独存放,如图所示

  2. 访问不同数据源的XML文件按照目录分开,单独存放,如图所示

3、创建各个数据源的配置类

  1. 创建一个配置类,引入对应的配置参数创建多个数据源对象,下附完整代码。

    • @Bean(name = "action-datasource"):定义创建的数据源对象名称,后面会用到
    • @ConfigurationProperties(prefix = "spring.datasource.action"):声明配置文件中数据源参数来源
     @Configuration
     public class DataSourceConfig 
         @Bean(name = "action-datasource")
         @ConfigurationProperties(prefix = "spring.datasource.action")
         public DataSource actionDbDataSource() 
             return DataSourceBuilder.create().build();
         
     ​
         @Bean(name = "quotation-datasource")
         @ConfigurationProperties(prefix = "spring.datasource.quotation")
         public DataSource quotaDbDataSource() 
             return DataSourceBuilder.create().build();
         
     
  2. 依据不同的数据源创建对应的SqlSessionFactory对象、SqlSessionTemplate对象,下附完整代码。

    • @Qualifier("action-datasource"):注入对应的数据源
    • @MapperScan(basePackages = "com.tree.action.multidatasource.mapper.action", sqlSessionFactoryRef = "actionSqlSessionFactoryDb"):配置对应访问对应数据源的dao层接口位置和引用actionSqlSessionFactory的方法名
    • getResources("classpath:mapping/action/*.xml")):配置获取资源文件位置
     @Configuration // 此处如果不添加该注解会导致bean之间相互调用出错
     @MapperScan(basePackages = "com.tree.action.multidatasource.mapper.action",
         sqlSessionFactoryRef = "actionSqlSessionFactoryDb")
     public class ActionDbConfig 
         @Autowired
         @Qualifier("action-datasource")
         private DataSource actionDataSourceDb;
     ​
         @Bean
         public SqlSessionFactory actionSqlSessionFactoryDb() throws Exception 
             SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
             factoryBean.setDataSource(actionDataSourceDb);
             factoryBean.setMapperLocations(
                 new PathMatchingResourcePatternResolver().getResources("classpath:mapping/action/*.xml"));
             return factoryBean.getObject();
         
     ​
         @Bean
         public SqlSessionTemplate actionSqlSessionTemplateDb() throws Exception 
             return new SqlSessionTemplate(actionSqlSessionFactoryDb());
         
     
     ​
     ​
     @Configuration // 此处如果不添加该注解会导致bean之间相互调用出错
     @MapperScan(basePackages = "com.tree.action.multidatasource.mapper.quotation",
         sqlSessionFactoryRef = "quotationSqlSessionFactoryDb")
     public class QuotationDbConfig 
     ​
         @Autowired
         @Qualifier("quotation-datasource")
         private DataSource actionDataSourceDb;
     ​
         @Bean
         public SqlSessionFactory quotationSqlSessionFactoryDb() throws Exception 
             SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
             factoryBean.setDataSource(actionDataSourceDb);
             factoryBean.setMapperLocations(
                 new PathMatchingResourcePatternResolver().getResources("classpath:mapping/quotation/*.xml"));
             return factoryBean.getObject();
         
     ​
         @Bean
         public SqlSessionTemplate quotationSqlSessionTemplateDb() throws Exception 
             return new SqlSessionTemplate(quotationSqlSessionFactoryDb());
         
     

4、对应目录下开发测试接口,测试看效果

  1. 开发对应的接口,调用接口

  2. 调用接口测试效果

提示

如果是从单数据源切换过来的,需要把启动类上的注解@MapperScan删除,否则会生成两遍对应的dao层接口bean(可以这么理解一下,多数据源环境下,自己声明了对应的dao层位置,启动类上又配置了自动扫描装配可不就是两遍嘛),这种情况下会报如下警告:

反思和收获

就如同我今天和一个朋友讲的一样,通过整合这个多数据源的触碰到了一个小点,也就是整合多数据源之后要把之前在启动类中配置的默认自动装配注解删除,否则会报重复创建bean的警告

springboot+mybatis+druid+pagehelper实现多数据源并分页

前言本篇文章主要讲述的是SpringBoot整合Mybatis、Druid和PageHelper并实现多数据源和分页。其中SpringBoot整合Mybatis这块,在之前的的一篇文章中已经讲述了,这里就不过多说明了。重点是讲述在多数据源下的如何配置使用Druid和PageHelpe... 查看详情

springboot实现多数据源整合mybatis版(代码片段)

前言本篇博客只讲如何从零到壹地再SpringBoot项目中实现多数据源配置,不谈源码(后续上SpringBoot自动配置等源码)。本篇博客内容基于SpringBootVersion2.5.1。背景一个项目中需要连接多个数据源,我们需要在业务层... 查看详情

springboot整合elasticsearch实现多版本的兼容

前言在上一篇学习SpringBoot中,整合了Mybatis、Druid和PageHelper并实现了多数据源的操作。本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和SpringBoot进行结合使用。ElasticSearch介绍ElasticSearch是一个基于Lucene的搜索服务器,其... 查看详情

springboot整合mybatis的多数据源解决办法

  最近项目有一个非解决不可的问题,我们的项目中的用户表是用的自己库的数据,但是这些数据都是从一个已有库中迁过来的,所以用户信息都是在那个项目里面维护,自然而然我们项目不提供用户注册功能,这就有个问题... 查看详情

springboot(代码片段)

文章目录学习目标一、SpringBoot简介1.入门案例问题导入1.1入门案例开发步骤1.2基于SpringBoot官网创建项目1.3SpringBoot项目快速启动2.SpringBoot概述问题导入2.1起步依赖2.2辅助功能二、基础配置1.配置文件格式问题导入1.0初始环境1.1修... 查看详情

springboot整合springdatajpa多数据源

Springboot整合springdatajpa多数据源在使用Mybatis时会涉及多数据源的问题,同样,当我们使用Jpa作为持久化处理方式时,也会涉及多数据源的问题,本节我们来讲解一下Springboot如何整合SpringdataJpa多数据源。1.创建项目添加lomboc,web... 查看详情

springboot+mybatis+mybatisplus整合实现基本的crud操作

SpringBoot+Mybatis+MybatisPlus整合实现基本的CRUD操作1>数据准备--创建测试表CREATETABLE`tb_user`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT‘主键ID‘,`user_name`varchar(20)NOTNULLCOMMENT‘用户名‘,`password`varchar(20)NOTNULLC 查看详情

springboot整合mybatis实现数据库操作的三种方式

前提:使用MySql数据库一、引进依赖方式一:在构建项目时,通过选择方式引入方式二:配置pom.xml方式<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter&l 查看详情

springboot2配置多数据源,整合mybatisplus增强插件

本文源码:GitHub·点这里||GitEE·点这里一、项目案例简介1、多数据简介实际的项目中,经常会用到不同的数据库以满足项目的实际需求。随着业务的并发量的不断增加,一个项目使用多个数据库:主从复制、读写分离、分布式数... 查看详情

springboot+mybatis实现动态切换数据源

前几天有个需求,需要使用不同的数据源,例如某业务要用A数据源,另一个业务要用B数据源。我上网收集了一些资料整合了一下,虽然最后这个需求不了了之了,但是多数据源动态切换还是蛮好用的,所以记录一下,或许以后... 查看详情

springboot+mybatis-plus多数据源配置整合dynamic-datasource

参考技术A这里要排除DruidDataSourceAutoConfigure,因为DruidDataSourceAutoConfigure会注入一个DataSourceWrapper,其会在原生的spring.datasource下找url,username,password等。而我们动态数据源的配置路径是变化的。@DS优先级:方法>类@DS可以注解在方... 查看详情

springboot整合mybatis方式2:使用注解方式整合mybatis(代码片段)

SpringBoot整合Mybatis简介SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis1.先用idea创建一个添加mybatis需要的相关依赖的工程。2.准备数据库和表3.创建表映射类4.创建mapper代理接口5.创建Service层和Service的实现层6.创建控制层࿰... 查看详情

springboot+mybatis整合

    LZ今天自己搭建了下Springboot+Mybatis,比原来的Spring+SpringMVC+Mybatis简单好多。其实只用Springboot也可以开发,但是对于多表多条件分页查询,Springboot就有点力不从心了,所以LZ把Mybatis整合进去,不得不说,现在的框架... 查看详情

springboot+mybatis整合

  LZ今天自己搭建了下Springboot+Mybatis,比原来的Spring+SpringMVC+Mybatis简单好多。其实只用Springboot也可以开发,但是对于多表多条件分页查询,Springboot就有点力不从心了,所以LZ把Mybatis整合进去,不得不说,现在的框架搭建真的... 查看详情

springboot整合mybatis+oracle

第一步认识springboot:springboot是为了解决配置文件多,各个组件不统一的问题,它省去了很多配置文件,同时实现了spring产品的整合。创建springboot项目:通过选择springinit初始化springboot,我们发现它的pom.xml拥有绝大部分的spring所... 查看详情

springboot整合mybatis实现数据库操作的三种方式(代码片段)

前提:使用MySql数据库一、引进依赖方式一:在构建项目时,通过选择方式引入方式二:配置pom.xml方式<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter&l 查看详情

springboot--整合mybatis+druid(代码片段)

...,首先替换默认数据源为阿里德鲁伊并添加监控,其次是SpringBoot下使用Mybatis替换数据源为德鲁伊  首先在配置文件里配置好数据库连接的基本信息,如usernamepasswordurl等,重要的是把默认的type换成Druid。这样做数据源已经换成... 查看详情

springboot+mybatis整合(代码片段)

   LZ今天自己搭建了下Springboot+Mybatis,比原来的Spring+SpringMVC+Mybatis简单好多。其实只用Springboot也可以开发,但是对于多表多条件分页查询,Springboot就有点力不从心了,所以LZ把Mybatis整合进去,不得不说,现在的框架搭建... 查看详情