AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

盤點 Mybatis 使用過程中遇到的坑!

來源: 責編: 時間:2024-09-10 09:47:53 100觀看
導讀01、引言大家好,我是了不起,前一段時間在工作中因為一個疏忽踩了一個坑,最終通過異常棧追溯源碼解決了問題。下面我來給大家還原一下案發現場,并介紹一下自己的解決思路,希望能對大家有所啟發。02、案發現場當時的業務邏輯

01、引言

大家好,我是了不起,前一段時間在工作中因為一個疏忽踩了一個坑,最終通過異常棧追溯源碼解決了問題。gqf28資訊網——每日最新資訊28at.com

下面我來給大家還原一下案發現場,并介紹一下自己的解決思路,希望能對大家有所啟發。gqf28資訊網——每日最新資訊28at.com

02、案發現場

當時的業務邏輯主要通過 Mybatis 框架來修改數據,具體示例如下:gqf28資訊網——每日最新資訊28at.com

import org.springframework.data.repository.query.Param;public interface GroupMapper {  int updateGroup(@Param("oldSerial") Set<Integer> oldSerial, @Param("newSerial") int newSerial); int invalidGroup(@Param("set") Set<Integer> set);}
<update id="updateGroup">    update groupCode_table_use    set groupCode=#{newSerial}    where groupCode in    <foreach collection="oldSerial" close=")" open="(" item="item" separator=",">        #{item}    </foreach></update><update id="invalidGroup">    update groupCode_table    set status='無效'    where groupCode in    <foreach collection="set" close=")" open="(" item="item" separator=",">        #{item}    </foreach></update>

本以為 so easy 的代碼,出現意外了!第一個sql語句updateGroup正常運行,第二個sql語句invalidGroup竟然報錯了???gqf28資訊網——每日最新資訊28at.com

報錯信息如下:gqf28資訊網——每日最新資訊28at.com

圖片圖片gqf28資訊網——每日最新資訊28at.com

從日志上可以看出,提示set參數找不到!gqf28資訊網——每日最新資訊28at.com

明明使用了@Param("set")將參數命名為set為何找不到,完全不符合多年開發的認知。gqf28資訊網——每日最新資訊28at.com

更加詭異的是updateGroup已使用了同樣的方式去遍歷,完全沒得問題,那么問題出現在了哪了?gqf28資訊網——每日最新資訊28at.com

小伙伴可以先猜一猜!gqf28資訊網——每日最新資訊28at.com

03、原因分析

百思不得其解下,我掏出了祖傳絕活 debug 源碼,最終發現原來是Mybatis對集合Set進行了特殊處理。gqf28資訊網——每日最新資訊28at.com

案發項目引入的Mybatis版本是 3.5.1。部分源碼如下!gqf28資訊網——每日最新資訊28at.com

org.apache.ibatis.session.defaults.DefaultSqlSession.java@Overridepublic int update(String statement, Object parameter) {  try {    dirty = true;    MappedStatement ms = configuration.getMappedStatement(statement);    //調用了wrapCollection方法對參數進行了處理    return executor.update(ms, wrapCollection(parameter));  } catch (Exception e) {    throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);  } finally {    ErrorContext.instance().reset();  }}/*** 如果參數實現了Collection接口或是數組類型 wrapCollection方法會對參數進行封裝* 如果參數實現了Collection接口會封裝為含collection鍵的Map*     如果參數又實現了List接口會封裝為含list鍵的Map(追增)*     對Set集合沒有特殊處理* 如果參數是數組類型會封裝為含array鍵的Map*/private Object wrapCollection(final Object object) {  if (object instanceof Collection) {    StrictMap<Object> map = new StrictMap<>();    map.put("collection", object);    if (object instanceof List) {      map.put("list", object);    }    return map;  } else if (object != null && object.getClass().isArray()) {    StrictMap<Object> map = new StrictMap<>();    map.put("array", object);    return map;  }  return object;}

通過以上的源碼分析,發現Mybatis框架對集合參數進行了特殊處理。gqf28資訊網——每日最新資訊28at.com

這就是為什么報錯信息中提示Available parameters are [collection]。gqf28資訊網——每日最新資訊28at.com

找到了collection錯誤信息從哪里來問題,接下來我們分析一下set參數到了哪里去。gqf28資訊網——每日最新資訊28at.com

首先updateGroup可以正常執行是因為源碼中對集合的特殊處理只對單參數生效,也就是說@Param("set")注解失效是因為被Mybatis自家的特殊處理給覆蓋了?gqf28資訊網——每日最新資訊28at.com

這不合乎常理啊,那么問題可能出在@Param注解身上,通過排查代碼發現GroupMapper.java類引用的@Param注解不對!gqf28資訊網——每日最新資訊28at.com

// 代碼引入的注解類Paramimport org.springframework.data.repository.query.Param;// 期望的注解類,應該由mybatis提供import org.apache.ibatis.annotations.Param;

實際上,springframework包下的@Param注解執行時機在wrapCollection處理之前,wrapCollection對集合的特殊處理將springframework包下的@Param注解處理覆蓋掉了,所以無法解析參數set。而mybatis包下的@Param注解執行時機在wrapCollection處理之后,程序可以正常運行。gqf28資訊網——每日最新資訊28at.com

最終確定,繞了這么大一圈,原來是包導入錯了,誰能想到springframework包下還有一個@Param注解,在多參數的情況下竟然可以正常使用o(╥﹏╥)o。gqf28資訊網——每日最新資訊28at.com

04、異常棧分析法

整個異常排查過程中,主要通過分析異常棧信息進行快速定位。下面我給大家介紹一下異常棧分析法。gqf28資訊網——每日最新資訊28at.com

我們在工作中查看異常棧,往往都是業務代碼異常導致的,這個時候我們只需要關心是在我們編寫的哪段代碼中出了問題。gqf28資訊網——每日最新資訊28at.com

而這時好用的idea也會為溫馨的為我們做出提示,會在異常棧中將我們編寫的方法位置信息標藍處理,這樣我們就定快速定位出現問題的代碼。gqf28資訊網——每日最新資訊28at.com

圖片圖片gqf28資訊網——每日最新資訊28at.com

但是一旦是底層引用的jar包出現了異常,僅僅是這樣查看異常棧是不夠的。下面我們就以上面案例中的異常棧來帶大家分析。gqf28資訊網——每日最新資訊28at.com

當前異常:gqf28資訊網——每日最新資訊28at.com

圖片圖片gqf28資訊網——每日最新資訊28at.com

原始異常:gqf28資訊網——每日最新資訊28at.com

圖片圖片gqf28資訊網——每日最新資訊28at.com

分析流程:gqf28資訊網——每日最新資訊28at.com

  • 異常調用棧順序:從上至下為方法調用順序的逆序,異常由異常棧的最上面的方法拋出,整個調用的入口在最下方。
  • 尋找原始異常入口技巧:檢索異常棧中與原始異常入口(最下面)拋出位置同名的方法。
  • 尋找真正異常出現的位置,要找最后一個 Caused by 的第一行棧幀。


gqf28資訊網——每日最新資訊28at.com

"Caused by" 是 Java 異常處理機制中的一部分,它表示當前異常是由另一個異常引起的。在 Java 中,每個 Throwable 對象都可以通過 getCause() 方法獲取到原始異常,這個原始異常就是通過 "Caused by" 打印出來的。gqf28資訊網——每日最新資訊28at.com

異常棧示例代碼:

假設你在catch塊中捕獲了一個異常,并重新拋出了一個新的異常,同時保留了原始異常的信息:gqf28資訊網——每日最新資訊28at.com

public class Example {    public static void main(String[] args) {        try {            methodThatThrowsException();        } catch (Exception e) {            throw new RuntimeException("Caught an exception", e);        }    }    public static void methodThatThrowsException() throws Exception {        throw new Exception("Original exception");    }}

當你運行上述代碼時,控制臺輸出的異常棧信息通常會包含Caused by信息:gqf28資訊網——每日最新資訊28at.com

java.lang.RuntimeException: Caught an exception    at Example.main(Example.java:7)Caused by: java.lang.Exception: Original exception    at Example.methodThatThrowsException(Example.java:12)    at Example.main(Example.java:5)
  • java.lang.Exception: Original exception 是原始異常。
  • java.lang.RuntimeException: Caught an exception 是新拋出的異常,并且包含了原始異常作為其原因。
  • Caused by 信息顯示了原始異常的詳細信息,這有助于調試和理解異常的來源。

如何保留原始異常信息呢?gqf28資訊網——每日最新資訊28at.com

  • 方式一:直接傳遞原始異常:
try {     methodThatThrowsException(); } catch (Exception e) {     throw new RuntimeException("Caught an exception", e); }
  • 方式二:使用 addSuppressed 方法:
try {     methodThatThrowsException(); } catch (Exception e) {     RuntimeException newException = new RuntimeException("Caught an exception");     newException.addSuppressed(e);     throw newException; }

05、結語

學會查看分析異常棧,可以為我們工作大大提高效率,希望這篇文章給大家帶來收獲,最后再送給大家一個小技巧。異常棧不僅僅可以用來排查異常哦,還可以幫助大家學習源碼,debug 源碼找不到入口怎么辦,那就創造一個異常!gqf28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-112730-0.html盤點 Mybatis 使用過程中遇到的坑!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot與XXL-JOB高效定時任務管理指南

下一篇: Elasticsearch 使用誤區—單次請求獲取大量數據

標簽:
  • 熱門焦點
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質感拉滿

    終于,在經過了幾波預熱之后,一加Ace2 Pro的外觀真機圖在網上出現了。還是博主數碼閑聊站曝光的,這次的外觀設計還是延續了一加11的方案,只是細節上有了調整,例如新加入了鈦空灰
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一
  • 三星電子Q2營收60萬億韓元 存儲業務營收同比仍下滑超過50%

    7月27日消息,據外媒報道,從三星電子所發布的財報來看,他們主要利潤來源的存儲芯片業務在今年二季度仍不樂觀,營收同比仍在大幅下滑,所在的設備解決方案
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現場,成為了展會的一大看點。這也是三翼鳥繼9月9日發布了行業首個一站式定制智慧家平臺后的
Top