需求:

1, 不同的权限角色看见的数据不一样, 进行数据隔离

2, 大部分表里面都维护了一个sys_code 大区编号,   1 是湖南, 2 是广东, 他们需要看到数据是不一样的

3, 不需要每个查询都自己去判断角色去修改sql,   可以配置多个字段, sys_code 隔离,  city_id 隔离, 省管理, 和市管理, 灵活配置

package com.test.first;import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.core.parser.ISqlParserFilter;
import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;@Configuration
@MapperScan(basePackages = {"com.dao"})
public class FilterConfig {private static final Map<String, String > IGNORE_TENANT_SMAP = new HashMap<String, String>(){{// 这些mapper 方法也不修改put("com.test.first.dao.TestMapper.getId","");put("com.test.first.dao.TestMapper.getId2","");put("com.test.first.dao.TestMapper.getId3","");}};private static final HashSet<String> TABLE_FILTER = new HashSet();static {// 过滤表, 这些表不进行修改TABLE_FILTER.add("sys_user");TABLE_FILTER.add("sys_user1");TABLE_FILTER.add("sys_user2");}@Autowired//自动注入requestprivate HttpServletRequest request;@Bean@SuppressWarnings("all")public PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// sql 解析器List<ISqlParser> sqlParserList = new ArrayList<>();TenantSqlParser tenantSqlParser = new TenantSqlParser();tenantSqlParser.setTenantHandler(new TenantHandler() {@Overridepublic Expression getTenantId() {HttpSession session = request.getSession();// 此处返回sys_code 字段值, 修改sql时候的参数, 从session 里面获取用户,// 或者其他方式获取用户标识, 这里方便直接写死了return new LongValue(11);}@Overridepublic String getTenantIdColumn() {// 返回增加条件的字段return "sys_code";}@Overridepublic boolean doTableFilter(String tableName) {// 这里可以判断是否过滤表// 对没有sys_code 的表格进行过滤if (TABLE_FILTER.contains(tableName)){// 返回true 则不过滤return true;}return false;}});// 添加到解析器, 如需添加多个, 这个地方是list, 多new几个, new TenantSqlParser(); 即可sqlParserList.add(tenantSqlParser);// 设置解析器集合paginationInterceptor.setSqlParserList(sqlParserList);// 过滤函数paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {@Overridepublic boolean doFilter(MetaObject metaObject) {MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);// com.test.first.dao.TestMapper.getId 精确到mapper 方法级if(IGNORE_TENANT_SMAP.containsKey(ms.getId())) {// 不进行修改return true;}return false;}});return paginationInterceptor;}
}

原始sql

SELECT * FROM bd_product

经过配置后会自动增加条件

SELECT * FROM bd_product WHERE sys_code = 11

mysql-plus 动态修改全局sql, 进行数据隔离, 多租户, 多字段修改相关推荐

  1. MySQL简介、M有SQL的存储引擎、表、字段和数据

    Java知识点总结:想看的可以从这里进入 目录 2.MySQL特性介绍 2.1.MySQL简介 2.2.存储引擎 2.3.表.字段.数据 2.MySQL特性介绍 2.1.MySQL简介 MySQL 是 ...

  2. 服务器修改密码sql打不开了,服务器管理员密码修改后SQL_Server_2008无法启动

    服务器管理员administrator密码修改后SQL_Server_2008无法启动 其实很简单,我发现在网上找这个相关的问题,什么说法都有,把人绕的晕头转向的 我来教大家如何解决这个问题: 首先我 ...

  3. mysql 语句 简书_MySQL SQL语句

    Mysql数据库:端口号3306,超级用户 root unsigned 正值 修改提示符:--prompt 提示符 常见定义 参数:\D 完整的日期 \d当前数据库 \h服务器名称 \u 当前用户 数 ...

  4. fiddler修改接口请求返回数据Response的三种方法

    背景 访问某个URL地址,正常返回结果是 {"code":0,"msg":"success","rows":[" ...

  5. vue+vite+element-plus修改全局主题颜色

    vue3+vite+element-plus修改全局主题颜色 新建修改全局的样式文件 配置vite.config.ts文件 修改APP.vue 最近在研究Vue3+vite+element-plus项 ...

  6. SaaS 系统架构,租户数据隔离模式与租户信息解析方案!

    这段时候在准备从零开始做一套SaaS系统,之前的经验都是开发单数据库系统并没有接触过SaaS系统,所以接到这个任务的时候也有也些头疼,不过办法部比困难多,难得的机会. 在网上找了很多关于SaaS的资料 ...

  7. mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...

    添加和删除列 使用ADD向表中添加新列,使用DROP删除现有列.DROP col_name是对标准SQL的MySQL扩展. 若要在表行的特定位置添加列,请使用FIRST col_name 或者 AFT ...

  8. mysql 工具里直接修改sql结果数据_sql server如何在查询结果页面直接编辑数据

    展开全部 sql server在查询结抄果页面直接编辑数据2113的方法和详细的操作步5261骤如下: 1.首先,4102打开数据库查1653询语句. 输入查询语句以查询数据表中的数据内容,如下图所示 ...

  9. MyBatisPlus自动生成代码springboot+mybatis+mysql 以及动态sql生成方法(测试可用版)

    用了一段时间的springboot,想着百度一下自动生成代码的方式,包括后面如何生成动态sql方法的方式. 摸索了几天,整理一下: ** 1 自动生成代码方式:com.baomidou.mybatis ...

最新文章

  1. python 异常处理中try else语句的使用
  2. MySQL——基于CASE WHEN的常用查询
  3. 【转】matlab 生成调用c/c++ 代码 mex 简单实用——修改部分
  4. 9.IDA-重新设置函数类型、创建数组结构
  5. Frida Android hook
  6. keras.layers.Conv2D 与tf.layers.Conv2D 的兼容性: AttributeError: ‘tuple‘ object has no attribute ‘layer‘
  7. 解决在使用pip进行安装时的Could not install packages due to an EnvironmentError的问题
  8. Arrays.copyOf
  9. java宿舍管理系统主要功能_Java学生宿舍管理系统主要内容及特点
  10. 查看apk包名和Activity名
  11. 用luac给lua脚本加密
  12. 多项式承诺Polynomial commitment方案汇总
  13. 【图神经网络】异构时间图卷积网络HTGCN——用于社区检测
  14. matlab算原函数,matlab中原函数如何求解其中f(x)的导数为(22.05/x)的平方减1再开根号...
  15. Edge浏览器出现翻译不了页面,扩展插件无法下载解决办法
  16. Windows Live Message (MSN) 登陆错误解决办法 -- windows live communications platform 遇到问题需要关闭
  17. 电影文件名缩写说明——DVDSCR,TS/TC,REMUX
  18. Python装饰器最经典教程,以最易理解的方式教会你
  19. 安利给CIO的零信任安全指南
  20. STM32和emWin必须知道的那些事

热门文章

  1. A single input file is required for a non-link phase when an outputfile is specified
  2. IntelliJ IDEA :Error:(1, 1) java: 非法字符: '\ufeff'
  3. 二、神兽变变变(上)
  4. 理论+实操: linux中firewalld防火墙基础讲解(转载)
  5. java stack empty_java.util.Stack.empty()方法实例
  6. tensorflow 迁移学习_基于 TensorFlow.js 1.5 的迁移学习图像分类器
  7. 必会系列之 filter 和 interceptor 的区别
  8. MySQL插入数据时报错Cause: java.sql.SQLException: #HY000的解决方法
  9. 文件上传 java web_JavaWeb 文件上传下载
  10. python extractall函数_Pandas从str.extractall('#')中给出错误