SpringBoot2.7.10+MyBatisPlus实现MySQL+DM双数据库切换

引入依赖

xml 复制代码
<dependency>
	<groupId>com.dameng</groupId>
	<artifactId>DmJdbcDriver18</artifactId>
	<version>8.1.3.140</version>
</dependency>
<dependency>
	<groupId>com.dameng</groupId>
	<artifactId>DmDialectForHibernate</artifactId>
	<version>5.3</version>
</dependency>

yml配置:

yml 复制代码
spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: false
        loginUsername: admin
        loginPassword: Usdf!239dLOsdYT
        allow:
      web-stat-filter:
        enabled: false
    dynamic:
      druid:
        initial-size: 5
        min-idle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,slf4j
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      primary: master
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/mysql_db?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&autoReconnect=true&autoReconnectForPools=true&connectTimeout=30000&socketTimeout=60000&serverTimezone=Asia/Shanghai
          username: mysql_db
          password: mysql_db
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
          druid:
            db-type: mysql
        #达梦数据源dm
        dm:
          url: jdbc:dm://127.0.0.1:5236/?DM_DB&schema=DM_DB&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&compatibleMode=oracle
          username: DM_DB
          password: Dm123456
          driver-class-name: dm.jdbc.driver.DmDriver
          type: com.alibaba.druid.pool.DruidDataSource
          druid:
            db-type: oracle #强制oracle
            validationQuery: select 1 from dual #达梦心跳SQL

Java配置:

java 复制代码
package org.jeecg.config.mybatis;

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.jeecg.common.config.TenantContext;
import org.jeecg.common.constant.TenantConstant;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.common.util.TokenUtils;
import org.jeecg.common.util.oConvertUtils;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 单数据源配置(jeecg.datasource.open = false时生效)
 */
@Slf4j
@Configuration
@MapperScan(value = {"com.database.modules.**.mapper*"})
public class MybatisPlusSaasConfig {
    
    // 省略非关键内容......

    @Resource
    private DynamicDataSourceProperties dynamicDataSourceProperties;

    @Bean
    public DatabaseIdProvider databaseIdProvider() {
        return new DatabaseIdProvider() {
            @Override
            public String getDatabaseId(DataSource dataSource) {
                // 1.优先取当前线程@DS注解指定的数据源
                String dsKey = DynamicDataSourceContextHolder.peek();
                // 2.线程无指定数据源,从yml配置读取primary主库名称
                if (dsKey == null) {
                    dsKey = dynamicDataSourceProperties.getPrimary();
                }
                // 数据源名称是dm返回dm,其余返回mysql
                return "dm".equalsIgnoreCase(dsKey) ? "dm" : "mysql";
            }
        };
    }
}

mapper.xml文件写法:

xml 复制代码
<select id="selectDB" databaseId="mysql" resultType="string">
    select 'mysql'
    </select>

<select id="selectDB" databaseId="dm" resultType="string">
    select 'dm'
    </select>
相关推荐
GreatSQL社区5 分钟前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法
XLYcmy21 分钟前
AI 赋能后中文与英文数据库对比分析报告 上
数据库·ai·llm·prompt·检索·wos·cnki
这个DBA有点耶1 小时前
ELT 工具选型完整指南:从 ETL 差异分析到工程落地
数据库·架构·代码规范
IvorySQL1 小时前
PostgreSQL 日报|堆表选择性索引更新(10 月 13 日)
数据库·人工智能·postgresql·开源·区块链
张洛闻Eren1 小时前
Ansible【第一课】:Ansible介绍
运维·数据库·云原生·kubernetes·github·ansible
PC2005-cloud1 小时前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
深圳市益普科技有限公司2 小时前
中小封装厂上 MES,为什么十个项目九个坑?
大数据·数据库·人工智能
云边云科技_云网融合2 小时前
从 POS 机到访客 Wi-Fi:零售门店安全建设的完整解法
服务器·网络·数据库
天行健,君子而铎2 小时前
知形-数据库风险监测系统:非侵入式、可溯源、差异化的数据库安全方案
网络·数据库·安全
这个DBA有点耶2 小时前
分布式事务深度:TCC空回滚、悬挂与Saga补偿风暴的根因与解法
数据库·mysql·代码规范