在IDEA中DEBUG調試時查看MyBatis-Plus動態生成的SQL語句

在IDEA中DEBUG調試時查看MyBatis-Plus動態生成的SQL語句

    • 前言:動態SQL調試的痛與解決方案
    • 一、準備工作:調試前的檢查清單
    • 二、基礎方法:SqlSessionTemplate斷點調試
      • 步驟1:定位SqlSessionTemplate類
      • 步驟2:在invoke方法上設置斷點
      • 步驟3:啟動調試并觸發SQL執行
      • 步驟4:查看生成的SQL語句
    • 三、MyBatis-Plus增強:特殊場景處理
      • 3.1 BaseMapper接口方法調試
      • 3.2 自定義SQL與XML混合調試
      • 3.3 條件構造器的SQL預覽
    • 四、高級技巧:讓調試效率翻倍
      • 4.1 使用條件斷點,避免頻繁暫停
      • 4.2 表達式求值,動態查看變量
      • 4.3 保存斷點配置,一鍵復用
    • 五、避坑指南:常見問題與解決方案
      • 5.1 斷點不觸發怎么辦?
      • 5.2 SQL語句顯示不完整或有問號?
      • 5.3 調試影響性能怎么辦?
    • 六、總結與擴展

前言:動態SQL調試的痛與解決方案

作為一名CRUD工程師,我們每天都在與MyBatis-Plus打交道。MP的動態SQL功能確實強大,一個LambdaQueryWrapper就能輕松搞定復雜的條件查詢。但不知道你有沒有遇到過這種情況:明明代碼邏輯看起來沒問題,可就是查不出數據,或者查詢結果不符合預期。這時候如果能看到MP實際生成的SQL語句,問題可能就迎刃而解了。

今天就跟大家分享一下,如何在IDEA中通過斷點調試,直觀地查看MyBatis-Plus動態生成的SQL語句,以及一些實用技巧和避坑指南。親測有效,建議收藏備用!

一、準備工作:調試前的檢查清單

在開始調試之前,我們需要確保幾件事:

  1. MyBatis-Plus版本:建議使用3.5.x以上版本,我目前用的是3.5.1,功能比較完善。

  2. 項目調試配置:確保你的Spring Boot項目已經配置了正確的調試啟動項。在IDEA右上角的運行配置中,檢查是否勾選了"Debug"模式。

  3. 依賴檢查:pom.xml中需要包含MyBatis-Plus的依賴:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
  1. 調試環境:最好使用本地開發環境,避免直接在生產/測試環境調試,以防意外。

二、基礎方法:SqlSessionTemplate斷點調試

這是最直接有效的方法,也是我日常開發中用得最多的方式。話不多說,直接上步驟:
在這里插入圖片描述

步驟1:定位SqlSessionTemplate類

在IDEA中,按下Ctrl+N(Mac用戶Cmd+O)打開類搜索框,輸入SqlSessionTemplate,找到org.mybatis.spring.SqlSessionTemplate這個類。

小貼士:如果記不住完整類名,也可以只輸入"SqlSession",IDEA會智能提示相關類。

步驟2:在invoke方法上設置斷點

打開SqlSessionTemplate類后,找到invoke方法。這個方法是MyBatis執行SQL的關鍵入口。在方法名左側的 gutter 區域點擊一下,設置一個斷點。

步驟3:啟動調試并觸發SQL執行

以調試模式啟動你的應用(IDEA中點擊那個綠色的小蟲子圖標),然后操作相關功能,觸發你想要調試的SQL語句執行。

當程序執行到剛才設置的斷點時,IDEA會自動暫停,進入調試視圖。

步驟4:查看生成的SQL語句

根據圖中的步驟一步一步往下找,就能找到MP生成的SQL語句啦

小技巧:可以將常用變量添加到監視列表,下次調試時直接查看。

三、MyBatis-Plus增強:特殊場景處理

MP相比原生MyBatis提供了更多便利功能,但在調試時也有一些特殊情況需要注意:

3.1 BaseMapper接口方法調試

當調用MP提供的BaseMapper接口方法(如selectByIdselectList等)時,斷點同樣會觸發。但需要注意的是,MP會自動生成方法名對應的SQL,這些SQL是動態生成的,可能不在你的XML文件中。

例如調用userMapper.selectList(wrapper)時,生成的SQL會根據wrapper中的條件動態拼接。這時候查看BoundSql的sql屬性,就能清晰地看到拼接后的完整SQL。

3.2 自定義SQL與XML混合調試

如果你項目中既有MP的LambdaQueryWrapper,又有自定義的XML SQL語句,調試方法是通用的。但需要注意:

  • 自定義XML中的SQL:可以直接在XML文件中點擊右鍵,選擇"Go to Declaration"跳轉到對應的方法
  • 注解方式的SQL:如@Select("select * from user where id = #{id}"),可以直接在注解上設置斷點

3.3 條件構造器的SQL預覽

對于復雜的LambdaQueryWrapper,我有個小技巧:在代碼中臨時添加一行System.out.println(wrapper.getSqlSegment()),可以打印出條件部分的SQL片段。雖然不是完整SQL,但對于調試條件拼接很有幫助。

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getId, 1).like(User::getName, "張三").orderByDesc(User::getCreateTime);
// 臨時添加,調試用
System.out.println("SQL條件片段:" + wrapper.getSqlSegment());
List<User> userList = userMapper.selectList(wrapper);

四、高級技巧:讓調試效率翻倍

掌握了基礎方法后,這些高級技巧能讓你的調試效率大大提升:

4.1 使用條件斷點,避免頻繁暫停

如果你只想調試某個特定的SQL,可以設置條件斷點:右鍵點擊斷點圖標,選擇"Edit Breakpoint",在Condition中輸入判斷條件。

例如,只想調試用戶相關的SQL:

method.getName().contains("user")

或者根據SQL的ID進行過濾:

args[0].toString().contains("com.example.mapper.UserMapper.selectById")

這樣只有滿足條件的SQL執行時才會觸發斷點,避免了調試過程中頻繁暫停的煩惱。

4.2 表達式求值,動態查看變量

在調試過程中,可以隨時按下Alt+F8(Mac用戶Option+F8)打開表達式求值窗口,輸入任何你想查看的變量或表達式,IDEA會實時計算并顯示結果。

比如直接輸入boundSql.getSql(),就能立即看到生成的SQL,非常方便。

4.3 保存斷點配置,一鍵復用

如果你經常需要調試SQL,可以將常用的斷點配置保存起來:在Breakpoints窗口(Ctrl+Shift+F8)中,選中你設置的SQL調試斷點,點擊"Save"按鈕,起個名字保存。下次需要時直接"Load"即可,無需重復設置。

五、避坑指南:常見問題與解決方案

5.1 斷點不觸發怎么辦?

這是最常見的問題,可能有以下幾個原因:

  1. 類路徑不對:確認你斷點設置的SqlSessionTemplate是項目實際使用的那個,有時候可能存在多個版本的MyBatis包。

  2. 方法沒被調用:檢查你的代碼邏輯,確保你要調試的SQL確實被執行了。有時候可能因為條件判斷導致代碼沒有走到。

  3. 調試模式沒啟動:確認你是用調試模式啟動的應用,而不是普通運行模式。

  4. 斷點被禁用:檢查斷點圖標是不是灰色的(被禁用了),點擊一下讓它變成紅色即可。

5.2 SQL語句顯示不完整或有問號?

這是因為MyBatis的SQL中使用了占位符?,實際參數值需要單獨查看。在BoundSql對象中,parameterObject屬性就是參數值,或者查看getParameterMappings()方法的返回結果。

如果你想看到帶參數的完整SQL,可以使用下面這個小工具類(我自己寫的,很好用):

public class SqlUtils {public static String showSql(Configuration configuration, BoundSql boundSql) {// 實現代碼略,主要功能是將?替換成實際參數值// 完整代碼可以在我的GitHub上找到:https://github.com/xxx/utils}
}

5.3 調試影響性能怎么辦?

長時間的調試可能會影響應用性能,特別是在循環中執行的SQL。這時候可以:

  1. 使用條件斷點,只在需要時觸發
  2. 調試完成后及時移除或禁用斷點
  3. 避免在生產環境進行長時間調試

六、總結與擴展

掌握MyBatis-Plus動態SQL的調試技巧,能幫我們快速定位問題,提高開發效率。本文介紹的通過IDEA斷點調試查看SQL的方法,是我日常工作中最常用也最有效的方式。

除了這種方法,還有一些其他工具也可以查看MyBatis生成的SQL,比如:

  • MyBatis Log Plugin:IDEA插件,能自動格式化并輸出MyBatis執行的SQL
  • p6spy:一個SQL攔截器,能記錄所有執行的SQL語句
  • MP的內置日志:通過配置日志級別,讓MP輸出執行的SQL

但這些方法要么需要額外配置,要么會輸出大量日志,不如斷點調試來得直接和靈活。

最后,送大家一句我很喜歡的話:“工欲善其事,必先利其器”。掌握好調試技巧,能讓我們的開發之路走得更順暢。希望本文對你有幫助,祝大家調試愉快,Bug少少!

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

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

相關文章

Linux 文本處理三劍客:awk、grep、sed 完全指南

Linux 文本處理三劍客&#xff1a;awk、grep、sed 完全指南 1. 概述 Linux 系統提供了三個強大的文本處理工具&#xff1a;awk、grep 和 sed&#xff0c;它們各有所長&#xff0c;結合使用可以高效地處理文本數據。 awk&#xff1a;擅長文本分析和格式化輸出&#xff0c;是一…

pyecharts可視化圖表組合組件_Grid:打造專業數據儀表盤

pyecharts可視化圖表組合組件_Grid&#xff1a;打造專業數據儀表盤 目錄pyecharts可視化圖表組合組件_Grid&#xff1a;打造專業數據儀表盤引言圖表1&#xff1a;Grid-Overlap-多X/Y軸示例代碼解析1. 圖表創建2. 多軸配置3. 圖表重疊4. Grid布局效果與應用圖表2&#xff1a;Gri…

【電氣工程學習】

三極管中&#xff1a;集電極C,基極B&#xff0c;發射極E接線&#xff1a;棕正藍負黑信號NPN開關輸出的是我們的0V,也叫低電平PNP開關輸出的是24V,也就是高電平&#xff08;NPN開關導通時&#xff0c;相當于把輸出端“拉”到0V&#xff08;低電平&#xff09;&#xff0c;稱為“…

【嵌入式】CAN通信

CAN 總線最初由博世于1980年代為汽車行業開發&#xff0c;能夠簡化復雜的布線網絡&#xff0c;還確保可靠和安全的數據傳輸。 1.CAN技術解釋 CAN網絡中的每個節點&#xff0c;都是平等的&#xff0c;沒有主次之分&#xff0c;這一點和SPI和I2C不同。每個節點都可以在需要的時…

Apache ShenYu網關與Nacos的關聯及如何配合使用

Apache ShenYu 網關與 Nacos 之間的關系可以概括為 “協作互補”:Nacos 作為 服務注冊與配置中心,為 ShenYu 提供動態的服務發現和配置管理能力,而 ShenYu 作為 流量網關,依賴 Nacos 實現路由信息的動態更新和實時生效。以下是詳細解析: 1. 核心關系圖解 拉取服務列表/路…

【CPP】一個CPP的Library(libXXXcore)和測試程序XXX_main的Demo

一個CPP的Library和測試程序Demo 1. 思路描述 目錄結構 總控CMakeList.txt文件 2. Library代碼實現 2.1 XXXLib.hpp文件(對外的接口定義文件)和XXXLib.cpp文件 2.1.1 XXXLib.hpp文件 2.1.2 XXXLib.cpp文件 2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(內部的API基類) 2.2.1 CX…

【YashanDB認證】學習YashanDB的探索之路:從入門到實踐

在國產數據庫蓬勃發展的浪潮中&#xff0c;選擇了YashanDB作為技術學習的切入點。這不僅讓我深入了解了數據庫的核心技術&#xff0c;也讓我深刻體會到國產數據庫在性能、可靠性和生態適配上的創新價值。以下是我在學習YashanDB過程中的經驗與感悟。 一、YashanDB基礎介紹 Ya…

element UI 和 element plus 在組件上有哪些不同

Element UI 和 Element Plus 都是基于 Vue 的桌面端 UI 組件庫&#xff0c;由同一團隊&#xff08;餓了么前端團隊&#xff09;開發和維護。Element Plus 是 Element UI 的升級版&#xff0c;專為 Vue 3 設計&#xff0c;而 Element UI 僅支持 Vue 2。以下是它們在組件層面的主…

【3D重建技術】如何基于遙感圖像和DEM等數據進行城市級高精度三維重建?

城市級高精度三維重建是融合多源空間數據&#xff08;遙感圖像、DEM、GIS矢量等&#xff09;、計算機視覺與地理信息處理技術的復雜過程&#xff0c;核心目標是構建包含“地形地物&#xff08;建筑、道路、植被等&#xff09;”的真實、高精度三維場景。其流程可分為數據準備、…

【unitrix數間混合計算】3.4 無符號小數部分標記trait(bin_unsigned.rs)

一、源碼 這段代碼定義了一個類型級二進制小數系統&#xff0c;用于在編譯時表示和驗證二進制小數部分的有效性。 use crate::number::{F0, BFrac, Bit};/// 標記合法的二進制小數部分類型 pub trait BinFrac: Copy Default static {}// 空小數部分&#xff08;表示值為0&…

從一次 DDoS 的“死亡回放”看現代攻擊鏈的進化

本文記錄的是作者上周在測試環境真實踩到的坑。為了讓讀者能復現并親手體驗防御思路&#xff0c;文末給出了一份最小可運行的 Go 腳本&#xff0c;支持本地壓測 日志回放&#xff0c;方便對比加防護前后的差異。攻擊現場還原 周一凌晨 2:14&#xff0c;監控群里突然彈出告警&a…

LeetCode熱題100--101. 對稱二叉樹--簡單

1. 題目 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a;輸入&#xff1a;root [1,2,2,3,4,4,3] 輸出&#xff1a;true 示例 2&#xff1a;輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false 2. 題解 /*** Definition for…

Pub/Sub是什么意思

Pub/Sub&#xff08;發布/訂閱模式&#xff09;?? 是一種異步消息通信范式&#xff0c;用于分布式系統中不同組件之間的解耦通信。它的核心思想是將消息的發送方&#xff08;發布者&#xff09;?? 和接收方&#xff08;訂閱者&#xff09;?? 分離&#xff0c;通過一個中間…

Redisson3.14.1及之后連接阿里云redis代理模式,使用分布式鎖:ERR unknown command ‘WAIT‘

文章目錄一、問題背景1、問題原因2、阿里云對Redisson的支持二、解決方案1、繼續使用Redisson3.14.0版本2、阿里云redis改為直連模式3、升級Redisson版本到 3.47.0一、問題背景 1、問題原因 阿里云Redis分直連和代理模式&#xff0c;其中代理模式是不支持WAIT命令的。 目前嘗…

Linux: RAID(磁盤冗余陣列)配置全指南

Linux&#xff1a;RAID&#xff08;磁盤冗余陣列&#xff09;配置一、RAID 核心概念 RAID&#xff08;Redundant Array of Independent Disks&#xff0c;磁盤冗余陣列&#xff09;通過將多個物理磁盤組合為一個邏輯存儲設備&#xff0c;實現提升讀寫性能、增強數據安全性或平衡…

《GPT-OSS 模型全解析:OpenAI 回歸開源的 Mixture-of-Experts 之路》

目錄 一、引言 二、GPT-OSS 模型簡介 1. 版本與定位 2. 架構設計與技術亮點 2.1 Mixture-of-Experts&#xff08;MoE&#xff09;架構 2.2 高效推理機制與優化技術 2.3 模型對比 三、模型部署 1. 安裝相關依賴 1.1 uv 安裝 1.2 conda 安裝 1.3 Transformers 運行 g…

【力扣熱題100】雙指針—— 接雨水

題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 注意&#xff1a;答案中不可以包含重復的三元組。輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff1a;上面是由…

51單片機拼接板(開發板積木)

一、前言 1.1 背景 讀書那會兒&#xff08;2013年左右&#xff09;網上接了很多51單片機的設計。 當時有個痛點: 每張板子都是定制的&#xff0c;畫板子&#xff0c;打樣&#xff0c;寫代碼需要花費很多時間。 希望有一張板子&#xff0c;能夠實現絕大多數單片機的功能&#xf…

使用segment-anything將目標檢測label轉換為語義分割label

使用segment-anything將目標檢測label轉換為語義分割label一、segment-anything簡介二、segment-anything安裝2.1安裝方法2.2預訓練模型下載三、將目標檢測label轉換為語義分割label3.1示例代碼3.2代碼說明一、segment-anything簡介 segment-anything是facebookresearch團隊開…

【unitrix數間混合計算】3.3 無符號整數標記trait(bin_unsigned.rs)

一、源碼 這段代碼是用 Rust 語言實現的一個類型級無符號二進制整數系統&#xff0c;通過類型系統在編譯時表示和操作二進制數字。這是一種典型的"類型級編程"&#xff08;type-level programming&#xff09;技術。 use crate::number::{U0, Bin, Bit, BinInt};/// …