mybatis-plus动态数据源

不同于mybatis动态数据,mybatisplus自带很多查询方法

依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.18</version>
        </dependency>
        <!-- MyBatis-Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <!-- 动态数据源(关键) -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.6.1</version>
        </dependency>
        <!-- Oracle JDBC 驱动 -->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
        </dependency>
    </dependencies>

配置

application.yml

server:
  port: 8089
spring:
  datasource:
    dynamic:
      primary: master
      strict: true
      datasource:
        #主数据库
        master:
          url: jdbc:oracle:thin:@192.168.1.46:1521:gtmsdb?oracle.jdbc.ReadTimeout=30000&oracle.jdbc.ConnectTimeout=30000
          username: gtmsmanager_cq
          password: mypassword123
          driver-class-name: oracle.jdbc.driver.OracleDriver
        #从数据库
        slave:
          url: jdbc:oracle:thin:@192.168.1.43:1521:gtmsdb?oracle.jdbc.ReadTimeout=30000&oracle.jdbc.ConnectTimeout=30000
          username: gtmsmanager
          password: mypassword123
          driver-class-name: oracle.jdbc.driver.OracleDriver
mybatis-plus:
  mapper-locations: classpath*:/mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

实体类

package com.cyz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;

/**
 * <p>
 *
 * </p>
 *
 * @author cyz
 * @since 2024-03-12
 */

@TableName("FTTX_TAB_LOCATION")
@Data
public class FttxTabLocation implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId("LOCATION_CODE")
    private String locationCode;

    @TableField("LOCATION_NAME")
    private String locationName;

    @TableField("PARENT_CODE")
    private String parentCode;

    @TableField("LOCATION_LEVEL")
    private Integer locationLevel;

    @TableField("ADD_TIME")
    private Long addTime;

}

mapper

package com.cyz.mapper;


import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cyz.entity.FttxTabLocation;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

/**
 * <p>
 * Mapper 接口
 * </p>
 *
 * @author cyz
 * @since 2024-03-12
 */
@Repository
@Mapper
public interface FttxTabLocationMapper extends BaseMapper<FttxTabLocation> {

    @DS("slave")
    Integer queryMaxDeviceId();


    String getMaxLocationCode();
}

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cyz.mapper.FttxTabLocationMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap1" type="com.cyz.entity.FttxTabLocation">
        <id column="LOCATION_CODE" property="locationCode"/>
        <result column="LOCATION_NAME" property="locationName"/>
        <result column="PARENT_CODE" property="parentCode"/>
        <result column="LEVEL" property="locationLevel"/>
        <result column="ADD_TIME" property="addTime"/>
    </resultMap>
    <select id="getMaxLocationCode" resultType="java.lang.String">
        SELECT max(TO_NUMBER(LOCATION_CODE))
        FROM FTTX_TAB_LOCATION
        where LOCATION_LEVEL = 3
    </select>
    <select id="queryMaxDeviceId" resultType="java.lang.Integer">
        select max(TO_NUMBER(device_id))
        from tab_hgwcustomer
    </select>
</mapper>

切换数据源日志打印

package com.cyz.config;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class DataSourceLogAspect {

    @Around("@annotation(dataSourceLog)")
    public Object logDataSourceChange(ProceedingJoinPoint joinPoint, DS dataSourceLog) throws Throwable {
        // 获取当前使用的数据源名称
        String currentDataSource = DynamicDataSourceContextHolder.peek();
        log.info("Switching to data source: {}", currentDataSource);
        try {
            return joinPoint.proceed(); // 执行目标方法
        } finally {
            log.info("Finished executing with data source: {}", currentDataSource);
        }
    }
}

启动类

package com.cyz;

import com.cyz.mapper.FttxTabLocationMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.PostConstruct;

@SpringBootApplication(exclude = {
        org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class,
        org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration.class,
        org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class
})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Autowired
    FttxTabLocationMapper fttxTabLocationMapper;

    @PostConstruct
    public void init() {
        fttxTabLocationMapper.getMaxLocationCode();
        fttxTabLocationMapper.queryMaxDeviceId();
    }
}

测试

注意 

切换数据源使用@DS('数据源名称'),如果不写就是默认的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值