当前位置: 首页 > news >正文

使用mybatis的statementHander拦截器监控表和字段并发送钉钉消息

新建mybatis的statementHander拦截器拦截器 类

面试题:

2.实现

解析Sql时引入JSqlParser

JSqlParser 是一个 SQL 语句解析器。 它将 SQL转换为可遍历的 Java 类层次结构。 

<dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.6</version></dependency>

 添加拦截器代码:

package com.yy.config;import cn.hutool.core.collection.CollUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.smart.model.LocalUser;
import cn.smart.util.ThreadlocalUtil;
import com.yy.entity.BaseEntity;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.statement.update.UpdateSet;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.springframework.stereotype.Component;import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Component
@Intercepts({// 指定要拦截的方法签名,这里是拦截Executor的update方法@Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),// 可以添加更多要拦截的方法签名...
})
public class StatementHanderInterceptor implements Interceptor {private static List<String> tables = CollUtil.newArrayList("product","category");private static Map<String,List<String>> tableColumns = new HashMap<>();static {tableColumns.put("product",CollUtil.newArrayList("name","price"));}@Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler statementHandler =(StatementHandler)invocation.getTarget();//要想监控表,首先要从拦截器中拿到sql语句,看sql语句干了什么,对那些表和那些字段做了什么BoundSql boundSql = statementHandler.getBoundSql();String sql = boundSql.getSql();
//        使用JSqlParser解析器解析sql语句net.sf.jsqlparser.statement.Statement statement = CCJSqlParserUtil.parse(sql);if(statement instanceof Update){Update update = (Update)statement;String name = update.getTable().getName();if(tables.contains(name)){List<String> updataSets = tableColumns.get(name);ArrayList<UpdateSet> updateSets = update.getUpdateSets();for (UpdateSet updateSet : updateSets) {String columnName = updateSet.getColumns().get(0).getColumnName();if(updataSets.contains(columnName)){sendMessage(   "修改了字段"+updateSet,name);}}}}else if(statement instanceof Insert){Table table = ((Insert) statement).getTable();String name = table.getName();if(tables.contains(name)){sendMessage("添加了数据",name);}}return invocation.proceed();}private void sendMessage(String option,String tableName){String url= "https://oapi.dingtalk.com/robot/send?access_token=1cfb9a7b20e849a26b572a8ff98f62ee2a220028cd1452901a486e131435621f";JSONArray array = new JSONArray();array.add("18236435312");JSONObject msg = new JSONObject();msg.set("msgtype","text");msg.set("text",new JSONObject().set("content","警告:"+ThreadlocalUtil.get().getNickName()+"-> "+option+" ,表名是:"+tableName));msg.set("at",new JSONObject().set("atMobiles",array));String json = JSONUtil.toJsonStr(msg);String body = HttpRequest.post(url).body(json).execute().body();}}

遇到的问题:

因为这个pagehelper是从stater中继承过来的,可以在stater中也加一个4.6版本的jsqlparser依赖

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python面经
  • FlinkErr:org/apache/hadoop/hive/ql/parse/SemanticException
  • .Net Core 微服务之Consul(二)-集群搭建
  • Vue 接口用FormData() 提交数据
  • 如何使用 GPT?
  • 基于 jenkins 部署接口自动化测试项目!
  • 文件上传接口
  • Hive的基本操作(查询)
  • 盘古信息MOM系统:赋能企业打造高效数字化车间的关键
  • 【绘唐阿祖】Ai小说推文一键生成工具功能预览极速版
  • AI智能名片在Web 3.0技术栈中的应用与前景研究
  • FastAPI 学习之路(五十)WebSockets(六)聊天室完善
  • 近源渗透简介
  • 5. 基于Embedding实现超越elasticsearch高级搜索
  • python数据可视化(6)——绘制散点图
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Consul Config 使用Git做版本控制的实现
  • css选择器
  • eclipse的离线汉化
  • js对象的深浅拷贝
  • Making An Indicator With Pure CSS
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • mysql_config not found
  • Python socket服务器端、客户端传送信息
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • session共享问题解决方案
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • windows-nginx-https-本地配置
  • 安卓应用性能调试和优化经验分享
  • 和 || 运算
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于web的全景—— Pannellum小试
  • 聊一聊前端的监控
  • 实现简单的正则表达式引擎
  • 微服务核心架构梳理
  • Android开发者必备:推荐一款助力开发的开源APP
  • 通过调用文摘列表API获取文摘
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​flutter 代码混淆
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​虚拟化系列介绍(十)
  • $$$$GB2312-80区位编码表$$$$
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言)球球大作战
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (六)Hibernate的二级缓存
  • (论文阅读40-45)图像描述1
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (杂交版)植物大战僵尸
  • (转)Scala的“=”符号简介
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ./configure,make,make install的作用(转)
  • .NET 4.0中的泛型协变和反变
  • .NET CORE Aws S3 使用