java怎么写插件_MyBatis 如何编写一个自定义插件?

本文介绍了如何在MyBatis中自定义插件,通过实现Interceptor接口并指定拦截的方法签名,实现对Executor类的query方法的拦截。在插件中,可以获取并操作方法参数,如打印参数、目标对象等信息,并能修改返回结果,例如只获取查询结果的第一个对象。此外,文章还提供了MyBatis配置文件中启用插件的示例,并提到了MyBatis分页插件PagerHelper作为学习参考。

先看如何自定义一个插件

1、新建类实现 Interceptor 接口,并指定想要拦截的方法签名

/**

* MyBatis 插件

*/

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})

public class ExamplePlugin implements Interceptor {

@Override

public Object intercept(Invocation invocation) throws Throwable {

for (Object arg : invocation.getArgs()) {

System.out.println("参数:" + arg);

}

System.out.println("方法:" + invocation.getMethod());

System.out.println("目标对象:" + invocation.getTarget());

Object result = invocation.proceed();

//只获取第一个数据

if (result instanceof List){

System.out.println("原集合数据:" + result);

System.out.println("只获取第一个对象");

List list = (List)result;

return Arrays.asList(list.get(0));

}

return result;

}

}

2、MyBatis 配置文件中添加该插件

测试代码

System.out.println("------userMapper.deleteUsers()------");

//删除 user

userMapper.deleteUsers();

System.out.println("------userMapper.insertUser()------");

//插入 user

for (int i = 1; i <= 5; i++) {

userMapper.insertUser(new User(i, "ConstXiong" + i));

}

System.out.println("------userMapper.selectUsers()------");

//查询所有 user

List users = userMapper.selectUsers();

System.out.println(users);

打印结果

------userMapper.deleteUsers()------

------userMapper.insertUser()------

------userMapper.selectUsers()------

参数:org.apache.ibatis.mapping.MappedStatement@58c1c010

参数:null

参数:org.apache.ibatis.session.RowBounds@b7f23d9

参数:null

方法:public abstract java.util.List org.apache.ibatis.executor.Executor.query(org.apache.ibatis.mapping.MappedStatement,java.lang.Object,org.apache.ibatis.session.RowBounds,org.apache.ibatis.session.ResultHandler) throws java.sql.SQLException

目标对象:org.apache.ibatis.executor.CachingExecutor@61d47554

原集合数据:[User{id=1, name='ConstXiong1', mc='null'}, User{id=2, name='ConstXiong2', mc='null'}, User{id=3, name='ConstXiong3', mc='null'}, User{id=4, name='ConstXiong4', mc='null'}, User{id=5, name='ConstXiong5', mc='null'}]

只获取第一个对象

[User{id=1, name='ConstXiong1', mc='null'}]

插件功能的官网说明

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

ParameterHandler (getParameterObject, setParameters)

ResultSetHandler (handleResultSets, handleOutputParameters)

StatementHandler (prepare, parameterize, batch, update, query)

完整 Demo:

PS:MyBatis 分页插件 PagerHelper,就是一个很好的插件学习例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值