通過mybatis的攔截器對SQL進行打標

1、背景

在我們開發的過程中,一般需要編寫各種SQL語句,萬一生產環境出現了慢查詢,那么我們如何快速定位到底是程序中的那個SQL出現的問題呢?

2、解決方案

如果我們的數據訪問層使用的是mybatis的話,那么我們可以通過mybatis提供的攔截器攔截系統中的SQL,然后將 mapper的命名空間和id追加到原始SQL的末尾,當作一個注釋,這樣不就可以實現嗎? 類似效果如下:

select * from customer where phone = 'aaaaa';/**com.huan.study.mybatis.mappers.CustomerMapper.findCustomer*/

3、核心實現步驟

1、攔截器攔截SQL進行打標

package com.huan.study.mybatis.plugin;import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;import java.sql.Connection;/*** 在原始的Sql語句后面追加 sql id,方面知道當前查詢語句是那個mapper文件中的** @author huan* @date 2025/3/11 - 00:30*/
@Slf4j
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}
)
public class PrintSqlIdInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler statementHandler = (StatementHandler) invocation.getTarget();MetaObject metaStatementHandler = MetaObject.forObject(statementHandler,SystemMetaObject.DEFAULT_OBJECT_FACTORY,SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,SystemMetaObject.NULL_META_OBJECT.getReflectorFactory());BoundSql boundSql = statementHandler.getBoundSql();MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");String id = mappedStatement.getId();log.info("sql語句的id : {}", id);String sql = boundSql.getSql();if (!sql.endsWith(";")) {sql += ";";}sql = sql + "/**" + id + "*/";metaStatementHandler.setValue("delegate.boundSql.sql", sql);return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}
}

2、配置插件

mybatis-config.xml中進行插件的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><plugins><plugin interceptor="com.huan.study.mybatis.plugin.PrintSqlIdInterceptor"/></plugins></configuration>

4、實現效果如下

select * from customer where phone = 'aaaaa';/**com.huan.study.mybatis.mappers.CustomerMapper.findCustomer*/
insert into customer(phone,address) values ('12345','湖北');/**com.huan.study.mybatis.mappers.CustomerMapper.addCustomer*/

可以看到我們對每個SQL都進行了打標,方便SQL的追蹤

5、完整代碼

https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-sql-marking

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72238.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】centos配置可用的yum源

在 CentOS 系統中配置可用的 YUM 源&#xff08;倉庫&#xff09;是保持系統更新和軟件包管理的重要步驟。下面是一些步驟和示例&#xff0c;幫助你配置可用的 YUM 源&#xff1a; 1. 備份當前 YUM 倉庫配置 首先&#xff0c;備份你當前的 YUM 倉庫配置文件&#xff0c;以防萬…

【CentOS】搭建Radius服務器

目錄 背景簡介&#xff1a;Radius是什么&#xff1f;Radius服務器驗證原理搭建Radius服務器環境信息yum在線安裝配置FreeRADIUS相關文件clients.conf文件users文件重啟服務 驗證 參考鏈接 背景 在項目中需要用到Radius服務器作為數據庫代理用戶的外部驗證服務器&#xff0c;做…

機器學習_特征工程

一、核心知識點&#xff1a;特征工程的核心概念與流程 1. 特征工程的定義與重要性 定義&#xff1a;通過數據預處理、特征構造、特征選擇等方法&#xff0c;將原始數據轉化為更適合機器學習模型輸入的特征&#xff0c;提升模型性能。重要性&#xff1a; “數據和特征決定了機…

Elasticsearch Java High Level Client [7.17] 使用

es 的 HighLevelClient存在es源代碼的引用&#xff0c;結合springboot使用時&#xff0c;會存在es版本的沖突&#xff0c;這里記錄下解決沖突和使用方式&#xff08;es已經不建議使用這個了&#xff09;。 注意es服務端的版本需要與client的版本對齊&#xff0c;否則返回數據可…

rtsp在網頁上顯示(webrtc-stream)

一&#xff1a;windos 平臺 1&#xff1a;下載已經編譯好的windos平臺程序 Releases mpromonet/webrtc-streamer (github.com) or 【免費】webrtc-streamerv0.8.6一款werbrtc服務器&#xff08;windos版本&#xff09;&#xff0c;可以直接將rtsp流拉到網頁上顯示資源-CSDN文…

【AI大模型智能應用】Deepseek生成測試用例

在軟件開發過程中&#xff0c;測試用例的設計和編寫是確保軟件質量的關鍵。 然而&#xff0c;軟件系統的復雜性不斷增加&#xff0c;手動編寫測試用例的工作量變得異常龐大&#xff0c;且容易出錯。 DeepSeek基于人工智能和機器學習&#xff0c;它能夠依據軟件的需求和設計文…

如何在vscode中編譯linux中的c++文件

方式一 在終端打開進行連接編譯 指令含義&#xff1a;將 muduo_server.cpp 源文件編譯成一個可執行文件 server&#xff0c;并且在鏈接過程中使用 muduo_net、muduo_base 庫以及 pthread 庫 方式二 在vscode中修改配置文件 按F1打開配置文件搜索欄&#xff0c;輸入C/C 打開…

基于Flink SQL的實時指標多維分析模型

數據流程介紹 1.創建源表kafka接入消息隊列數據&#xff0c;定義字段映射規則&#xff1b; 2.創建目標表es_sink配置Elasticsearch輸出&#xff1b; 3.通過多級視圖&#xff08;tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby&#xff09;實現數據清洗、去重、狀態計算&#x…

【vscode-01】vscode不同項目不同語言擴展插件隔離方案

vscode不同項目不同語言擴展插件隔離方案 1. 背景2. vscode 擴展插件隔離方案2.1 code-profile 配置文件2.2 配合extensions.json 1. 背景 最近打開vscode 發現越來越卡&#xff0c;這是一個輕量級代碼編輯器&#xff0c;怎么會如此占用內存呢&#xff1f; 我使用了‘code --l…

《基于大數據的營養果蔬推薦系統的設計與實現》開題報告

目錄 一、選題的理論意義現實意義及應用價值 &#xff08;一&#xff09;理論意義 &#xff08;二&#xff09;現實意義 1.用戶價值提升 2.效率提升 3.經濟效益提升 &#xff08;三&#xff09;應用價值 1.提升用戶健康水平 2.優化購物體驗 3.支持健康決策 4.促進農業…

《C#上位機開發從門外到門內》2-4:Modbus協議

文章目錄 一、引言二、Modbus協議概述2.1 Modbus協議的起源與發展2.2 Modbus協議的基本特點2.3 應用領域 三、Modbus通信原理詳解3.1 Modbus RTU原理3.1.1 數據幀結構3.1.2 數據傳輸與時序3.1.3 錯誤檢測 3.2 Modbus TCP原理3.2.1 數據封裝3.2.2 通信機制3.2.3 與RTU模式的區別…

觀成科技:?加密C2框架Platypus流量分析

一、工具介紹 Platypus 是一款支持多會話的交互式反向 Shell 管理器。在實際的滲透測試中&#xff0c;為了解決 Netcat/Socat 等工具在文件傳輸、多會話管理方面的不足,該工具在多會話管理的基礎上增加了在滲透測試中能更好發揮作用的功能&#xff08;如&#xff1a;交互式 Sh…

OpenBMC:BmcWeb 處理http請求

OpenBMC:BmcWeb 讀取http請求頭-CSDN博客 介紹了,在讀取完http頭后,將調用Connection::handle處理http請求 1.Connection::handle void handle() {...req = std::make_shared<crow::Request>(parser->release(), reqEc);...req->session = userSession;accept …

MySQL事務深度解析:ACID特性、隔離級別與MVCC機制

引言 在數據庫系統中&#xff0c;?事務是保障數據一致性與完整性的核心機制。MySQL通過ACID特性、多級隔離策略和MVCC&#xff08;多版本并發控制&#xff09;實現了高性能與高可靠性的平衡。本文將從底層原理出發&#xff0c;系統解析事務的四大特性、隔離級別的實現邏輯&am…

WireShark自動抓包

背景 異常流量檢測是當前保護網絡空間安全的重要檢測方法。 對流量的研究&#xff0c;首先需要在系統中進行抓包&#xff0c;并對包進行分析。 這里對WireShark自動抓包進行簡要介紹。 操作步驟 1、選擇“捕獲”>“選項”。 2、在Input下&#xff0c;選擇要抓包的網絡接…

Android 自定義View之底部導航欄

文章目錄 Android 自定義View之底部導航欄概述代碼定義TabIndex定義Tab定義TabView定義NavigationBarFragmentSwitchHelper管理類使用 源碼下載 Android 自定義View之底部導航欄 概述 封裝一個通用的底部導航欄控件。 代碼 定義TabIndex Retention(AnnotationRetention.SOU…

西門子S7-1200 PLC遠程調試技術方案(巨控GRM532模塊)

三步快速實現遠程調試 硬件部署 準備西門子S7-1200 PLC、巨控GRM552YW-C模塊及編程電腦。GRM552YW-C通過網口與PLC連接&#xff0c;支持4G/5G/Wi-Fi/有線網絡接入&#xff0c;無需復雜布線。 軟件配置 安裝GVCOM3配置軟件&#xff0c;注冊模塊&#xff08;輸入唯一序列號與密…

上下文學習思維鏈COTPrompt工程

一、上下文學習 上下文學習強調在學習過程中考慮問題所處的上下文環境。 1.1 上下文學習的分類 零樣本&#xff08;Zero-Shot&#xff09;上下文學習單樣本&#xff08;One-Shot&#xff09;上下文學習少樣本&#xff08;Few-Shot&#xff09;上下文學習 1.2 示例選擇方法 …

node.js-WebScoket心跳機制(服務器定時發送數據,檢測連接狀態,重連)

1.WebScoket心跳機制是&#xff1f; 基于上一篇文章&#xff0c;WebScoket在瀏覽器和服務器間完成一次握手&#xff0c;兩者間創建持久性連接&#xff0c;并進行雙向數據連接。node.js-node.js作為服務器&#xff0c;前端使用WebSocket&#xff08;單個TCP連接上進行全雙工通訊…

若依RuoYi-Cloud-Plus微服務版(完整版)前后端部署

一.目標 在瀏覽器上成功登錄進入 二.源碼下載 后端源碼&#xff1a;前往Gitee下載頁面(https://gitee.com/dromara/RuoYi-Cloud-Plus)下載解壓到工作目錄。 前端源碼&#xff1a; 前往Gitee下載頁面(https://gitee.com/JavaLionLi/plus-ui)下載解壓到工作目錄。 文檔地址&a…