@Intercepts-mybatis拦截器
查询拦截器
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拦截器相关推荐
- 真正理解mybatis拦截器以及Interceptor和Plugin作用
看了很多博客文章和,mybatis 的拦截器概念还是不能很好理解, 可能是因为自己基础不好或者理解方式和他人不同吧,所以决定自己花时间好好捋捋, 然后把理解后的总结记录下来,供他人参考,也许你们的理解 ...
- MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
用MyBatis结果集拦截器做过这样一个需求: 由于项目需求经常变动,项目MySQL数据库都是存放JSON字符串,例如:用户的基本信息随着版本升级可能会有变动 数据表 CREATE TABLE `ac ...
- list mybatis 接收 类型_基于mybatis拦截器实现的一款简易影子表自动切换插件
近期因工作需要,小编基于mybatis拦截器开发了一款简易影子表自动切换插件,可以根据配置实现动态修改表名,即将对原source table表的操作自动切换到对target table表的操作.该插件 ...
- 面试官:你能说说MyBatis拦截器原理吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Format cnblogs.com/fangjian042 ...
- MyBatis拦截器原理探究MyBatis拦截器原理探究
MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis拦截 ...
- MyBatis拦截器有哪些以及分析
MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执行过程中 ...
- Mybatis拦截器 mysql load data local 内存流处理
Mybatis 拦截器不做解释了,用过的基本都知道,这里用load data local主要是应对大批量数据的处理,提高性能,也支持事务回滚,且不影响其他的DML操作,当然这个操作不要涉及到当前所lo ...
- MyBatis拦截器原理探究
MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...
- insert into select 主键自增_springboot2结合mybatis拦截器实现主键自动生成
点击上方蓝字关注我们 1 01 前言 前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键.于是我就问他,那你们数据库表设置主键自动递增不就得了.他的回答是他 ...
- Mybatis 拦截器介绍
Mybatis 拦截器介绍 1.1 目录 1.2 前言 1.3 Interceptor接口 1.4 注册拦截器 1.5 Mybatis可拦截的方法 1.6 利用拦截器进行分页 拦截器的一个作用就是我们 ...
最新文章
- Google Android向华为“闭源”,华为手机迎来至暗时刻!
- 听妈妈的话-07年感动的延续
- 拒绝从入门到放弃_《Openstack 设计与实现》必读目录
- php mysql 查询每隔一段时间插入的数据_SQL查询某个时间段共多少条数据
- Cant get connection to Zookeeper
- VScode 常用快捷键
- [转载] Python中定义函数,循环语句,条件语句
- java okhttp3 工具类,Retrofit+okhttp+Rxjava网络请求工具类
- macos 开发环境配置
- qt如何在label中显示汉字_工控机中如何实现多屏显示
- Intellij IDEA远程debug教程实战和要点总结
- 智能药盒 树莓派与Arduino实现药板自助取药
- 电脑浏览器下载速度很慢怎么办
- 【快速上手教程2】疯壳·开源编队无人机-硬件资源简介
- arcengine java_浅析 ArcEngine Java - EngineViewer 例子
- Mac删除多余的输入输出设备,删除EasyConnectAudio
- 网站本地化翻译、建设助力企业拓展全球市场 安睿杰翻译
- 《Python程序设计》实验四 Python综合实践实验报告
- 使用并行计算改进基于独立 Metropolis-Hastings 的估计
- 2021最新 MySQL面试题精选(附刷题小程序)