当前位置:首页 > 科技  > 软件

一篇聊聊Mybatis插件开发

来源: 责编: 时间:2023-09-21 20:48:26 472观看
导读Mybatis的插件,主要用于在执行sql前后,对sql进行封装加工,或者在sql执行后,对数据进行加工处理。常用于一些公共数据操作处理,例如:分页插件,在执行sql查询前增加分页参数多租户系统中,增加租户ID参数。增加更新时间、创建时

Mybatis的插件,主要用于在执行sql前后,对sql进行封装加工,或者在sql执行后,对数据进行加工处理。常用于一些公共数据操作处理,例如:OBo28资讯网——每日最新资讯28at.com

  1. 分页插件,在执行sql查询前增加分页参数
  2. 多租户系统中,增加租户ID参数。
  3. 增加更新时间、创建时间、更新人、创建人的参数信息。
  4. 数据权限中,增加参数查询。

插件开发过程

确定需要拦截的签名

指定需要拦截的方法,通过方法签名来指定,方法签名即指定哪个类的哪个方法+方法参数。这里的类不能随便写,只能从以下几个类中选,也就是说,MyBatis 插件可以拦截四大对象中的任意一个。OBo28资讯网——每日最新资讯28at.com

  • Executor 是执行 SQL 的全过程,包括组装参数,组装结果集返回和执行 SQL 过程,都可以拦截。
  • StatementHandler 是执行 SQL 的过程,我们可以重写执行 SQL 的过程。
  • ParameterHandler 是拦截执行 SQL 的参数组装,我们可以重写组装参数规则。
  • ResultSetHandler 用于拦截执行结果的组装,我们可以重写组装结果的规则。

我们来看以下mybatisplus的插件配置的签名:OBo28资讯网——每日最新资讯28at.com

@Intercepts(    {        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),        @Signature(type = StatementHandler.class, method = "getBoundSql", args = {}),        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),        @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}),    })public class MybatisPlusInterceptor implements Interceptor {//...}

type指定四大类型中的任意一个,method指定拦截类型中方法,args指定方法参数。例如:OBo28资讯网——每日最新资讯28at.com

@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})

指定了拦截StatementHandler的prepare方法,方法有两个参数,一个是Connection类型,另一个是Integer类型。OBo28资讯网——每日最新资讯28at.com

public interface StatementHandler {  Statement prepare(Connection connection, Integer transactionTimeout)      throws SQLException;            //....      }

插件接口定义

在 MyBatis 中开发插件,需要实现 Interceptor 接口。接口的定义如下:OBo28资讯网——每日最新资讯28at.com

public interface Interceptor {   Object intercept(Invocation invocation) throws Throwable;   Object plugin(Object target);   void setProperties(Properties properties); }
  • intercept 方法:它将直接覆盖你所拦截对象原有的方法,因此它是插件的核心方法。通过 invocation 参数可以反射调度原来对象的方法。
  • plugin 方法:target 是被拦截对象,它的作用是给被拦截对象生成一个代理对象,并返回它。为了方便 MyBatis 使用 org.apache.ibatis.plugin.Plugin 中的 wrap 静态方法提供生成代理对象。
  • setProperties 方法:允许在 plugin 元素中配置所需参数,方法在插件初始化的时候就被调用了一次,然后把插件对象存入到配置中,以便后面再取出。

实现插件

创建个类实现Interceptor接口,并且在实现类上指定方法签名即可。OBo28资讯网——每日最新资讯28at.com

最后需要在mybatis配置文件中配置插件OBo28资讯网——每日最新资讯28at.com

<plugins>        <plugin interceptor="com.yjw.demo.mybatis.common.page.PageInterceptor">        </plugin>    </plugins>

最后建议看一下MybatisPlusInterceptor的实现,里面还使用到了责任链设计模式。OBo28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10908-0.html一篇聊聊Mybatis插件开发

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一起聊聊GraalVM for JDK 21

下一篇: C++函数式编程:提高代码表达力和可维护性

标签:
  • 热门焦点
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top