首页 > 其他分享 >mybatis拦截器 (拦截器不生产)

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

时间:2022-12-20 21:33:37浏览次数:54  
标签:拦截器 ibatis 生产 import mybatis org apache class

背景:

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

  • 在项目中,要更新数据表的审计字段,比如 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<SqlSessionFactory> sqlSessionFactoryList;

    @PostConstruct
    public void addMyInterceptor() {
        LogInterceptor e = new LogInterceptor();
        for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
            sqlSessionFactory.getConfiguration().addInterceptor(e);
        }
    }
}




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

附录几个参考的博文:

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

标签:拦截器,ibatis,生产,import,mybatis,org,apache,class
From: https://www.cnblogs.com/aaacarrot/p/16995126.html

相关文章

  • Mybatis-plus
    1.Mybatis-plusMybatis-plus相关文档https://weishao-996.github.io/2022/10/25/黑马程序员-Mybatis-Plus/Mybatis代码生成器https://weishao-996.github.io/2022/1......
  • 唯品会Redis cluster大规模生产实践经验
    嘉宾:陈群很高兴有机会给大家分享rediscluster的生产实践经验。目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作。Outline一、生产应用场景二、存......
  • 生产环境 Redis 优化记录
    1.现状描述1.1.生产环境生产环境配置6套Redis服务。1、配置为3节点物理服务器的Redis缓存群集,通过控制应用的主、备处于不同的物理服务器实现Redis访问的高可用,按不同......
  • 解决安全生产知识题库小程序加载超大数据无法渲染的问题
    遇到问题在搭建安全生产知识竞赛题库小程序的时候,由于题库的题量太大了,一次性加载setData或者多次concat后setData,其实它俩都是一次性setData,这样就会造成加载超大数据无法......
  • Spring 4 and MyBatis Java Config
    TL;DRWiththeJavaConfigenhancementsinSpring4,younolongerneedxmltoconfigureMyBatisforyourSpringapplication.Usingthe ​​@MapperScan​​​ann......
  • 【sping框架】 springboot框架中如何整合mybatis框架?
    1.引入依赖spring-boot-stater-webmysql相关mysql驱动druid数据源mybatis相关的(mybatis-spring-boot-stater)依赖(mybatismybatis-spring)2.书写配置 a.开启......
  • MyBatis打印SQL语句
     1.Spring+MyBatis这种框架一般还使用的XML配置,所以要在MyBatis的配置文件中加以下信息,就可以打印日志了。<configuration><settings><!--打......
  • SAP Gateway 在开发系统和生产系统上的缓存控制
    SAPGateway元数据缓存可以启用和禁用,并且在非生产系统中默认停用。我们推荐以下缓存设置:开发系统应该禁用SAPGateway元数据缓存,以便始终获取最新的元数据(默认设置)......
  • mybatis resultMap collection聚合String
    背景主表index_dict_data内容表index_dict_cn_name期望输出数据结构:即联表之后根据indexId聚合,然后将cnName字段聚合到一个List<String>中[{"in......
  • 记一次 .NET 某安全生产信息系统 CPU爆高分析
    一:背景1.讲故事今天是......