springboot+mybatis配置多数据源实战

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一般一个项目中只会连接一个数据库.但是随着需求变更,会要求同一个项目中连接多个数据库,本文就讲一下如何在一个项目中对多个数据库进行连接.本文基于springboot+mybatis介绍如何进行多数据源连接(本文演示配置两个数据库,配置多个同理).

1.背景说明


    一般一个项目中只会连接一个数据库.但是随着需求变更,会要求同一个项目中连接多个数据库,本文就讲一下如何在一个项目中对多个数据库进行连接.本文基于springboot+mybatis介绍如何进行多数据源连接(本文演示配置两个数据库,配置多个同理).


2.配置多数据源步骤


2.1 项目结构变更

    以连接不同的数据库进行分包,db1表示连接数据库database1,db2表示连接database2.项目结构如下:

267327c2e09962ca3ce57185015de37a_2f61bdf2526d4c8daa944a8239eda6af.png


2.2添加配置类

/**
 * @ClassName: MultiDataSourceConfig
 * @Desc: 多数据源配置
 * @Author: txm
 * @Date: 2022/12/11 9:59
 **/
@Configuration
public class MultiDataSourceConfig {
  // 创建自定义数据源db1
    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource businessDbDataSource() {
        return DataSourceBuilder.create().build();
    }
  // 创建自定义数据源db2
    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource newhomeDbDataSource() {
        return DataSourceBuilder.create().build();
    }
}


Db1Config配置类:

@Configuration
// 此处添加项目自定义mapper包路径,支持数组形式,指定SqlSessionFactory ,演示包路径已做修改
@MapperScan(basePackages = {"com.api.db1.order.mapper",
        "com.api.db1.pay.mapper",
        "com.api.db1.user.mapper",
        "com.api.db1.distribution.mapper",
        "com.api.db1.aliyun.mapper" }, sqlSessionFactoryRef = "sqlSessionFactoryDb1")
public class Db1Config {
    @Autowired
    @Qualifier("db1")
    private DataSource dataSourceDb1;
    @Bean
    public SqlSessionFactory sqlSessionFactoryDb1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb1);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/**/*.xml"));
        // 自定义MyBatis configuration.配置打印和大小写转换
        org.apache.ibatis.session.Configuration personalConfiguration = new org.apache.ibatis.session.Configuration();
        personalConfiguration.setMapUnderscoreToCamelCase(true);
        personalConfiguration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(personalConfiguration);
        return factoryBean.getObject();
    }
    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb1());
    }
}


Db2Config配置类:


@Configuration
// 此处添加项目自定义mapper包路径,支持数组形式,指定SqlSessionFactory ,演示包路径已做修改
@MapperScan(basePackages = {"com.api.db2.activityUser.mapper",
"com.api.db2.vote.mapper"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2")
public class Db2Config {
    @Autowired
    @Qualifier("db2")
    private DataSource dataSourceDb2;
    @Bean
    public SqlSessionFactory sqlSessionFactoryDb2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb2);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/**/*.xml"));
        // 自定义MyBatis configuration.配置打印和大小写转换
        org.apache.ibatis.session.Configuration personalConfiguration = new org.apache.ibatis.session.Configuration();
        personalConfiguration.setMapUnderscoreToCamelCase(true);
        personalConfiguration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(personalConfiguration);
        return factoryBean.getObject();
    }
    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb2());
    }
}


   说明

   自定义配置类Db1Config 、Db2Config中指定 @MapperScan之后可以将启动类上面的@MapperScan注解进行注释,@MapperScan的作用就是扫描mapper所在的包路径:

// modify by txm 2022/12/12 多数据源改造,包扫描添加到自定义数据源配置类Db1Config、Db2Config中
//@MapperScan("com.**.mapper")
@SpringBootApplication
public class H5Application {
    public static void main(String[] args) {
        SpringApplication.run(H5Application.class, args);
    }
}


   配置类中指定mapper配置文件所在路径,否则会提示:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found),添加内容如下::

factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/**/*.xml"));


   对应的配置文件是(可以进行注释):


mybatis:
     # 配置数据库映射文件 **表示是任意多级目录,适配dao/goods
    mapper-locations: classpath:/mapper/**/**/*.xml


   配置mybatis的日志打印与大小写转换:

// 自定义MyBatis configuration.配置打印和大小写转换
        org.apache.ibatis.session.Configuration personalConfiguration = new org.apache.ibatis.session.Configuration();
        personalConfiguration.setMapUnderscoreToCamelCase(true);
        personalConfiguration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(personalConfiguration);


   添加之后配置文件中可以将以下内容进行注释:

mybatis:
     # 配置数据库映射文件 **表示是任意多级目录,适配dao/goods
    mapper-locations: classpath:/mapper/**/**/*.xml
     #spring boot集成mybatis的方式打印sql
    configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     #spring boot记成mybatis将数据库字段字段转换华成驼峰形式
        map-underscore-to-camel-case: true


2.3 修改配置文件数据连接配置信息

spring:

#数据库信息设置
  datasource:
    db1:   # database1服务器地址
      jdbc-url: jdbc:mysql://xxx.xxx.xx.xx:3308/database1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
      username: ****
      password: ****
      driver-class-name: com.mysql.cj.jdbc.Driver
    db2:  # database2服务器地址 
      jdbc-url: jdbc:mysql://xxx.xxx.xx.xx:3308/database2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
      username: ****
      password: ****
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 配置数据库连接池
      type: com.zaxxer.hikari.HikariDataSource
      hikari:
        minimum-idle: 5  # 最小空闲连接数量
        idle-timeout: 180000 # 单位毫秒,此处设置3分钟,空闲连接存活最大时间,默认600000(10分钟)
        maximum-pool-size: 10 # 连接池最大连接数,默认是10
        auto-commit: true     # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
        pool-name: MyHikariCP  # 连接池名称
        max-lifetime: 1800000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
        connection-timeout: 30000  # 数据库连接超时时间,默认30秒,即30000


   注意:要将url替换成jdbc-url,否则会提示以下内容:

java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.


   关于数据库连接类型可以选用springboot默认支持的Hikari,性能会更好!如果对Hikari无配置要求,可以不用添加Hikari相关的配置信息.演示内容中配置了db2的Hikari信息.

   以上是关于springboot中配置多数据源的实战记录,希望对有同样需求的同学有所帮助,感觉有所收获欢迎点赞或是留言!


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
Oracle 关系型数据库 Java
【YashanDB知识库】Mybatis-Plus适配崖山配置
【YashanDB知识库】Mybatis-Plus适配崖山配置
|
2月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
95 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
2月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
140 0
|
2月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
83 0
|
2月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
60 0
|
2月前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
141 0
|
2月前
|
缓存 Java 应用服务中间件
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th="http://www.thymeleaf.org"`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
65 0
|
2月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
70 0
|
4月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
180 2
|
7月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
299 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。