💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。
- 推薦:kwan 的首頁,持續學習,不斷總結,共同進步,活到老學到老
- 導航
- 檀越劍指大廠系列:全面總結 java 核心技術點,如集合,jvm,并發編程 redis,kafka,Spring,微服務,Netty 等
- 常用開發工具系列:羅列常用的開發工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 數據庫系列:詳細總結了常用數據庫 mysql 技術點,以及工作中遇到的 mysql 問題等
- 懶人運維系列:總結好用的命令,解放雙手不香嗎?能用一個命令完成絕不用兩個操作
- 數據結構與算法系列:總結數據結構和算法,不同類型針對性訓練,提升編程思維,劍指大廠
非常期待和您一起在這個小小的網絡世界里共同探索、學習和成長。💝💝💝 ?? 歡迎訂閱本專欄 ??
博客目錄
- 一.基本介紹
- 1.什么是 MyBatis?
- 2.MyBatis 特點?
- 二.故障還原
- 1.業務代碼
- 2.bug 現象
- 3.打印執行 sql
- 三.解決方案
- 1.定位 bug
- 2.問題分析
- 3.解決方案
一.基本介紹
1.什么是 MyBatis?
MyBatis 是一個基于 Java 的持久層框架,它提供了面向 SQL 的數據訪問層,使得在應用程序中能夠更方便地管理和操作數據庫。MyBatis 的目標是通過簡化數據庫訪問的過程來提高開發人員的工作效率。
2.MyBatis 特點?
以下是 MyBatis 的一些關鍵特點和概念:
-
SQL 映射文件: MyBatis 使用 XML 文件或注解來配置 SQL 語句和數據庫映射。這些文件定義了 SQL 查詢、更新、刪除等操作,以及結果集與 Java 對象之間的映射關系。
-
面向 SQL 編程: MyBatis 允許開發人員直接編寫原生 SQL 查詢,也可以在 SQL 映射文件中使用動態 SQL。這使得開發人員可以更靈活地控制數據庫操作。
-
對象關系映射(ORM): MyBatis 支持將數據庫表的行映射為 Java 對象,簡化了數據庫操作時數據的轉換過程。開發人員可以通過配置文件或注解來定義對象與數據庫表之間的映射關系。
-
自動映射: MyBatis 提供了自動映射功能,可以自動將查詢結果集映射到 Java 對象中,減少了手動編寫映射代碼的工作量。
-
事務管理: MyBatis 支持事務管理,開發人員可以通過配置文件或編程方式來管理事務,確保數據庫操作的一致性和可靠性。
-
靈活性: MyBatis 不強制開發人員使用特定的模型或架構,允許開發人員按照自己的需求來組織代碼和配置。
MyBatis 在 Java 開發中被廣泛應用于持久層的開發,尤其在與關系型數據庫交互的項目中。它的設計目標是簡化數據庫訪問,并提供開發人員更多的控制權,使得數據庫操作更加靈活和高效。
二.故障還原
1.業務代碼
List<ProductAllexinfoDTO> products = productAllexinfoMapper.totalList(totalListQuery);
2.bug 現象
List<ProductAllexinfoDTO> products = productAllexinfoMapper.totalList(totalListQuery);
這行代碼未執行時,debug 看到 totalListQuery 中 name 的值是“李麗”,但是當這行代碼執行完了之后 name 的值變為了“王五”,因為代碼就這么一點點,那么問題一定是出在 totalList 方法里面
3.打印執行 sql
select * from xx_table where name ='王五'
這就很奇怪了,傳入的是李麗,為啥 sql 的參數是王五呢?
三.解決方案
1.定位 bug
select * from xx_table
<choose><when test="query.name != null and query.name != '' and query.name = '王五' ">and region.name = #{query.name}</when><otherwise>and region.name = '六六'</otherwise>
</choose>
2.問題分析
看到這里,恍然大悟,之前確實沒有遇到過這樣的問題,最關鍵的是這樣寫 mybatis 居然認為是對的,沒有報錯
#把王五的值賦值給了name屬性,導致sql的參數和后續的name都是王五
query.name = '王五'
3.解決方案
- 首先=‘王五’這里,
需要改為兩個==
,這里一定要記住,不能搞混了,一個等號 mybatis 是不報錯的 - 其次,在有字符串判斷的時候,需要給
外層加單引號,內層加雙引號
select * from xx_table
<choose><when test='query.name != null and query.name != "" and query.name == "王五" '>and region.name = #{query.name}</when><otherwise>and region.name = '六六'</otherwise>
</choose>
覺得有用的話點個贊
👍🏻
唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評論批評指正!😄😄😄💘💘💘如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!🌙🌙🌙