查询拦截器

package org.study.mybatis.config;import lombok.extern.slf4j.Slf4j;
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.mapping.SqlSource;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;import java.util.Properties;/*** @author lipo* @version v1.0* @date 2019-12-19 17:41* method是Executor接口的方法,args是method的参数*/
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class,ResultHandler.class, CacheKey.class, BoundSql.class}))
@Slf4j
public class MybatisInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {log.info("MybatisInterceptor");//原始sqlMappedStatement ms = (MappedStatement) invocation.getArgs()[0];Object param = invocation.getArgs()[1];BoundSql boundSql = ms.getBoundSql(param);String oldSql = boundSql.getSql();log.info("oldSql = {}", oldSql);//新sqlBoundSql newBoundSql = new BoundSql(ms.getConfiguration(), oldSql + " where id = 1", boundSql.getParameterMappings(), boundSql.getParameterObject());//MappedStatement不需要替换,可能版本原因吧//MappedStatement newMappedStatement = copyMappedStatement(ms, new MySqlSource(newBoundSql));//invocation.getArgs()[0] = newMappedStatement;//这是关键invocation.getArgs()[5] = newBoundSql;return invocation.proceed();}class MySqlSource implements SqlSource {private BoundSql boundSql;public MySqlSource(BoundSql boundSql) {this.boundSql = boundSql;}@Overridepublic BoundSql getBoundSql(Object o) {return boundSql;}}private MappedStatement copyMappedStatement(MappedStatement ms, SqlSource sqlSource) {MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), sqlSource, ms.getSqlCommandType());builder.resource(ms.getResource());builder.fetchSize(ms.getFetchSize());builder.statementType(ms.getStatementType());if (ms.getKeyProperties() != null) {for (String keyProperty : ms.getKeyProperties()) {builder.keyProperty(keyProperty);}}builder.timeout(ms.getTimeout());builder.parameterMap(ms.getParameterMap());builder.resultMaps(ms.getResultMaps());builder.cache(ms.getCache());builder.useCache(ms.isUseCache());return builder.build();}@Overridepublic Object plugin(Object o) {return Plugin.wrap(o, this);}@Overridepublic void setProperties(Properties properties) {}
}

配置

查询

    public Object interceptor() {return userMapper.list();}

访问http://localhost:8080/user/interceptor


比较新旧sql

@Intercepts-mybatis拦截器相关推荐

  1. 真正理解mybatis拦截器以及Interceptor和Plugin作用

    看了很多博客文章和,mybatis 的拦截器概念还是不能很好理解, 可能是因为自己基础不好或者理解方式和他人不同吧,所以决定自己花时间好好捋捋, 然后把理解后的总结记录下来,供他人参考,也许你们的理解 ...

  2. MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...

    用MyBatis结果集拦截器做过这样一个需求: 由于项目需求经常变动,项目MySQL数据库都是存放JSON字符串,例如:用户的基本信息随着版本升级可能会有变动 数据表 CREATE TABLE `ac ...

  3. list mybatis 接收 类型_基于mybatis拦截器实现的一款简易影子表自动切换插件

    近期因工作需要,小编基于mybatis拦截器开发了一款简易影子表自动切换插件,可以根据配置实现动态修改表名,即将对原source table表的操作自动切换到对target table表的操作.该插件 ...

  4. 面试官:你能说说MyBatis拦截器原理吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Format cnblogs.com/fangjian042 ...

  5. MyBatis拦截器原理探究MyBatis拦截器原理探究

    MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis拦截 ...

  6. MyBatis拦截器有哪些以及分析

    MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执行过程中 ...

  7. Mybatis拦截器 mysql load data local 内存流处理

    Mybatis 拦截器不做解释了,用过的基本都知道,这里用load data local主要是应对大批量数据的处理,提高性能,也支持事务回滚,且不影响其他的DML操作,当然这个操作不要涉及到当前所lo ...

  8. MyBatis拦截器原理探究

    MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...

  9. insert into select 主键自增_springboot2结合mybatis拦截器实现主键自动生成

    点击上方蓝字关注我们 1 01 前言 前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键.于是我就问他,那你们数据库表设置主键自动递增不就得了.他的回答是他 ...

  10. Mybatis 拦截器介绍

    Mybatis 拦截器介绍 1.1 目录 1.2 前言 1.3 Interceptor接口 1.4 注册拦截器 1.5 Mybatis可拦截的方法 1.6 利用拦截器进行分页 拦截器的一个作用就是我们 ...

最新文章

  1. Google Android向华为“闭源”,华为手机迎来至暗时刻!
  2. 听妈妈的话-07年感动的延续
  3. 拒绝从入门到放弃_《Openstack 设计与实现》必读目录
  4. php mysql 查询每隔一段时间插入的数据_SQL查询某个时间段共多少条数据
  5. Cant get connection to Zookeeper
  6. VScode 常用快捷键
  7. [转载] Python中定义函数,循环语句,条件语句
  8. java okhttp3 工具类,Retrofit+okhttp+Rxjava网络请求工具类
  9. macos 开发环境配置
  10. qt如何在label中显示汉字_工控机中如何实现多屏显示
  11. Intellij IDEA远程debug教程实战和要点总结
  12. 智能药盒 树莓派与Arduino实现药板自助取药
  13. 电脑浏览器下载速度很慢怎么办
  14. 【快速上手教程2】疯壳·开源编队无人机-硬件资源简介
  15. arcengine java_浅析 ArcEngine Java - EngineViewer 例子
  16. Mac删除多余的输入输出设备,删除EasyConnectAudio
  17. 网站本地化翻译、建设助力企业拓展全球市场 安睿杰翻译
  18. 《Python程序设计》实验四 Python综合实践实验报告
  19. 使用并行计算改进基于独立 Metropolis-Hastings 的估计
  20. 2021最新 MySQL面试题精选(附刷题小程序)

热门文章

  1. 公交车上应不应该给老人让座?
  2. IPv4和IPv6有什么不同
  3. 如何快速进入一个陌生的领域,高手通常用这三步
  4. 想赚钱是好事,但盲目创业就容易悲剧
  5. 直播带货,碾压无数上市公司
  6. 职场中混日子的人都有这几种习惯
  7. Go官方库RPC开发指南
  8. 算法的基本控制结构之选择结构
  9. MySql基础汇总-DDL DML DQL DCL,存储过程,事务,触发器,函数等
  10. 计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)...