mybatis sql 改写_mybatis sql改写-程序员宅基地

技术标签: apache  JAVA高级  数据库  sql  

1mybatis sql 改写

package com.macro.mall.tiny.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


@Intercepts({
     @Signature(
             type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}
     )
})
@Slf4j
@Component
public class SqlRewriteInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
            StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
            MetaObject metaObject = MetaObject.forObject(statementHandler,
                    SystemMetaObject.DEFAULT_OBJECT_FACTORY,
                    SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,
                    new DefaultReflectorFactory());

            //先拦截到RoutingStatementHandler,里面有个StatementHandler类型的delegate变量,其实现类是BaseStatementHandler,然后就到BaseStatementHandler的成员变量mappedStatement
            MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");

            //sql语句类型 select、delete、insert、update
            String sqlCommandType = mappedStatement.getSqlCommandType().toString();
            if (!"SELECT".equals(sqlCommandType)){
                //只是拦截:SELECT
                return invocation.proceed();
            }

            //id为执行的mapper方法的全路径名,如com.uv.dao.UserMapper.insertUser
            String id = mappedStatement.getId();
            log.info("拦截到当前请求方法的全路径名为--->:  " + id);

        //TODO 修改位置
        //注解逻辑判断  添加注解了才拦截
        Class<?> classType = Class.forName(mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf(".")));
        //获取接口方法名
        String methodName = mappedStatement.getId().substring(mappedStatement.getId().lastIndexOf(".") + 1, mappedStatement.getId().length());
        boolean isPageCount = false;

        int j=0;

       
                //获取到原始sql语句
                BoundSql boundSql = statementHandler.getBoundSql();
                String sql = boundSql.getSql();

                //获取参数
                Object parameter = statementHandler.getParameterHandler().getParameterObject();
                log.info("拦截到当前请求SQL为--->: "  + sql);
                log.info("拦截到当前请求类型为--->: "  + sqlCommandType);
                log.info("拦截到当前请求参数为--->: "  + parameter);

          
                log.info("拦截到当前请求SQL改写之后为--->: "  + sql);
                sql=sql+" where 1=1";
                log.info("拦截后改写--->: "  + sql);
                //反射改写新的SQL
                Field field = boundSql.getClass().getDeclaredField("sql");
                field.setAccessible(true);
                field.set(boundSql, sql);
            
     


        // 执行完上面的任务后,不改变原有的sql执行过程
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lucksczhd/article/details/121805306

智能推荐

自动发弹幕_直播自动发弹幕脚本-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏10次。一个灰常简单的脚本,懂前端的人都能写出来代码地址及使用方法:https://github.com/xiongyizhu/auto-danmu_直播自动发弹幕脚本

MMU、Cache、TLB 的作用_mmu与tlb和cache的交互-程序员宅基地

文章浏览阅读1.4k次。VM通过页表转换成PM,MMU、Cache、TLB在转换过程中发挥作用:(1)PTE和PA都在Cache或者Memory中:(2)将Cache和Memory拆开描述,PTE和PA是否在Cache中命中:(3)PTE在Cache或Memory中,但是PA不在Cache或Memory中,只能访问Disk:(_mmu与tlb和cache的交互

centos无法删除用户 userdel:cannot remove entry ‘hadoop’ from /etc/passwd_cannot remove entry 'chuqianyun' from /etc/passwd-程序员宅基地

文章浏览阅读4.7k次。刚打算新建hadoop用户,发现居然有了,可是我也不知道密码呀...改也改不了。想着那总能让我删了吧,嗯哼,不行。如图:行吧,总有法子治你,比如:首先,进入home,执行命令vipw找到之前创建的用户,用dd删除该行(:wq保存退出)执行命令vipw -s 找到那个用户所属组,dd删掉即可(:wq保存退出)这时候修改密码检测一下就可以知道有没有删除了好..._cannot remove entry 'chuqianyun' from /etc/passwd

devexpress bandgridview使用总结(14.2)-程序员宅基地

文章浏览阅读791次。这两天利用bandgridview做表头,希望做成如下形状在制作过程中发现如果想实现动态表头,代码的书写顺序需要稍加注意实例化gridband绑定gridband至bandgridviewgridband属性设置实例化bandgridcolumn绑定bandgridcolumn至gridbandbandgridcolumn属性设置  绑定数..._gridband 设置visibleindex

2021-01-28_请把程序拷贝到“官方软件固件\pm3-bin-2.0.0\win32 (client+gui)”根目-程序员宅基地

文章浏览阅读174次。proxmark3 Easy问题及PM3重新连接的方法PM3软件界面如下:连接状态: 已连接(这是在自动识别串口号的方式下)如果有有问题就是下图:(这也是在自动识别串口号的方式下)在手动设置串口号的情况下:好了,下面说说遇到的情况:时间长了没用那个PM3,今天拿出来说使用下,结果用不了,环境:在WIN10的环境下,直接用桌面上的PM3程序,结果直接打不开,试了很多多方法都不行, 记得这是当时从原来另一台能用的电脑(win7)上直接复制过来的,重新装好..._请把程序拷贝到“官方软件固件\pm3-bin-2.0.0\win32 (client+gui)”根目录下再打

计算机网络安全员好就业吗,网络安全就业前景怎么样?-程序员宅基地

文章浏览阅读2.3k次。原标题:网络安全就业前景怎么样?现在无论是企业还是个人,都会注意网络安全。21世纪是信息化时代,我们的生活越来越离不开网络,但是与此同时,网页篡改、计算机病毒、系统非法入侵、数据泄密、网站欺骗、服务瘫痪、漏洞非法利用等信息安全事件时有发生,网络安全越来越被重视。但是由于我国网络安全起步晚,所以现在网络安全工程师十分紧缺。根据职友集的数据显示,当前市场上需求量较大的几类网络安全岗位,如安全运维、渗透..._网络安全博士就业

随便推点

layui总结_layui lay-affix="eye-程序员宅基地

文章浏览阅读480次。layui简介layui是一种采用自身模块规范编写的前端UI框架,遵循原生HTML/CSS/JS的书写组织形式,门槛极低,拿来即用. 无需涉足各种前端工具的复杂配置,只需面对浏览器本身.使用layui获取layui将其完整地部署到项目目录引用css文件和js文件初始化模块 //一般直接写在一个js文件中 layui.use(['layer'..._layui lay-affix="eye

fedora配置阿里云镜像_fedora 阿里云-程序员宅基地

文章浏览阅读536次。在使用dnf进行软件安装的时候,有时候会遇到软件安装的特别慢的情况,这时候可以使用国内一些镜像很好的解决这一问题。配置阿里云镜像备份mv /etc/yum.repos.d/fedora.repo /etc/yum.repos.d/fedora.repo.backupmv /etc/yum.repos.d/fedora-updates.repo /etc/yum.repos.d/fedora-updates.repo.backup下载新的文件下载新的fedora.repo和fedora-_fedora 阿里云

Nginx(一)_nginx重载语句-程序员宅基地

文章浏览阅读223次。Nginx(一)Nginx 的主要应用场景Nginx 的主要优点Nginx 的主要优点Nginx 的版本介绍 Nginx 目录并编译下载NginxautoCHANGES文件conf文件configure脚本contrib文件html目录man目录src 目录编译NginxNginx 配置语法Nginx 命令:重载,热部署,日志切割重载配置文件热部署日志切割Nginx 的主要应用场景静态资源服务反向代理服务API服务Nginx 的主要优点高并发,高性能可扩展性 - 模块化设计高可靠性 -_nginx重载语句

玩转图论算法C#版笔记03:图的广度优先遍历_c#:实现广度优先搜索遍历图算法-程序员宅基地

文章浏览阅读364次。广度优先遍历原理及代码实现、求最短路及对比两种遍历算法_c#:实现广度优先搜索遍历图算法

程序猿的春天是啥样子的?-程序员宅基地

文章浏览阅读575次。程序猿是啥?我的理解是脑子灵活思维li

Wsl2 Ubuntu18.04图形化界面,亲测成功_wsl ubuntu图形界面-程序员宅基地

文章浏览阅读8.2k次,点赞13次,收藏41次。Wsl2 Ubuntu18.04图形化界面,亲测成功Windows端Linux端最后抖抖索索搞了两天,差点Windows系统都重装,终于搞成功了。参考文献:一定要看非常感谢这个哥们,成功搞出来了。Windows端powershell内管理员模式运行wsl --list --verbose确保Version是22. ipconfig记wsl的IPv4地址:192.168.233.193.每个人不一样3.下载VcXSrv X server for Windows.提供给你们一个下载链_wsl ubuntu图形界面