mybatis拦截器(拦截器不生产) 您所在的位置:网站首页 mybatis和mybatis的区别 mybatis拦截器(拦截器不生产)

mybatis拦截器(拦截器不生产)

2023-03-16 05:11| 来源: 网络整理| 查看: 265

背景:

在一些需求下,使用拦截器会大大简化工作量也更加灵活:

在项目中,要更新数据表的审计字段,比如 create_time, creator, update_time, updator, 这些字段,如果每一个表对应的mapper 都去写一次,或每一个方法都去更新一下,这个工作量非常大并且不太友好,并且不够优雅。记录一些日志,比如执行sql时侯,要打印每一个sql执行了多久,那就要记录sql执行前的时间戳,执行后的时间戳,得到其执行时间,再打印。等等场景

在这些场景下,使用拦截器肯定会更加灵活且方法。

mybatis拦截器怎样做定义一个拦截器把这个拦截器交给spring容器管理如果项目里面使用了 com.github.pagehelper.PageInterceptor 拦截器可能会无效,则需要再定义一个 MybatisInterceptorAutoConfiguration

根据以上三点,进行详细说明

定义一个拦截器

简单示意一下怎样写。。。具体业务肯定不止这样子的

一个拦截器,主要是实现 Interceptor 这个接口,实现这个接口下的三个方法。然后在这个实现类加上 @Component 注解,就交给 spring容器管理了,所以1,2是一起的

import org.apache.ibatis.cache.CacheKey;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.BoundSql;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.Plugin;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.Properties;import lombok.extern.slf4j.Slf4j;@Slf4j@Component@Intercepts({ @Signature( method = "query", type = Executor.class, args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} ), @Signature( method = "query", type = Executor.class, args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class} ), @Signature( type = Executor.class, method = "update", args = {MappedStatement.class, Object.class} )})public class LogInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { log.info("begin >>>>>>>>>"); Object rest = invocation.proceed(); log.info("end >>>>>>>>>"); return rest; } @Override public Object plugin(Object o) { return Plugin.wrap(o, this); } @Override public void setProperties(Properties properties) { }}

定义一个 MybatisInterceptorAutoConfiguration

为什么要有这么一个类呢,主要是因为如果你的模块里面引用了 com.github.pagehelper.PageInterceptor,你自定义的拦截器会无效,是因为mybatis的拦截器这就是一个责任链,但是如果执行了 PageInterceptor,这个Interceptor比较特别,它自己执行完,就不往下传递链条了,即这个链会在它这里断开。所以加了其它的interceptor, 它们必须在 PageInterceptor 之前执行。具体可见代码:

import com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration;import org.apache.ibatis.session.SqlSessionFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.AutoConfigureAfter;import org.springframework.context.annotation.Configuration;@Configuration// 这一行很重要,因为interceptor 链的执行与添加是反序的,所以在 PageHelperAutoConfiguration 之后添加,才能先执行。@AutoConfigureAfter(PageHelperAutoConfiguration.class)public class MybatisInterceptorAutoConfiguration { @Autowired private List sqlSessionFactoryList; @PostConstruct public void addMyInterceptor() { LogInterceptor e = new LogInterceptor(); for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) { sqlSessionFactory.getConfiguration().addInterceptor(e); } }}

个人的笔记先记这么多吧。

附录几个参考的博文:

Mybatis拦截器PageHelper导致自定义Mybatis拦截器不生效Mybatis拦截器失效



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有