https://mybatis.org/mybatis-3/zh/configuration.html#plugins
自定义拦截器
- 实现
Interceptor
接口 - 重写
intercept
方法,其余两个接口有默认实现,不用改public interface Interceptor { Object intercept(Invocation invocation) throws Throwable; default Object plugin(Object target) { return Plugin.wrap(target, this); } default void setProperties(Properties properties) { // NOP } }
自定义实现
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
拦截执行Executor.class
拦截方法query
方法参数args
@Intercepts(
{
@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 MyInterceptor implements Interceptor {
/**
* 后置拦截,拦截所有的查询方法
* 判断返回结果是不是带有图片,如果是,并且把图片的相对路径URI替换成绝对路径URL
*/
@SuppressWarnings("all")
private void doAfter(Object proceed) {
List list;
Object[] objects;
if (proceed instanceof AbstractImage) {
// one object
AbstractImage abstractImage = (AbstractImage) proceed;
Optional.of(abstractImage).map(AbstractImage::getImage).map(FileUploader::downloadFile).ifPresent(abstractImage::setImage);
} else if (proceed instanceof List && CollectionUtil.isNotEmpty(list = (List) proceed) && list.get(0) instanceof AbstractImage) {
// list
list.forEach(abstractImage -> {
AbstractImage temp = (AbstractImage) abstractImage;
Optional.ofNullable(temp.getImage()).map(FileUploader::downloadFile).ifPresent(temp::setImage);
});
} else if (proceed instanceof Object[] && ArrayUtil.isNotEmpty(objects = (Object[]) proceed) && objects[0] instanceof AbstractImage) {
// array
for (Object object : objects) {
AbstractImage abstractImage = (AbstractImage) object;
Optional.ofNullable(abstractImage.getImage()).map(FileUploader::downloadFile).ifPresent(abstractImage::setImage);
}
}
}
@Override
public Object intercept(Invocation invocation) throws Throwable {
// do before
// invocation.getMethod();
// invocation.getTarget();
// invocation.getArgs();
Object proceed = invocation.proceed();
doAfter(proceed);
return proceed;
}
}
注入spring
@Bean
public Interceptor myInterceptor() {
return new MyInterceptor();
}