springboot动态切换数据库表方式
更新时间:2025年08月01日 09:11:02 作者:王大锤4391
本文分享了使用TableScopeAspectAjk切面和TableScopeAjk注解实现数据库表配置、业务切入点管理及SQL动态配置的经验,旨在提升代码可维护性与灵活性,适用于业务逻辑与数据层的分离开发
1.TableScopeAspectAjk
package com.ruoyi.framework.aspectj;
import com.ruoyi.common.annotation.BranchScopeWjlz;
import com.ruoyi.common.annotation.TableScopeAjk;
import com.ruoyi.common.config.UploadConfig;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.entity.BaseSJFZEntity;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.ApplicationContextUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 2025-07-25 15:22:00
* 动态切换数据表
*
* @author wangwei
*/
@Aspect
@Component
@Service
public class TableScopeAspectAjk {
public static final String DATA_SCOPE = "tableScopeAjk";
// 配置织入点-登录用户的所属组织
@Pointcut("@annotation(com.ruoyi.common.annotation.TableScopeAjk)")
public void branchScopePointCut() {
}
//登录用户的所属组织
@Before("branchScopePointCut()")
public void doBefore(JoinPoint point) throws Throwable {
handleDataScope(point);
}
/***
* 当前登录组织
* @param joinPoint
*/
protected void handleDataScope(final JoinPoint joinPoint) {
// 获得注解
TableScopeAjk controllerBranchScope = getAnnotationLog(joinPoint);
if (controllerBranchScope == null) {
return;
}
branchScopeFilter(joinPoint);
}
/**
* 数据范围过滤-当前用户所属组织
*
* @param joinPoint 切点
*/
public static void branchScopeFilter(JoinPoint joinPoint) {
SysConfigMapper sysConfigMapper = ApplicationContextUtils.getBean(SysConfigMapper.class);
String tableName = "";
SysConfig sysConfig = new SysConfig();
sysConfig.setRemark("AJKTABLENAME");
List<SysConfig> sysConfigList = sysConfigMapper.selectConfigList(sysConfig);
if (sysConfigList.size() < 1) {
tableName = "默认配置表";
} else {
List<SysConfig> filteredList = sysConfigList.stream()
.filter(config -> "Y".equals(config.getConfigType()))
.collect(Collectors.toList());
if (filteredList.size() < 1) {
tableName = "默认配置表";
} else {
tableName = filteredList.get(0).getConfigType();
}
}
Object params = joinPoint.getArgs()[0];
if (StringUtils.isNotNull(params) && params instanceof BaseSJFZEntity) {
BaseSJFZEntity baseEntity = (BaseSJFZEntity) params;
baseEntity
.getParams()
.put(
DATA_SCOPE,
tableName
//TODO 动态获取 传参 baseEntity.getTABLENAME()
);
}
}
/**
* 是否存在注解,如果存在就获取
*/
private TableScopeAjk getAnnotationLog(JoinPoint joinPoint) {
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method != null) {
return method.getAnnotation(TableScopeAjk.class);
}
return null;
}
}
2.TableScopeAjk注解
package com.ruoyi.common.annotation;
import java.lang.annotation.*;
/** 组织过滤注解 */
/***
*组织数据过滤
* 1.当前登录组织
* wangwei
* 2023-11-07 09:08:00
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TableScopeAjk {
/**
* 案件表 名称
*/
public String TABLENAME() default "";
}
3.数据库表配置

4.业务切入点
- Mapper.java
@TableScopeAjk public List<Tb....> selectTb....ByList(Tb.... tb....);
5.sql动态配置
${params.tableScopeAjk}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
完美解决gson将Integer默认转换成Double的问题
下面小编就为大家带来一篇完美解决gson将Integer默认转换成Double的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-03-03
SpringBatch从入门到精通之StepScope作用域和用法详解
这篇文章主要介绍了SpringBatch从入门到精通之StepScope作用域和用法详解,主要包括IOC容器中几种bean的作用范围以及可能遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-05-05
Java中SimpleDateFormat 格式化日期的使用
本文主要介绍了Java中SimpleDateFormat 格式化日期的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2022-03-03
用StopWatch优雅替代currentTimeMillis计算程序执行耗时
别再用System.currentTimeMillis()计算程序执行耗时了,拥抱StopWatch优雅来优雅的计算,代码更简洁效率更高,本文带你了解StopWatch的使用2021-09-09
使用JDBC连接Mysql 8.0.11出现了各种错误的解决
这篇文章主要介绍了使用JDBC连接Mysql 8.0.11出现了各种错误的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-08-08


最新评论