老年人教程:MyBatis拦截器动态修改SQL(更新与插入)语句

2023-10-31

注:本文编写与 2019年12月17日, 内容可能存在时效性问题。
数据库使用MySQL5.7 集成于SpringBoot 2.0.X , 引用国产的开源工具类Hutool

本教程建议显示大纲视图 配合食用

一 、简介

1. 设定使用场景

任意 insert 、update 语句,都需要记录下语句的操作用户(CREATOR), 但由于系统早期设计不规范,大量SQL语句中,部分有写入CREATOR部分没有CREATOR,现在需要设计一段代码,能够自动拦截下所有的insert和update 语句,自动添加user 字段,及其字段值;

例如插入语句:

insert into table(id,name,age) values("efdefbb1970b486f8985fa19ab3ab22e","筱黄舒",12);
# 拦截后修改成
insert into table(id,name,age,createor) values("efdefbb1970b486f8985fa19ab3ab22e","筱黄舒",12,"admin");

2. 教程所用到的框架

此处列出 pom.xml 所依赖的一些包的版本,其中用到hutool这个工具类

<properties>
  <java.version>1.8</java.version>
  <hutool-all.version>4.5.1</hutool-all.version>
  <spring-boot-start.version>2.0.7.RELEASE</spring-boot-start.version>
  <druid-spring-boot-starter.version>1.1.10</druid-spring-boot-starter.version>
  <mysql-connector-java.version>5.1.47</mysql-connector-java.version>
  <spring-boot-start-mybatis.version>2.0.0</spring-boot-start-mybatis.version>
  .......
</properties>

二、拦截器

2.1 创建拦截器

@Intercepts({
   @Signature(
      type = Executor.class, method = "update",
      args = {
   MappedStatement.class, Object.class})})
@Component
public class demo implements Interceptor {
   
   private static final int PARAMETER_INDEX =  1;

private static final int MAPPED_STATEMENT_INDEX  = NumConstant.COMMON_NUMBER_ZERO;

private static final String UPDATE_SQL_TYPE = "Update";
private static final String INSERT_SQL_TYPE = "Insert";

private Logger logger  = LoggerFactory.getLogger(ModifyInterceptor.class);

private static LRUCache<String, Boolean> modifyCache = new LRUCache<>(Byte.MAX_VALUE);
private static LRUCache<String, Boolean> insertCache = new LRUCache<>(Byte.MAX_VALUE);
   
   /**
   * 拦截主要的逻辑
   */   
   @Override
   public Object intercept(Invocation invocation) throws Throwable {
   
      return null;
   }


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


   @Override
   public void setProperties(Properties properties) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

老年人教程:MyBatis拦截器动态修改SQL(更新与插入)语句 的相关文章

随机推荐

  • 328. 奇偶链表-链表拆分合并

    一 题目描述 给定单链表的头节点 head 将所有索引为奇数的节点和索引为偶数的节点分别组合在一起 然后返回重新排序的列表 第一个节点的索引被认为是 奇数 第二个节点的索引为 偶数 以此类推 请注意 偶数组和奇数组内部的相对顺序应该与输入时
  • 坏苹果是团队的毒药

    最近一期的 美国生活 采访了WillFelps 他是华盛顿大学的一位教授 曾经组织过一次社会学实验来证明 坏苹果 的出奇强大的影响力 译者注 美国生活 This American Life 是一档叙事类的广播节目 每周一期 在超过500家电
  • ubuntu10.04和12.04 上cpan的安装步骤及常见问题解决方法

    在我们用 perl 编写程序的时候 会要用到很多的 perl module 这种情况下就需要安装程序所需要的 module 然而这些module通常都是在www cpan org网站上面抓的 所以我们可以通过安装cpan来安装perl程序需
  • mysql 备忘录

    文章目录 rownum 版本 DDL DML insert insert into x with recursive mysql8 0 临时表 常用 存储过程 数据导出 导入 mysqldump load data csv 比 insert
  • Go语言并发之美:解释其中内核、外延

    多核处理器越来越普及 那有没有一种简单的办法 能够让我们写的软件释放多核的威力 答案是 Yes 随着Golang Erlang Scale等为并发设计的程序语言的兴起 新的并发模式逐渐清晰 正如过程式编程和面向对象一样 一个好的编程模式需要
  • 短信消息通知服务-spring定时计划任务quartz(一)

    集成短信消息与平台服务 希望能够在工作台中的每天的值班计划安排表中获取相关数据通知到每个当天值班人员 达到消息的畅通及时性 当中涉及到的技术有spring quartz等 具体步骤如下 一 编写业务类 package com greedc
  • 在微信小程序中怎样阻止冒泡事件?

    在微信小程序当中 当两个包含的视图都使用了bindtap函数来绑定点击事件的话 就会发生冒泡事件 即点击内部事件时将同时触发外部事件 如果我们要想阻止冒泡事件的发生 将被包含在内部的bindtap该为catchtap即可 下面请看具体事例
  • win10远程连接win7 使用win自带远程连接

    1 右键计算机打开属性 2 点击高级设置 3 勾选容许连接 确定 4 win r 打开运行输入cmd 5 查看机器ip地址 6 在另一台电脑打开远程连接 6 打开之后输入刚才查看的IP地址 7 输入用户名和密码 如果没有就在被连接的电脑创建
  • 构造BufferWriter和BufferReader实现高效的对象序列化和反序列化

    在之前的文章讲术了如何设计一个简单的网络缓冲区和缓冲池 在 net网络应用中有一个普遍的问题就是如何把对象写入缓冲和从缓冲中读取数据还原对象 在这里会实现一个Writer和Reader方便地把信息写入缓冲区和从缓冲区读取 先看下Writer
  • C语言基础入门48篇_38_函数指针与typedef(函数指针即指向函数的指针、函数指针定义int (*pfn)(int)、typedef给数据类型起别名,起到的作用一致、typedef简化函数指针)

    1 函数指针的定义 函数就是在内存中的一段机器码 也是有地址的 函数名即为函数的首地址 使用 函数名也可以得到函数地址 include
  • chrome去广告插件 &去掉百度热搜

    1 每次查资料 一堆很乱的广告 脱发 牙齿 甚是恐怖 2 每次百度搜东西 每次右侧都有百度热搜 总是忍不住点进去 浪费时间 推荐 使用前 使用后
  • QT操作excel的两种方式 QT基础入门【Excel的操作】

    QT操作excel的方式有两种 QAxObject 和QtXlsx QAxObject是通过调用office或者wps组件来实现对excel图表的操作的 只有装office软件或者wps软件就可以实现 但是 如果只装了office软件 有时
  • validform表单验证插件最终版

    做个笔记 以后直接用吧 报名界面
  • C++类上使用属性(__declspec property)

    原始代码如下 class A private int m nIndex public int getIndex return m nIndex void setIndex int value m nIndex value 如果采用属性方式实
  • JSP页面forEach使用

    1 在jsp页面引入jstl标签 2 后端传入前端list ServletActionContext getRequest setAttribute List别名 detailList 3 前端jsp接收 table tr th 列名称A
  • 开发实例系列:一、舒尔特方格小游戏,付源码和APK

    舒尔特方格 生成随机数 从小到大依次点击 时间越短越好 底部带源码和apk下载 注意功能点 一 使用TableLayout自动生成表格 这一部分是参考网上的帖子 找不到原连接了 自定义TableLayout 以下是源码 public cla
  • Rocket学习原理以及命令【详细】

    运行原理图 NameServer 相当于一个注册中心 把所有信息注册到其中 Broker 存储消息的 Producer 消息生产者 Consumer 消费者 总结 首先启动NameServer 然后启动Borker把ip地址等信息注册到Na
  • 腾讯云服务器+ContOS 7.6安装MySql(三)

    腾讯云服务器 ContOS 7 6安装MySql 三 配置mysql 首先来看下我们安装了MySQL以后 还剩多少磁盘空间 登录腾讯云控制台 实例 资源使用情况 系统盘 大概用来3 3G左右 磁盘刚开始好像是2 9多G 再把下载好的安装包删
  • 正则表达式之字符串的replace方法

    1 首先 正则表达式是什么 正则表达式是用于匹配字符串中字符组合的模式 在 JavaScript中 正则表达式是对象 这些模式被用于 RegExp 的 exec 和 test 方法 以及 String 的 match matchAll re
  • 老年人教程:MyBatis拦截器动态修改SQL(更新与插入)语句

    注 本文编写与 2019年12月17日 内容可能存在时效性问题 数据库使用MySQL5 7 集成于SpringBoot 2 0 X 引用国产的开源工具类Hutool 本教程建议显示大纲视图 配合食用 一 简介 1 设定使用场景 任意 ins