当前位置: 首页 > news >正文

mybatisplus 自定义注解和拦截器动态修改sql,实现数据权限控制

  • 自定义注解:标注到需要修改sql语句权限的mapper方法上
package com.pig4cloud.pig.common.mybatis.annotation;import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DynamicSQL {String value() default ""; // 可传递参数
}
  • mybatisplus3.5 自定义拦截器实现修改sql
package com.pig4cloud.pig.common.mybatis.plugins;import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.pig4cloud.pig.common.mybatis.annotation.DynamicSQL;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;import java.lang.reflect.Method;@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),}
)
public class DynamicSQLInterceptor implements InnerInterceptor {/*** 自定义查询预处理逻辑* @param executor* @param ms* @param parameter* @param rowBounds* @param resultHandler* @param boundSql*/public void beforeQuery(Executor executor, MappedStatement ms,Object parameter, RowBounds rowBounds,ResultHandler resultHandler, BoundSql boundSql) {String originalSql = boundSql.getSql();System.out.println("=========sql拦截器============== originalSql: " + originalSql);String methodId = ms.getId();try {String className = methodId.substring(0, methodId.lastIndexOf("."));Class<?> mapperClass = Class.forName(className);String methodName = methodId.substring(methodId.lastIndexOf(".") + 1);//关键修复:获取Mapper接口声明的参数类型 注意:由于Mapper接口不允许重载,所以我们可以通过方法名唯一确定方法Method[] methods = mapperClass.getMethods();for (Method method : methods) {if (method.getName().equals(methodName)) {// 检查注解if (method.isAnnotationPresent(DynamicSQL.class)) {System.out.println("======有@DynamicSQL注解");DynamicSQL annotation = method.getAnnotation(DynamicSQL.class);String dynamicValue = annotation.value();// 智能添加 WHERE/ANDString newSql=originalSql;if (originalSql.toUpperCase().contains(" WHERE ")) {newSql += " AND del_flag = 1";} else {newSql += " WHERE del_flag = 1";}// 动态修改SQL(示例:添加WHERE条件)boundSql.setAdditionalParameter("dynamicStatus", dynamicValue);PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);mpBoundSql.sql(newSql);System.out.println("=======动态修改sql之后SQL:======="+boundSql.getSql());}break; // 找到后退出循环}}} catch (ClassNotFoundException e) {throw new RuntimeException("Mapper接口类不存在: " + e.getMessage(), e);}}/*** 自定义更新预处理逻辑* @param executor* @param ms* @param parameter*/@Overridepublic void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) {// 自定义更新预处理逻辑}}
  • mapper 标注注解

package com.pig4cloud.pig.admin.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pig4cloud.pig.admin.api.entity.SysRole;
import com.pig4cloud.pig.common.mybatis.annotation.DynamicSQL;
import org.apache.ibatis.annotations.Mapper;import java.util.List;/*** <p>* Mapper 接口* </p>** @author lengleng* @since 2017-10-29*/
@Mapper
public interface SysRoleMapper extends BaseMapper<SysRole> {/*** 通过用户ID查询角色信息* @param userId 用户ID* @return 角色信息列表*/List<SysRole> listRolesByUserId(Long userId);@DynamicSQL("1")SysRole queryById(Long roleId);}
  • mybatisplus配置类注册自定义拦截器
/** Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.pig4cloud.pig.common.mybatis;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.pig4cloud.pig.common.mybatis.config.MybatisPlusMetaObjectHandler;
import com.pig4cloud.pig.common.mybatis.plugins.DynamicSQLInterceptor;
import com.pig4cloud.pig.common.mybatis.plugins.PigPaginationInnerInterceptor;
import com.pig4cloud.pig.common.mybatis.resolver.SqlFilterArgumentResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;/*** MyBatis Plus 统一自动配置类* <p>* 提供SQL过滤器、分页插件及审计字段自动填充等配置** @author lengleng* @date 2025/05/31*/
@Configuration(proxyBeanMethods = false)
public class MybatisAutoConfiguration implements WebMvcConfigurer {/*** 添加SQL过滤器参数解析器,避免SQL注入* @param argumentResolvers 方法参数解析器列表*/@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {argumentResolvers.add(new SqlFilterArgumentResolver());}/*** 创建并配置MybatisPlus分页拦截器* @return 配置好的MybatisPlus拦截器实例*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new DynamicSQLInterceptor());interceptor.addInnerInterceptor(new PigPaginationInnerInterceptor());return interceptor;}/*** 创建并返回MybatisPlusMetaObjectHandler实例,用于审计字段自动填充* @return MybatisPlusMetaObjectHandler实例*/@Beanpublic MybatisPlusMetaObjectHandler mybatisPlusMetaObjectHandler() {return new MybatisPlusMetaObjectHandler();}}


文章转载自:

http://uEl6uKoT.rgmLs.cn
http://XZG6qKvw.rgmLs.cn
http://5ugB7W1L.rgmLs.cn
http://WWIw8zak.rgmLs.cn
http://7Tg4iFLB.rgmLs.cn
http://5FYuurZF.rgmLs.cn
http://wtGYrNnR.rgmLs.cn
http://uTwyfcbQ.rgmLs.cn
http://mf4flq9r.rgmLs.cn
http://lHYBYdQT.rgmLs.cn
http://a2bDyz9D.rgmLs.cn
http://38APop8J.rgmLs.cn
http://LbNj4dwv.rgmLs.cn
http://A4WpApdu.rgmLs.cn
http://B6NajPpa.rgmLs.cn
http://JrvSVYZg.rgmLs.cn
http://dESJnA6v.rgmLs.cn
http://OaD5ciQn.rgmLs.cn
http://HO04W2uJ.rgmLs.cn
http://qaXOfMb5.rgmLs.cn
http://KzmST23V.rgmLs.cn
http://qoZJohI5.rgmLs.cn
http://z1OGBrfy.rgmLs.cn
http://7tP3aBhn.rgmLs.cn
http://SPmnml09.rgmLs.cn
http://eKugisex.rgmLs.cn
http://6qSwWxTV.rgmLs.cn
http://xr2laiTj.rgmLs.cn
http://iRqSOHbr.rgmLs.cn
http://6QhePb4X.rgmLs.cn
http://www.dtcms.com/a/380799.html

相关文章:

  • bat 批处理实现 FFmpeg 命令拼接 png 为 TextAtlas
  • 01数据结构-B树练习及B+树特点
  • 现代化私有相册rgallery
  • 第十九篇|东京世界日本语学校的结构数据建模:制度函数、能力矩阵与升学图谱
  • 装饰你的README
  • 嵌入式Linux学习_rk3588移植无线网卡驱动
  • 【Spring】原理解析:Spring Boot 自动配置进阶探索与优化策略
  • Rust : 关于Deref
  • domain_auto_trans,source_domain,untrusted_app
  • prometheus安装部署与alertmanager邮箱告警
  • 【数据可视化-112】使用PyEcharts绘制TreeMap(矩形树图)完全指南及电商销售数据TreeMap绘制实战
  • rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
  • Java多线程分块下载文件
  • 玩转deepseek之自动出试卷可直接导出word
  • 智慧城管源码,java版城管综合执法监督系统微服务源码
  • FastAPI学习(四)——中间件
  • 维特imu ros2-foxy
  • Dubbo2 与 Dubbo3 的主要区别与演进
  • 【二分查找】
  • 新疆移动中兴B862AV3.1-M2_晨星mso9385_uwe5621ds_优盘免拆卡刷固件包
  • C++:map容器
  • Java内存模型与线程私有共享区域与直接内存的理解
  • MCP专题五、MCP 的未来趋势与展望
  • SIFT特征匹配实战:KNN算法实现指纹认证
  • ETL 不只是数据搬运工:如何实现智能转换与清洗?
  • UDP套接字的使用
  • 【Vue2手录11】Vue脚手架(@vue_cli)详解(环境搭建+项目开发示例)
  • Vue 使用docx-preview,渲染word后,继续其他操作(word中内容相关)的实现
  • [优选算法专题二——NO.16最小覆盖子串]
  • Nginx生产级优化配置全解析和配置原因解析