maybaits-plus新增拦截器动态修改sql与pageHelper结合的问题

需求:
对每个sql进行权限控制,判断用户是查询出来的数据
由于涉及到几十个sql的改造,都要增加这个条件,一个个改很麻烦,所以通过增加sql拦截器,给每个sql追加权限条件

在这里插入图片描述
以flowMapper.queryOverFlowPage为例:

DynamicSqlInterceptor

实现mybatis-plus提供的InnerInterceptor ,满足条件的sql进行重写拦截

@Slf4j
@Intercepts({
		@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, Connection.class, Object.class})
})
public class DynamicSqlInterceptor implements InnerInterceptor {
	@Override
	public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
		String originalSql = boundSql.getSql();
		if (shouldModifySql(ms)) {
			String modifiedSql = modifySql(originalSql);
			setSql(boundSql, modifiedSql);
		}
	}
	……
	private boolean shouldModifySql(MappedStatement statement) {
		// 根据业务逻辑判断是否需要修改SQL
		return statement.getId().equals("com.ht.xxx.process.dao.FlowMapper.queryOverFlowPage"); //
	}

modifySql

将查询语句作为一张临时表然后拼接特定条件

	@SneakyThrows
	private String modifySql(String originalSql) {
		// 动态修改SQL,这里加入LEFT JOIN操作
		ExecutorService executorService = Executors.newFixedThreadPool(10);
		SysUserDetails sysUserDetails = (SysUserDetails) SecurityContextHolder.getContext().getAuthentication()
				.getPrincipal();
		Future<InnerData> submit = executorService.submit(new QueryTask(sysUserDetails));
		InnerData innerData = submit.get();
		if (innerData.getCount() > 1) {
			return originalSql;
		}
		if (innerData.getCountBranchOrg() > 1) {
			if (CollectionUtils.isNotEmpty(innerData.getAllSubDeptIds())) {
				return String.format("select t.* from (%s) as t left join PrjUndertakeDept pud on t.prjId=pud.prjId where pud.deptId in (%s)", originalSql, String.join(",", innerData.getAllSubDeptIds()));
			} else {
				return String.format("select t.* from (%s) as t left join PrjUndertakeDept pud on t.prjId=pud.prjId where pud.deptId in (%s)", originalSql, "占位");
			}
		} else {
			return String.format("select t.* from (%s) as t left join PrjUndertakeDept pud on t.prjId=pud.prjId where t.prjId in (%s)", originalSql, "select prjId from PrjPersonPlanPublish where userId ='" + innerData.getUserVo().getUserId() + "'");
		}
	}

注入


	@Bean
	public MybatisPlusInterceptor mybatisPlusInterceptor() {
		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
		interceptor.addInnerInterceptor(new DynamicSqlInterceptor());
		return interceptor;
	}

pagehelper!

modifySql 中采用了 ExecutorService executorService = Executors.newFixedThreadPool(10); 异步,原因是因为pagehelper是根据本地线程来解决的紧跟着sql进行分页,因为拦截器里,有其他条件查询,所以pagehelper把拦截器中的查询条件作为了分页,从而导致sql日志打印正常,但是返回值错误,这里开启新的线程从而避免了污染本地线程数据!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node版本的升级和降级

一、问题描述 在开发过程中&#xff0c;我们可能会遇到在A项目中用 node14 版本&#xff0c;而在B项目中要用 node16 版本&#xff0c;从而需要切换不同的 node 版本来开发项目。 二、安装 gnvm 1、在已经安装好 nodejs 的前提下&#xff0c;我们来安装 gnvm &#xf…

Linux[高级管理]——使用源码包编译安装Apache网站

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月31日14点20分 &#x1f004;️文章质量&#xff1a;96分 在Linux系统上编译和安装Apache HTTP Server是…

基于Vue3的Uniapp实训项目|一家鲜花店

基于Vue的Uniapp实训指导项目 项目预览&#xff1a; 在这里插入图片描述 pages.json {"pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/collocation/pages{"path": "pages/index/index",&…

微信小程序蓝牙连接部分Android14调用wx.setBLEMTU协商低功耗最大传输单元失败解决方案(部分安卓14设置超过23就会报错)

1.解决方案的核心内容&#xff1a;第一次设置失败不要管&#xff0c;在complate函数里面继续往下连接&#xff0c;然后设置一个定时器每1秒钟在重新设置一次&#xff0c;肯定会成功的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

PS系统教程09

修复照片 修饰工具 污点修复画笔工具&#xff08;J&#xff09; 主要作用&#xff1a;去除一些污点或者不需要的 【&#xff1a;缩小】&#xff1a;放大 目标&#xff1a;去掉这两个点 修复画笔工具 也就是说我们要有取样点 选择修复画笔工具按住Alt键吸取周边相近颜色松开单机…

手把手教你使用O2OA(翱途v9)开发应用平台(1)-平台初始化

今天我们就来搭建O2OA服务&#xff0c;并初始化基础数据。 服务器安装启动 获取O2OA O2OA平台以及其所有源码&#xff0c;都是可以免费获取的&#xff0c;要获取可运行的O2OA平台&#xff0c;有三种方式&#xff1a; 1、容器化部署 2、从官网下载可运行版本 3、下载源码&…

YOLOv5改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 目标检测是计算机视觉中一个重要的下游任务。对于边缘盒子的计算平台来说&#xff0c;一个大型模型很难实现实时检测的要求。基于一系列消融…

直流电机工作原理与控制电路解析

工作原理&#xff1a; 洛伦兹力原理&#xff1a; 直流电机中&#xff0c;定子上通电产生磁场&#xff0c;而转子内导体通电后在磁场中受到洛伦兹力的作用&#xff0c;使其产生转动力矩。 转子内的导体通电后会在磁场中受到力的作用&#xff0c;根据洛伦兹力的方向规则&#…

【metricbeat】通过metricbeat采集prometheus指标

通过metricbeat采集prometheus指标 通过beat采集prometheus内的单个指标。 低版本beat只能全量 环境 # 低版本metricbeat只能全量采集 软件版本&#xff1a;metricbeat8.11.1 解压 tar zxvf metricbeat-8.11.1-linux-x86_64.tar.gz -C /usr/local配置 首先&#xff0c;修改…

数据库索引的理解

目录 1.索引是什么&#xff0c;解决了什么问题 2.索引付出了什么代价 3.如何使用sql索引&#xff0c;有何注意事项 普通索引&#xff1a; 唯一索引&#xff1a; 主键索引(Primary Key Index)&#xff1a; 删除索引: 创建主键索引的基本语法: 4.索引背后的数据结构 1.索…

Spring Boot 集成 zxing 生成条形码与二维码

前面我们知道了怎么通过 使用 zxing 生成二维码以及条形码&#xff0c; 由于我们现在都是 web 端的项目了&#xff0c;那么我们看下怎么使用 Spring Boot 集成然后返回给前端展示&#xff1a; 工程源码 对应的工程源码我放到了这里&#xff1a;github源码路径&#xff0c;点击…

80V高耐压低静态线性稳压器/LDO,Vout 1v-65v 3.3V及5V方案最佳选择

概述 PC93XX系列专为动力而设计-敏感应用程序。它包括一个精度第二个高压输入级&#xff0c;超低功率 偏置电流分支&#xff0c;并产生超低功率和低压差线性调节器。PC93XX通过输入电压工作VOUT1V至65V&#xff0c;仅消耗1.8μA的静态电流&#xff0c;并提供1%的初始精度和低…

Maven项目打包成jar项目后运行报错误: 找不到或无法加载主类 Main.Main 和 jar中没有主清单属性解决方案

已经用maven工程的package功能进行了打包 找不到或无法加载主类 Main.Main 规定主类 主要在maven的配置文件当中 这边一定要绑定自己的启动类 jar中没有主清单属性 删掉这一行就行哈 正确的插件代码 <plugin><groupId>org.springframework.boot</groupId&…

孩子出生后为什么要做听力筛查?

孩子出生后为什么要做听力筛查&#xff1f; 新生儿听力筛查&#xff0c;就是对所有新生儿在尽早的时间&#xff08;出生48小时后&#xff09;进行系统的听力筛查测试。据相关文献报道&#xff0c;在我国&#xff0c;正常分娩的新生儿听力障碍的发生率约为0.1&#xff5e;0.3%&a…

gomail发送邮件的参数如何设置?如何使用?

gomail发送邮件的认证方式有哪些&#xff1f;怎么设置邮件发信&#xff1f; Gomail是一个常用的Go语言邮件发送库&#xff0c;它提供了简单易用的接口&#xff0c;使得邮件发送变得非常方便。AokSend将详细介绍如何设置gomail发送邮件的参数&#xff0c;帮助开发者更好地理解和…

Window11开放端口

&#xff08;1&#xff09;打开控制面板&#xff0c;进入【控制面板\系统和安全\Windows Defender 防火墙】 &#xff08;2&#xff09;点击左侧菜单【高级设置】&#xff0c;进入防火墙设置页面 &#xff08;3&#xff09;根据需要选择【入站规则】或者【出站规则】&#xff…

《猎杀:对决》是适合什么样的人玩 Mac电脑怎么玩《猎杀:对决》

《猎杀&#xff1a;对决》是一款集合了生存、竞技和恐怖元素的多人在线游戏&#xff0c;自推出以来受到了广大玩家的热爱。本文将详细探讨《猎杀&#xff1a;对决》适合什么样的人玩以及Mac电脑怎么玩《猎杀&#xff1a;对决》。本文将一一解析&#xff0c;帮助你了解这款游戏是…

全球家纺热潮持续!有哪些家纺爆款类目推荐入驻沃尔玛?

在全球家纺热潮中&#xff0c;选择沃尔玛家纺爆款类目入驻是明智之举。沃尔玛作为全球零售巨头&#xff0c;拥有庞大的消费者群体和销售渠道&#xff0c;对家纺产品销售具有显著优势。 ​以下是一些推荐的家纺爆款类目&#xff0c;供您参考&#xff1a; 一、高品质床品套件 床…

迪普微震撼发布:全新Xilinx Kintex-7 XC7K325 FPGA开发板!

01 产品概述 本公司基于Xilinx Kintex-7系列的开发平台采用核心板加扩展主板的方式&#xff0c;方便用户对相关板卡的二次开发利用。 其中&#xff0c;核心板包含一片芯片XC7K325T&#xff0c;使用FFG900封装&#xff0c;外挂4片512MB的高速DDR3芯片和1片256Mb的QSPI Flash芯…

mysql 如果有按照时间范围查询结果

1.前端传2024-06-21 到我们xml sql 文件中默认实际是 2024-06-21 00:00:00 <if test"dto.startTime ! null">and ps.created_at > #{dto.startTime}</if><if test"dto.endTime ! null">and ps.created_at < #{dto.endTime}</if…