JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

MyBatis实战二之MyBatis-Plus配置多数据源

wys521 2024-12-03 14:07:36 精选教程 17 ℃ 0 评论

前言

前一节我们介绍了如何在Spring Boot 中配置多数据源,本节我们将介绍在MyBatis-Plus 中多数据源的配置方式。

MyBatis实战一之SpringBoot配置多数据源

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

官网地址:MyBatis-Plus

多数据源

多数据源既动态数据源,项目开发逐渐扩大,单个数据源、单一数据源已经无法满足需求项目的支撑需求。我们开发的阅读平台项目同时连接多个数据库,比如:用户数据库 和 书籍数据库,就要用到动态数据源技术。

dynamic-datasource的功能

支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。

支持数据库敏感配置信息 加密 ENC()。

支持每个数据库独立初始化表结构schema和数据库database。

支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。

支持 自定义注解 ,需继承DS(3.2.0+)。

提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。

提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。

提供 自定义数据源来源 方案(如全从数据库加载)。

提供项目启动后 动态增加移除数据源 方案。

提供Mybatis环境下的 纯读写分离 方案。

提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。

支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。

提供 **基于seata的分布式事务方案。

提供 本地多数据源事务方案。

引入依赖

<!-- mybatis-plus 多数据源 -->
<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
		<version>3.5.0</version>
</dependency>
<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus-boot-starter</artifactId>
		<version>3.4.2</version>
</dependency>
<!--mysql-->
<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>8.0.28</version>
</dependency>
<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid-spring-boot-starter</artifactId>
		<version>1.1.21</version>
</dependency>

配置多个数据源

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    dynamic:
      primary: user #设置默认的数据源或者数据源组,默认值即为user
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        user:
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
          url: jdbc:mysql://127.0.0.1:3306/user?zeroDateTimeBehavior=convertToNull&autoReconnect=true&generateSimpleParameterMetadata=true
          username: root
          password: root
        book:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/book?zeroDateTimeBehavior=convertToNull&autoReconnect=true&generateSimpleParameterMetadata=true
          username: root
          password: root    
    druid:
      # 初始化大小,最小,最大
      initial-size: 10
      min-idle: 10
      max-active: 64
      #  配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存时间
      min-evictable-idle-time-millis: 300000
      validation-query: select 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      # 配置获取连接等待超时的时间
      max-wait: 60000
# 多主多从                      纯粹多库(记得设置primary)                   混合配置
spring:                               spring:                               spring:
  datasource:                           datasource:                           datasource:
    dynamic:                              dynamic:                              dynamic:
      datasource:                           datasource:                           datasource:
        master_1:                             mysql:                                master:
        master_2:                             oracle:                               slave_1:
        slave_1:                              sqlserver:                            slave_2:
        slave_2:                              postgresql:                           oracle_1:
        slave_3:                              h2:                                   oracle_2:

3.使用@DS注解标识

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。

注解

结果

没有@DS

默认数据源

@DS("dsName")

dsName可以为组名也可以为具体某个库的名称

使用 @DS("user") 连接 user 数据库

@DS("user")
public interface UserInfoMapper extends BaseMapper<UserInfoDO> {
}

使用 @DS("book") 连接 book 数据库

@DS("book")
public interface BookInfoMapper extends BaseMapper<BookInfoDO> {
}

@DS 作用在Service 上

@Service
@DS("user_master")
public class UserServiceImpl implements UserService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  public List selectAll() {
    return  jdbcTemplate.queryForList("select * from user");
  }
  
  @Override
  @DS("user_salve")
  public List selectByCondition() {
    return  jdbcTemplate.queryForList("select * from user where age >10");
  }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表