写点什么

一篇聊聊 Mybatis 插件开发

  • 2023-09-22
    福建
  • 本文字数:1488 字

    阅读完需:约 5 分钟

一篇聊聊Mybatis插件开发

Mybatis 的插件,主要用于在执行 sql 前后,对 sql 进行封装加工,或者在 sql 执行后,对数据进行加工处理。常用于一些公共数据操作处理,例如:


  1. 分页插件,在执行 sql 查询前增加分页参数

  2. 多租户系统中,增加租户 ID 参数。

  3. 增加更新时间、创建时间、更新人、创建人的参数信息。

  4. 数据权限中,增加参数查询。

插件开发过程

确定需要拦截的签名

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


  • Executor 是执行 SQL 的全过程,包括组装参数,组装结果集返回和执行 SQL 过程,都可以拦截。

  • StatementHandler 是执行 SQL 的过程,我们可以重写执行 SQL 的过程。

  • ParameterHandler 是拦截执行 SQL 的参数组装,我们可以重写组装参数规则。

  • ResultSetHandler 用于拦截执行结果的组装,我们可以重写组装结果的规则。


我们来看以下 mybatisplus 的插件配置的签名:


@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 指定方法参数。例如:


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


指定了拦截 StatementHandler 的 prepare 方法,方法有两个参数,一个是 Connection 类型,另一个是 Integer 类型。


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

插件接口定义

在 MyBatis 中开发插件,需要实现 Interceptor 接口。接口的定义如下:


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 接口,并且在实现类上指定方法签名即可。

最后需要在 mybatis 配置文件中配置插件:


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


最后建议看一下 MybatisPlusInterceptor 的实现,里面还使用到了责任链设计模式。

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
一篇聊聊Mybatis插件开发_sql_互联网工科生_InfoQ写作社区