JDBC探索之SQLException解析
1. SQLException 的概述
當(dāng)使用 JDBC 與數(shù)據(jù)源(在本文中的數(shù)據(jù)源表示我們實(shí)際使用的數(shù)據(jù)庫)進(jìn)行交互的時(shí)候遇見錯(cuò)誤的時(shí)候,將會(huì)拋出名為 SQLException 的異常。一個(gè) SQLException 的異常里面包含以下信息,用于幫助我們更好的定位錯(cuò)誤。
錯(cuò)誤表示:
使用 getMessage 方法便可以獲取。
SQLState 代碼
代碼有五位的字母和數(shù)字組成 。多數(shù)的代碼由 ISO/ANSI 和 Open Group(X/Open) 標(biāo)準(zhǔn)化,但是仍然存在部分的代碼由數(shù)據(jù)庫提供商自行實(shí)現(xiàn)。
使用 getSQLState 方法便可以獲取。
錯(cuò)誤代碼
與 SQLState 不同,錯(cuò)誤代碼是由數(shù)據(jù)庫提供商自行定義的整數(shù)值,存在是由基礎(chǔ)數(shù)據(jù)源返回的實(shí)際錯(cuò)誤代碼的可能。
使用 getErrorCode 方法便可以獲取。
錯(cuò)誤原因
表示引發(fā)異常的原因,通過不斷調(diào)用 getCause 方法可以獲取異常發(fā)生的底層原因。
異常鏈
如果出現(xiàn)多個(gè)錯(cuò)誤,則通過此鏈引用異常。
使用 getNextException 方法便可以獲取。
2. SQLException的示例
public static void printSQLException(SQLException e){ for(Throwable e :ex){ if (e instanceof SQLException){ if(ignoreSQLException(((SQLException)e).getSQLState()) == false){ e.printStackTrace(System.err); System.err.println("SQLState:" + ((SQLException)e).getSQLState()); System.err.println("Error Code:" + ((SQLException)e).getErrorCode()); System.err.println("Message:" + e.getMessage()); Throwable t = ex.getCause(); while(t != null){ System.out.println("Cause :" + t); t = t.getCause(); } } } } } public static boolean ignoreSQLException(String sqlState){ if(sqlState == null){ System.out.println("The SQL state is not defined"); } // X0Y32:Jar file already exists in schema if(sqlState.equalsIgnoreCase("X0Y32")){ return true; } // 42Y55:Table already exists in schema if(sqlState.equalsIgnoreCase("42Y55")){ return true; } return true; }
說明:上面的代碼取自 [http:docs.oracle.com] (http://docs.oracle.com/javase/tutorial/jdbc/basics/sqlexception.html)。
3. SQLWarning
SQLWarning 是 SQLException 的一個(gè)非常重要的子類,用于表示數(shù)據(jù)庫訪問時(shí)出現(xiàn)的警告。作為異常,SQLWarning 不會(huì)停止執(zhí)行應(yīng)用程序,而是提醒用戶沒有按計(jì)劃發(fā)生任何事情。比如,警告有可能會(huì)通知你嘗試撤銷的某個(gè)權(quán)限沒有成功,或者通知你在請(qǐng)求斷開的時(shí)間可能發(fā)生錯(cuò)誤。
SQLWarning 有可能被 Connection 、Statement (包括 PreparedStatement 和 CallableStatement)或 ResultSet 報(bào)告,這些類都存在 getWarnings 方法,通過調(diào)用該方法才能看到調(diào)用對(duì)象上報(bào)告的第一個(gè)警告。如果 getWarning 返回一個(gè)警告,我們可以調(diào)用其 getNextWarning 方法獲取下一個(gè)警告。每執(zhí)行一行語句,那么前面那行語句的警告將會(huì)清除,這意味著如果我們想要檢索報(bào)告處理來的警告,那么必須在下一行語句執(zhí)行之前檢索。
DataTruncation 是最常見的警告,其SQLState代碼均為01004,表示在讀取和寫入數(shù)據(jù)的時(shí)候存在問題。DataTruncation 有很多方法可以幫助我們?nèi)ダ斫饽膫€(gè)列或參數(shù)數(shù)據(jù)被截?cái)?,截?cái)嗍窃谧x取還是寫入操作,應(yīng)該傳輸多少字節(jié)以及實(shí)際傳輸?shù)淖止?jié)數(shù)。
4. 其他類型的SQLException
BatchUpdateException:在批處理更新操作期間發(fā)生錯(cuò)誤時(shí),將引發(fā)除了所提供的信息,提供的更新計(jì)數(shù)被處死之前出現(xiàn)了錯(cuò)誤的所有語句。
SQLClientInfoException:當(dāng)無法在連接上設(shè)置一個(gè)或多個(gè)客戶端信息屬性時(shí)引發(fā)。除了所提供的信息,也提供了不設(shè)置的客戶端信息屬性的列表。
so on...
總結(jié)
以上就是本文關(guān)于JDBC探索之SQLException解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:JDBC常用接口總結(jié)、使用JDBC實(shí)現(xiàn)數(shù)據(jù)訪問對(duì)象層(DAO)代碼示例等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的,歡迎大家留言交流討論。
相關(guān)文章
Mysql經(jīng)典高逼格/命令行操作(速成)(推薦)
這篇文章主要介紹了Mysql命令行操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04MySQL數(shù)據(jù)庫10秒內(nèi)插入百萬條數(shù)據(jù)的實(shí)現(xiàn)
假設(shè)現(xiàn)在我們要向mysql插入500萬條數(shù)據(jù),如何實(shí)現(xiàn)高效快速的插入進(jìn)去?本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-10-10SQL語句多表聯(lián)查的實(shí)現(xiàn)方法示例
多表聯(lián)合檢索可以通過連接運(yùn)算來完成,而連接運(yùn)算又可以通過廣義笛卡爾積后再進(jìn),下面這篇文章主要給大家介紹了關(guān)于SQL語句多表聯(lián)查實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04mysql5.5 master-slave(Replication)主從配置
在主機(jī)master中對(duì)test數(shù)據(jù)庫進(jìn)行sql操作,再查看從機(jī)test數(shù)據(jù)庫是否產(chǎn)生同步。2011-07-07Ubuntu Server 16.04下mysql8.0安裝配置圖文教程
這篇文章主要為大家詳細(xì)介紹了Ubuntu Server 16.04下mysql8.0安裝配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05