首页 > 其他分享 >mybatis拦截器:实现拦截update语句插入列值

mybatis拦截器:实现拦截update语句插入列值

时间:2023-11-17 19:15:59浏览次数:37  
标签:拦截器 mappedStatement Object update sql mybatis StatementHandler public

1、修改sql的时机

在预编译SQL(prepare方法)前加入修改的逻辑。
可以对sql处理也可以对映射类做处理(本例是对映射类做处理)。

2、准备的xml文件

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC 
        "-//mybatis.org//DTD Config 3.0//EN" 
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <plugins>
        <plugin interceptor="拦截器的完整包名"/>
    </plugins>
</configuration>

3、添加的拦截器类

在 Update 语句中,自动填充当前 updateTime 时间。

@Slf4j
@Component
@Intercepts({
        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class UpdateTimeInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {

        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();

        /* 先拦截到RoutingStatementHandler,里面有个StatementHandler类型的delegate变量,
         * 其实现类是BaseStatementHandler,然后就到BaseStatementHandler的成员变量mappedStatement。
         */
        MetaObject metaObject = MetaObject.forObject(
            statementHandler, 
            SystemMetaObject.DEFAULT_OBJECT_FACTORY, 
            SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, 
            new DefaultReflectorFactory()
        );
        MappedStatement mappedStatement = 
              (MappedStatement) metaObject.getValue("delegate.mappedStatement");

        // sql语句类型:
        // UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH、
        // update, SqlCommandType 是个 enum
        String sqlCommandType = mappedStatement.getSqlCommandType().toString();
        BoundSql boundSql = statementHandler.getBoundSql();

        //得到的映射类和sql
        Object obj = boundSql.getParameterObject();
        String sql = boundSql.getSql();

        //在update语句的时候加入updateTime变量,如果存在被覆盖,不存在加入
        if (sqlCommandType.equals("UPDATE")) {
            ReflectUtil.setFieldValue(obj, "updateTime", LocalDateTime.now());
        }

        return invocation.proceed();
    }


    @Override
    public Object plugin(Object o) {
        return Plugin.wrap(o, this);
    }

    @Override
    public void setProperties(Properties properties) {

    }


}

Ref

标签:拦截器,mappedStatement,Object,update,sql,mybatis,StatementHandler,public
From: https://www.cnblogs.com/eddyz/p/17839489.html

相关文章

  • springboot 集成jwt 登录 拦截器获取token 解析token放入holder中
    一、依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>......
  • 源码解析axios拦截器
    从源码解析axios拦截器是如何工作的axios拦截器的配置方式axios中有两种拦截器:axios.interceptors.request.use(onFulfilled,onRejected,options):配置请求拦截器。onFulfilled方法在发送请求前执行,接收config对象,返回一个新的config对象,可在此方法内修改config对......
  • OTA A/B 分区升级 update_engine简介update_engine简介
    近期猛然发现公司的项目都已经换成了AB升级,AB升级之前一直有所了解,只是一直都没有去仔细查看过其具体升级流程,这两天抽空捋了捋,简单整理下。AB升级(谷歌官网叫法无缝更新)是自android7.0开始新增的一种android设备升级方式,只是这种方式对设备存储要求高,所以之前没有怎么被国内手机厂......
  • Mybatis配置
    Mybatis配置常用依赖(pom.xml)<!--添加log4j依赖--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!--添加mybatis依赖--><dependency......
  • mybatisplus关于驼峰命名法与下划线的映射
    今天遇到一个很坑的事情,我在测试之前的案例的时候我有一个字段的名字是typeId,我调试之后发现插入出现了错误。开启sql日志之后我发现mybatisplus自动把我的typeId改成type_id了。无奈之下我只能把数据库、实体类的驼峰命名法改成下划线###SQL:SELECTid,name,description,t......
  • Mybatis和其他主流框架的整合使用
    Mybatis简介MyBatis历史MyBatis最初是Apache的一个开源项目iBatis,2010年6月这个项目由ApacheSoftwareFoundation迁移到了GoogleCode。随着开发团队转投GoogleCode旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“internet”和“abat......
  • Idea配置mybatis核心配置文件模板
    在我们日常开发中不可能将mybatis相关配置文件全部记住,我们这里通过在idea中配置模板快捷生成(本文演示idea版本为2022.02.01)。方法如下:1.进入idea设置File->settings2.选择Editor->FileandCodeTemplates->Files3.点击“+”创建模板,对模板命名,设置模板类型,设置模板默认名字(模板中......
  • Mybatis常见问题
    1.JDBC1.1JDBC是什么高级语言的应用程序需要特定的方式访问数据库。特定的方式:JDBC,ODBCJDBC本质上是一系列的应用程序接口(API)通过JAVA语言访问任何结构化数据库通过JDBCAPI写出的程序,能够将SQL语句发送到相应的任何一种数据库通过使用JDBC,开发人员可以很方便地将SQL语句传送给几......
  • .NET 过滤器、中间件、AOP、拦截器及其应用
    一、过滤器(Filter)    一共5种、 AuthorizationFilter,ResourceFilter,ExceptionFilter,ActionFilter,ResultFilter    1.1、ExceptionFilter        新增全局异常过滤器GlobalExceptionFilter.cs。        当出现异常时进......
  • SpringBoot和mybatisPlus得核心知识点
    SpringBoot自动配置(Auto-Configuration):SpringBoot核心特性之一是自动配置。它尝试根据项目的依赖和内容推断应用程序应该如何配置。这简化了开发人员的工作,因为他们无需手动配置大量的设置。起步依赖(StarterDependencies):SpringBoot提供了一系列预配置的依赖项,称为“起......