关于Mybatis拦截器的说明与使用
关于Mybatis拦截器的说明与使用
- 1 Mybatis拦截器说明
- Executor
- ParameterHandler
- ResultSetHandler
- StatementHandler
- Mybatis拦截器使用:
在日常工作中, 对于一些查询功能需要做到数据隔离的限制, 即不同用户查询的数据要不一样, 如何保证对业务程序低耦合, 又要保证功能的效果呢? 可以使用Mybatis提供插件,即Mybatis拦截器(详情可见下方官网)
Mybatis官网: https://mybatis.net.cn/configuration.html#plugins
1 Mybatis拦截器说明
Mybatis拦截器主要是拦截操作数据库的方法的调用, 并在拦截前后加上自定义的逻辑,从而实现最终功能的效果. 当然了, 也可以使用新的逻辑方法覆盖掉原有方法逻辑. 其设计的最初目的就是为了方便在某些时候可以实现自己的逻辑而不必去动mybatis固有的逻辑. 详情可见Mybatis官网-插件(plugins)部分.
Mybatis只能拦截特定对象的方法,使用范围如下:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
Executor
Mybatis中所有Mapper的执行都是通过Executor接口完成的, Executor是MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护.
代码:
public interface Executor {ResultHandler NO_RESULT_HANDLER = null;/*** 执行update/insert/delete*/int update(MappedStatement ms, Object parameter) throws SQLException;/*** 执行查询,先在缓存里面查找*/<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException;/*** 执行查询*/<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;/*** 执行查询,查询结果放在Cursor里面*/<E> Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds) throws SQLException;/*** 刷新Statement 批量返回结果*/List<BatchResult> flushStatements() throws SQLException;/*** 提交事物*/void commit(boolean required) throws SQLException;/*** 回滚事物*/void rollback(boolean required) throws SQLException;/*** 缓存key*/CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql);/*** 是否缓存*/boolean isCached(MappedStatement ms, CacheKey key);/*** 清楚缓存*/void clearLocalCache();void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key, Class<?> targetType);/*** 得到事物*/Transaction getTransaction();void close(boolean forceRollback);boolean isClosed();void setExecutorWrapper(Executor executor);}
ParameterHandler
ParameterHandler是负责对用户传递的参数转换成JDBC Statement 所需要的参数,主要用来设置参数
代码:
public interface ParameterHandler {Object getParameterObject();/*** 设置参数*/void setParameters(PreparedStatement ps)throws SQLException;}
ResultSetHandler
ResultSetHandler是负责将JDBC返回的ResultSet结果集对象转换成List类型的集合.
代码:
public interface ResultSetHandler {/*** 将Statement执行后产生的结果集(可能有多个结果集)映射为结果列表*/<E> List<E> handleResultSets(Statement stmt) throws SQLException;/*** 与上述一致*/<E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;/*** 处理存储过程执行后的输出参数*/void handleOutputParameters(CallableStatement cs) throws SQLException;}
StatementHandler
StatementHandler封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合等
代码:
public interface StatementHandler {/*** 从连接中获取一个Statement*/Statement prepare(Connection connection, Integer transactionTimeout)throws SQLException;/*** 设置statement执行里所需的参数*/void parameterize(Statement statement)throws SQLException;/*** 批量处理statement*/void batch(Statement statement)throws SQLException;/*** update/insert/delete语句 返回影响的行数*/int update(Statement statement)throws SQLException;/*** 执行查询*/<E> List<E> query(Statement statement, ResultHandler resultHandler)throws SQLException;/*** 执行查询*/<E> Cursor<E> queryCursor(Statement statement)throws SQLException;/*** 获取BoundSql, 主要是动态生成的SQL语句以及相应的参数信息*/BoundSql getBoundSql();/*** 获取ParameterHandler, 负责对用户传递的参数转换成JDBC Statement 所需要的参数*/ParameterHandler getParameterHandler();}
Mybatis拦截器使用:
只需实现 Interceptor 接口,并指定想要拦截的方法签名即可
Interceptor 代码:
public interface Interceptor {/*** 拦截要执行的方法, 在这个方法中自定义的逻辑*/Object intercept(Invocation invocation) throws Throwable;/*** 拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理* 1 拦截 当返回的是代理的时候我们可以对其中的方法进行拦截来调用intercept方法 -- Plugin.wrap(target, this)* 2 不拦截 当返回的是当前对象的时候 就不会调用intercept方法*/Object plugin(Object target);/*** 用于指定属性,注册当前拦截器的时候可以设置一些属性*/void setProperties(Properties properties);}
官方例子:
@Intercepts({@Signature(type= Executor.class,method = "update",args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {private Properties properties = new Properties();public Object intercept(Invocation invocation) throws Throwable {// implement pre processing if needObject returnObject = invocation.proceed();// implement post processing if needreturn returnObject;}public void setProperties(Properties properties) {this.properties = properties;}
}
<!-- mybatis-config.xml -->
<plugins><plugin interceptor="org.mybatis.example.ExamplePlugin"><property name="someProperty" value="100"/></plugin>
</plugins>
关于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 拦截器案件"背后一定还隐藏着某种设计动 ...
- 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 利用拦截器进行分页 拦截器的一个作用就是我们 ...
最新文章
- 祝贺!又一批清华大学长聘教授,来了!
- 使用 expect 命令执行自动分发系统
- ejb 2.0 3.0_定义EJB 3.1视图(本地,远程,无接口)
- 天津大学计算机专业怎么样,请问天大计算机专业的研究生怎么样啊?
- 在HTML中插入回车换行
- java事件 socket_java中有关socket通信的学习笔记
- 宝塔部署node项目_SFF一站式node服务管理平台实践
- 2018-2019-2 20165118 《网络对抗技术》Exp4 恶意代码分析
- git不能上传空目录和设备文件
- 递归构造格雷码c语言,递归构造格雷码
- win7计算机怎么优化驱动器,win7电脑怎么优化
- python for ArcGIS 绘制成都市板块地图
- 【Day5.4】高棉风格的柴瓦塔纳兰寺
- ZYNQ之路--程序固化教程
- 修改iOS工程的Organization Name
- 中国软件公司100强排名
- K哥有点上头:坚持写作2年,收入100万!
- mldonkey安装
- 【时序】TCCT:用于时间序列预测的紧耦合卷积 Transformer
- 【注册表大法】教你如何给 Win11 开启传统右键菜单