不同于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('数据源名称'),如果不写就是默认的
864

被折叠的 条评论
为什么被折叠?



