亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring數據庫異常的示例分析

發布時間:2021-07-24 14:12:35 來源:億速云 閱讀:302 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Spring數據庫異常的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

數據庫為:H2

Spring數據庫異常的示例分析

如果需要處理特定 SQL 異常,比如 SQL 語句錯誤,這個時候我們應該怎么辦?

查看 SQLException 源碼,我們可以發現兩個重要的方法。

SQLException.getErrorCode:返回數據庫特定的錯誤碼,由數據庫廠商制定,不同廠商錯誤碼不同。如重復主鍵錯誤碼在 MySQL 中是 1062,而在 Oracle 中卻是 1。

SQLException.getSQLState:返回 XOPEN 或 SQL:2003 制定的錯誤碼規范。數據庫廠商會將不同錯誤消息映射成同一個錯誤碼

所以我們可以根據 SQLException.getErrorCode 處理相應的數據庫異常。

Spring數據庫異常的示例分析

由于數據庫廠商錯誤碼不相同,這就導致如果我們更換數據庫,上面判斷邏輯就必須重寫。

下面我們使用 Spring 操作數據庫。

Spring 操作數據庫

Spring數據庫異常的示例分析

使用 Spring 之后,我們不再需要強制捕獲異常。如果 SQL 語句運行存在異常,Spring 會拋出其內置特定的異常。如上面 SQL 語句異常將會拋出 BadSqlGrammarException。除了這個異常之外,Spring 還定義很多數據庫異常。

Spring數據庫異常的示例分析

每個 Spring 數據庫異常的基類都是 DataAccessException。由于 DataAccessException 繼承自 RuntimeException,所以在這類異常無需強制捕獲。

在 Spring 中使用 SQLExceptionTranslator 進行異常轉換,默認的轉換規則會根據 SQLException.getErrorCode 返回的錯誤碼進行相應的轉換。

下面我們從源碼分析轉換過程。

實現細節

調試 JdbcTemplate 的源碼。

Spring數據庫異常的示例分析

可以看到這里捕獲了 SQLException,轉換之后再將其拋出。

整個轉換過程,最后交給 SQLExceptionTranslator 進行轉換。

首先我們查看 SQLExceptionTranslator 類圖。

Spring數據庫異常的示例分析

可以看到其實現了一個抽象類以及三個子類。

Spring數據庫異常的示例分析

抽象類中會首先會使用子類轉換,若未能轉換成功,將會啟動 fallback機制,再次轉換,作為兜底。

接著我們先看下三個子類的區別。

SQLErrorCodeSQLExceptionTranslator:

默認轉換類主要根據 SQLException.getErrorCode 進行轉換。默認使用 SQLExceptionSubclassTranslator 作為 fallback 對象。

SQLExceptionSubclassTranslator:

基于 JDBC 的 SQLException 標準子類判斷,如 java.sql.SQLTransientException。使用 SQLStateSQLExceptionTranslator 作為 fallback 對象。

SQLStateSQLExceptionTranslator:

基于 SQLException.getSQLState 規則判斷。

下面分析 SQLErrorCodeSQLExceptionTranslator ,其他兩個比較類似,同學們可以自己看源碼分析。

SQLErrorCodeSQLExceptionTranslator 轉換器主要根據 SQLException.getErrorCode 進行判斷。Spring 默認在 org/springframework/jdbc/support/sql-error-codes.xml 歸納不同數據庫廠商相關錯誤碼。該配置文件會在第一次發生 SQL 異常時由 SQLErrorCodesFactory 進行加載,最后生成 SQLErrorCodes。

Spring數據庫異常的示例分析

另外在 SQLErrorCodes 提供擴展方法,可以根據錯誤碼轉換成自定義的異常。

最后查看 SQLErrorCodeSQLExceptionTranslator 里的轉換方法。

Spring數據庫異常的示例分析

前三個方法是 Spring 留下擴展方法,可以根據自己需求分別擴展。若都沒有實現,將會根據錯誤碼判斷轉換成具體的異常。

Spring數據庫異常的示例分析

自定義異常轉換

上面說到 Spring 總共給我們留下三處擴展點。

繼承 SQLErrorCodeSQLExceptionTranslator,重寫 customTranslate。繼承 SQLExceptionTranslator,重寫 translate,然后在 sql-error-codes.xml注入。使用 SQLErrorCodes#customTranslations ,然后在 sql-error-codes.xml 配置相關錯誤碼轉換的規則。

第三種方式改動最小,比較簡單。首先在 classpath 下生成 sql-error-codes.xml,復制原有配置,最后配置 customTranslations 。

Spring數據庫異常的示例分析

這里需要注意的是,需要轉化的異常類型必須為 DataAccessException 子類。下面面我們自定義一個異常。

Spring數據庫異常的示例分析

總結

Spirng 異常處理將 SQL 異常轉化成內置異常,屏蔽不同數據庫返回碼不一致的帶來的問題。

最后總結本文的知識點,希望幫助到大家。

Spring數據庫異常的示例分析

感謝各位的閱讀!關于“Spring數據庫異常的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄梅县| 高阳县| 格尔木市| 海门市| 舒城县| 阜新市| 兴国县| 舒兰市| 呼和浩特市| 鄯善县| 万宁市| 永嘉县| 泊头市| 綦江县| 鄂伦春自治旗| 阜平县| 昭觉县| 文登市| 防城港市| 二连浩特市| 淮阳县| 银川市| 临泉县| 延安市| 新平| 建昌县| 永济市| 南召县| 赣州市| 万年县| 苍南县| 四子王旗| 建瓯市| 尉氏县| 滨州市| 济南市| 泰顺县| 中卫市| 正安县| 城市| 筠连县|