在MyBatis
中,有一个插件的功能,开发者可以通过自己编辑的插件,在MyBatis
中为某个SQL
执行时阶段中间插入,从而实现自己的逻辑,或是增强SQL
语句,或是记录处理其他信息。
这样的扩展好处非常明显,一来大大增加了框架的灵活性,而来开发者可以根据自己的功能需求,从实际出发,对MyBatis
进行增强。
通过本篇文章,可以清晰明了的学习到MyBatis
插件。
在MyBatis
中,它有几个核心可以进行实现,分别是
SQL
语句的执行与事务管理Statement
预编译与参数设置等JDBC
返回的结果处理成开发者所需要的类型结果下面我们会用到其中一个,来完成我们的MyBatis
插件,作为入门学习案例,此代码不会很复杂
首先,我们需要实现org.apache.ibatis.plugin.Interceptor
这个接口
并且在修饰一个@Intercepts
注解,这个注解就可以使用到上面这四个接口了(我这边使用到的是Executor
)
这个注解可以拦截多个方法,看看源码就全部懂了
那么接下来,我们就针对query
方法,做出一定的日志打印,代码如下
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;
}
}
就是简单的,计算了一下耗时,输出了一下返回的行数
启动一下程序,查看下最后的效果如何
结果已打印,这个简单的插件就完成了
上面演示了一个query
方法的耗时,结果数量打印的插件,那么如果需要将参数添加进去SQL
语句打印出来,如何编写呢
这个时候,我们就要看其他的接口了,上面不是列举了4
个接口么,大家在完成入门使用后,再试试其他的插件如何编写
比如说写一个分页插件,一个租户插件,一个完整SQL
日志打印插件等
好,通过这个入门案例,可以打开大家对MyBatis
的插件探索
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。