前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >如何写一个自己的MyBatis插件

如何写一个自己的MyBatis插件

原创
作者头像
半月无霜
发布2025-02-02 15:00:01
发布2025-02-02 15:00:01
9300
代码可运行
举报
文章被收录于专栏:半月无霜半月无霜
运行总次数:0
代码可运行

一、前言

MyBatis中,有一个插件的功能,开发者可以通过自己编辑的插件,在MyBatis中为某个SQL执行时阶段中间插入,从而实现自己的逻辑,或是增强SQL语句,或是记录处理其他信息。

这样的扩展好处非常明显,一来大大增加了框架的灵活性,而来开发者可以根据自己的功能需求,从实际出发,对MyBatis进行增强。

通过本篇文章,可以清晰明了的学习到MyBatis插件。

二、MyBatis插件

MyBatis中,它有几个核心可以进行实现,分别是

  • Executor:执行器,负责SQL语句的执行与事务管理
  • StatementHandler:SQL语法构建器,处理具体的SQL语句,包括Statement预编译与参数设置等
  • ParameterHandler:参数处理器,负责将用户传递的参数转换成JDBC可识别的参数
  • ResultSetHandler:结果处理器,负责将JDBC返回的结果处理成开发者所需要的类型结果

下面我们会用到其中一个,来完成我们的MyBatis插件,作为入门学习案例,此代码不会很复杂

首先,我们需要实现org.apache.ibatis.plugin.Interceptor这个接口

并且在修饰一个@Intercepts注解,这个注解就可以使用到上面这四个接口了(我这边使用到的是Executor

这个注解可以拦截多个方法,看看源码就全部懂了

image-20250202143138346
image-20250202143138346

那么接下来,我们就针对query方法,做出一定的日志打印,代码如下

代码语言:javascript
代码运行次数:0
复制
package com.banmoon.plugin;
​
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
​
import java.util.List;
​
@Slf4j
@Component
@Intercepts({@Signature(type = Executor.class, method = "query",
        args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class SampleQueryPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        TimeInterval timer = DateUtil.timer();
        Object proceed = invocation.proceed();
        String intervalPretty = timer.intervalPretty();
        log.info("查询耗时:{}", intervalPretty);
        if (proceed instanceof List) {
            List<?> list = (List<?>) proceed;
            log.info("查询行数:{}", list.size());
        }
        return proceed;
    }
}

就是简单的,计算了一下耗时,输出了一下返回的行数

启动一下程序,查看下最后的效果如何

image-20250202145225305
image-20250202145225305

结果已打印,这个简单的插件就完成了

三、最后

上面演示了一个query方法的耗时,结果数量打印的插件,那么如果需要将参数添加进去SQL语句打印出来,如何编写呢

这个时候,我们就要看其他的接口了,上面不是列举了4个接口么,大家在完成入门使用后,再试试其他的插件如何编写

比如说写一个分页插件,一个租户插件,一个完整SQL日志打印插件等

好,通过这个入门案例,可以打开大家对MyBatis的插件探索

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、MyBatis插件
  • 三、最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档