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}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java spring整合junit操作(有详细的分析过程)

    java spring整合junit操作(有详细的分析过程)

    这篇文章主要介绍了java spring整合junit操作(有详细的分析过程),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • MyEclipse开发一个webservice接口

    MyEclipse开发一个webservice接口

    这篇文章主要为大家详细介绍了MyEclipse开发一个webservice接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java 异常详解

    Java 异常详解

    本文主要介绍了异常与错误的区别,异常的体现分类,异常的处理机制,如何自定义异常等,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 详解如何把cmd黑窗口把java文件打包成jar

    详解如何把cmd黑窗口把java文件打包成jar

    本文主要介绍了如何把cmd黑窗口把java文件打包成jar,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java微服务Filter过滤器集成Sentinel实现网关限流过程详解

    Java微服务Filter过滤器集成Sentinel实现网关限流过程详解

    这篇文章主要介绍了Java微服务Filter过滤器集成Sentinel实现网关限流过程,首先Sentinel规则的存储默认是存储在内存的,应用重启之后规则会丢失。因此我们通过配置中心Nacos保存规则,然后通过定时拉取Nacos数据来获取规则配置,可以做到动态实时的刷新规则
    2023-02-02
  • mybatis多对多查询的实现(xml方式和注解方式)

    mybatis多对多查询的实现(xml方式和注解方式)

    本文主要介绍了mybatis多对多查询的实现,有xml方式和注解方式两种,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Java的原子类无锁并发利器详解

    Java的原子类无锁并发利器详解

    这篇文章主要介绍了Java的原子类无锁并发利器详解,原子类同样能够解决互斥性问题、原子性问题除此之外,因为原子类是无锁操作,没有用互斥锁解决带来的加锁解决性能消耗,这种绝佳方案是怎么做到的呢,需要的朋友可以参考下
    2023-12-12
  • Java中@DateTimeFormat @JsonFormat失效原因及测试填坑

    Java中@DateTimeFormat @JsonFormat失效原因及测试填坑

    本文主要介绍了Java中@DateTimeFormat @JsonFormat失效原因及测试填坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 部署springboot项目到云服务器的两种方式(jar+war)

    部署springboot项目到云服务器的两种方式(jar+war)

    本文主要介绍了部署springboot项目到云服务器的两种方式,主要介绍了jar和war两种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 实战SpringBoot集成JWT实现token验证

    实战SpringBoot集成JWT实现token验证

    本文详细讲解了SpringBoot集成JWT实现token验证,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论