




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Spring 訪問數(shù)據(jù)庫異常的處理方法來源:Javaeye 博客發(fā)布時間:2011-01-2220:45 閱讀:134 次原文鏈接全屏閱讀收藏編輯點評:天我們將談?wù)?Spring 訪問數(shù)據(jù)庫異常的處理方法,使用 JDBCAPI 時,很多操作都要聲明拋出 java.sql.SQLException 異常,通常情況下是要制定異常處理策略。使用 JDBCAPI 時,很多操作都要聲明拋出 java.sql.SQLException 異常,通常情況下是要制定異常處理策略。而 Spring 的 JDBC 模塊為我們提供了一套異常處理機制,這套異常系統(tǒng)的基類是 DataAccessException,它是
2、RuntimeException 的一種類型,那么就不用強制去捕捉異常了,Spring 的異常體系如下:RuntimeExceptonNestedRuntimeExceptifjn5DataAccessExceptionrypeMismatcfiDataAccessExceptionUncategorizedSQLException目前為止我們還沒有明確地處理 Spring 中 JDBC 模塊的異常。要理解它的異常處理機制,我們來做幾個測試??聪旅娴臏y試代碼:1.publicvoidinsert(finalVehiclevehicle)2.Stringsql=insertintovehicle
3、3.(ID,PLATE,CHASSIS,COLOR,WHEEL,SEAT)values4.(:id,:plate,:chassis,:color,:wheel,:seat);5.SqlParameterSourceparameterSource=newBeanPropertySqlParameterSource(6.vehicle);7.getSimpleJdbcTemplate().update(sql,parameterSource);8.)9.publicvoidinsert(finalVehiclevehicle)10.Stringsql=insertintovehicle(ID,PL
4、ATE,CHASSIS,COLOR,WHEEL,SEAT)11.values(:id,:plate,:chassis,:color,:wheel,:seat);12.SqlParameterSourceparameterSource=newBeanPropertySqlParameterSource(13.vehicle);14.getSimpleJdbcTemplate().update(sql,parameterSource);15.publicstaticvoidmain(Stringargs)Applicationcontextctx=newClassPathXmlApplicatio
5、nContext(classpath:org/ourpioneer/vehicle/spring/applicationContext.xml);VehicleDAOvehicleDAO=(VehicleDAO)ctx.getBean(vehicleDAO);Vehiclevehicle=newVehicle(遼 B-000000,1A00000001,RED”,4,4);vehicle.setld(l);vehicleDAO.insert(vehicle);)publicstaticvoidmain(Stringargs)Applicationcontextctx=newClassPathX
6、mlApplicationContext(classpath:org/ourpioneer/vehicle/spring/applicationContext.xml);VehicleDAOvehicleDAO=(VehicleDAO)ctx.getBean(vehicleDAO);Vehiclevehicle=newVehicle(遼 B-000000,1A00000001,RED,4,4);vehicle.setld(l);vehicleDAO.insert(vehicle);)修改 SQL 語句,不使用自增主鍵的特性,并在這里設(shè)置重復(fù)的主鍵,那么運行程序,就會報出字段重復(fù)的異常。下面來捕
7、捉這個異常:1.try2.vehicleDAO.insert(vehicle);3.catch(DataAccessExceptione)4.SQLExceptionsqle=(SQLException)e.getCause();System.out.println(Errorcode:+sqle.getErrorCodSystem.out.println(SQLstate:+sqle.getSQLState();14.此時,我們就可以獲得錯誤碼和 SQL 狀態(tài)(不同的數(shù)據(jù)庫系統(tǒng)會有不同):qConsoleOemo(1)JavaApplicationF:MyDevjdkbivaw,exe(20
8、11*1-1,信息二已一工匚三七己二七;百七;二g=tzr.?incrc.sprLn-jfraneworkIzoil-l-K11:59:29org-springframework.beansfactory.xml.Hft:LoadingXMLbeandefinitionsfromclatsspathresour2011-1-411:59:29support.信息loaded:052七:蜉H2rErrorcode:-104SQLstate:23000rnI5.e();6.System.out.println(SQLstate:+sqle.getSQLState();7.8.try9.vehicl
9、eDAO.insert(vehicle);10.catch(DataAccessExceptione)11.SQLExceptionsqle=(SQLException)e.getCause();12.System.out.println(Errorcode:+sqle.getErrorCode();13.LK*關(guān)于 HSQL 數(shù)據(jù)庫的錯誤碼可以到 org.hsqldb.Trace 類中查看,只要注意運行結(jié)果會有一個負號,而類中定義的是沒有負號的。這樣就知道了這個錯誤的具體含義,比如 104:唯一約束驗證失敗。這就是我們故意設(shè)置的重復(fù)主鍵問題。Spring 的 JDBC 模塊為我們預(yù)定義了一些
10、錯誤代碼,它存儲在org.springframework.jdbc.support 包下的 sql-error-codes.xml 文件中,其中描述HSQL 的內(nèi)容為:1. beanid=HSQLclass=org.springframework.jdbc.support.SQLErrorCodes2. propertyname=databaseProductName3. valueHSQLDatabaseEngine/value4. /property5. propertyname=badSqlGrammarCodes6. value-22,-28/value7. /property8. p
11、ropertyname=duplicateKeyCodes9. value-104/value10. /property11. propertyname=dataIntegrityViolationCodes12. value-9/value13. /property14. propertyname=dataAccessResourceFailureCodes15. value-80/value16. /property17. /beanclass=org.springframework.jdbc.support.SQLErrorCpertyname=databasePro
12、ductName20.valueHSQLDatabaseEngine/value21./pertyname=badSqlGrammarCodes23.value-22,-28/value24./pertyname=duplicateKeyCodes26.value-104/value27./pertyname=dataIntegrityViolationCodes29.value-9/value30./pertyname=dataAccessResourceFailureCodes3
13、2.value-80/value33./property34./bean其余數(shù)據(jù)庫的錯誤碼內(nèi)容也可以從這個文件之中獲得。下面我們來看看如何自定義異常處理。上面我們已經(jīng)知道在 org.springframework.jdbc.support 包下有sql-error-codes.xml 文件,在 Spring 啟動時會自動讀取這個文件中的錯誤碼,它為我們預(yù)分類了一些錯誤碼,而我們可以加強它,來使用我們自定義的異常。首先,定義一個異常類,我們就來自定義一下前面的-104 錯誤,就是 HSQL 的重復(fù)鍵的問題:18.beanid=HSQL20.super(msg,cause);1.packageor
14、g.ourpioneer.vehicle.exception;2.importorg.springframework.dao.DatalntegrityViolationException;3.publicclassVehicleDuplicateKeyExceptionextends4.DataIntegrityViolationException5.publicVehicleDuplicateKeyException(Stringmsg)6.super(msg);7.)8.publicVehicleDuplicateKeyException(Stringmsg,Throwablecause
15、)9.super(msg,cause);10.11.12.packageorg.ourpioneer.vehicle.exception;13.importorg.springframework.dao.DatalntegrityViolationException;14.publicclassVehicleDuplicateKeyExceptionextends15.DatalntegrityViolationException16.publicVehicleDuplicateKeyException(Stringmsg)17.super(msg);18.19.publicVehicleDu
16、plicateKeyException(Stringmsg,Throwablecause)22.之后我們重新新建一個 sql-error-codes.xml 代碼,并將它放到類路徑的根目錄下,這樣 Spring 會發(fā)現(xiàn)它并使用我們自定義的文件,在配置中定義如下:1. beanid=HSQLclass=org.springframework.jdbc.support.SQLErrorCpertyname=databaseProductNamevalue=HSQLDatabaseEngine/3. propertyname=useSqlStateForTranslationval
17、ue=false/4. propertyname=customTranslations5. list6. reflocal=vehicleDuplicateKeyTranslation/7. /list8. /property9. /bean10.beanid=vehicleDuplicateKeyTranslation11.class=org.springframework.jdbc.support.CustomSQLErrorCodesTpertyname=errorCodesvalue=-104/13.propertyname=exceptionClass
18、14.value=org.ourpioneer.vehicle.exception.VehicleDuplicateKeyException/15./bean16. beanid=HSQLclass=org.springframework.jdbc.support.SQLErrorCpertyname=databaseProductNamevalue=HSQLDatabaseEngine/18.propertyname=useSqlStateForTranslationvalue=false/19.propertyname=customTranslations20.list
19、21.reflocal=vehicleDuplicateKeyTranslation/22./list23./property24./bean25.beanid=vehicleDuplicateKeyTranslation26.class=org.springframework.jdbc.support.CustomSQLErrorCodesTpertyname=errorCodesvalue=-104/28.propertyname=exceptionClass29.value=org.ourpioneer.vehicle.exception.VehicleD
20、uplicateKeyException/30./beanHSQL 的 bean 的名稱不要改,并將 useSqlStateForTranslation 置為 false,就可以使用我們自己定義的異常類了。在主函數(shù)中移除 try/catch 塊,啟動程序,我們就可以看到如下內(nèi)容:8X及;H需覃津30二亡二I卜MmZtT事Drmo囚MwApfecrtik洞的iMyDwvjdkXbifi串imynwp01I-i-14下中)?:族詢IIBft:LfldnsfsuitLut.afcieB*aji?aetazyrpl8tt2lOveEEXiSi*gb-eftdwEimt:口ziCottea*rH3Qi-
21、9-E*plarxn。GsezAC6v以:elaaJQ=q_:9PHbon-i-1414:4811口FG-pxigf!r.eworkd二dbe*t.SSLEforodt*AFactofV*miOffift:Fanduuteaql-rrfl-F-cieidr.s.lilatthemot電thclalsaap4Eh|2O11-X.-X3 :$&ra?org.#pFEwtwaricB二 Ho 卜學(xué)upporx.?:LErrorU已gaFteEory僖息;3QLEfrOC&dloHledi(DB3,D4byfH3,KSOL,rnza*.MS-SQLrMySQLFOc*cl*rP*htq三二工二m二二:
22、q小:三亡七寸,二urpi.ci:i=型人二口工工廿EhAu工甘二口工10.二11仁.口工白口:.fm從啟動信息中可以發(fā)現(xiàn) Spring 發(fā)現(xiàn)了我們自定義的 sql-error-codes.xml,并替換其中的 HSQL 數(shù)據(jù)庫處理部分,使用了我們定義的異常,模擬出主鍵重復(fù)的異常后,VehicleDuplicateKeyException 就拋出了。除此之外,還可以實現(xiàn)SQLExceptionTranslator 接口,并在 JDBC 模板中注入其實例來實現(xiàn)異??刂疲覀儊砜匆幌?,首先創(chuàng)建一個 Translator 類:1.packageorg.ourpioneer.vehicle.excep
23、tion;2.importjava.sql.SQLException;3.importorg.springframework.dao.DataAccessException;4.importorg.springframework.jdbc.UncategorizedSQLException;5.importorg.springframework.jdbc.support.SQLExceptionTranslator;6.publicclassVehicleDuplicateKeyTranslatorimplementsSQLExceptionTranslator7.publicDataAcce
24、ssExceptiontranslate(Stringtask,Stringsql,8.SQLExceptionex)9.if(task=null)10.task=;11.12.if(sql=null)13.14.if(ex.getErrorCode()=-104)15.returnnewVehicleDuplicateKeyException(buildMessage(task,sql,ex);16.else17.returnnewUncategorizedSQLException(task,sql,ex);18.19.20.privateStringbuildMessage(Stringt
25、ask,Stringsql,SQLExceptionex)21.return數(shù)據(jù)庫操彳異常:+task+;SQL+sql+;+ex.getMessage();22.23.24.packageorg.ourpioneer.vehicle.exception;25.importjava.sql.SQLException;26.importorg.springframework.dao.DataAccessException;27.importorg.springframework.jdbc.UncategorizedSQLException;28.importorg.springframework
26、.jdbc.support.SQLExceptionTranslator;29.publicclassVehicleDuplicateKeyTranslatorimplementsSQLExceptionTranslator30.publicDataAccessExceptiontranslate(Stringtask,Stringsql,31.SQLExceptionex)32.if(task=null)33.task=;34.35.if(sql=null)36.37.if(ex.getErrorCode()=-104)38.returnnewVehicleDuplicateKeyExcep
27、tion(buildMessage(task,sql,ex);39.else40.returnnewUncategorizedSQLException(task,sql,ex);41.42.43.privateStringbuildMessage(Stringtask,Stringsql,SQLExceptionex)return數(shù)據(jù)庫操彳異常:+task+;SQL+sql+44.;+ex.getMessage();45.46.其中,要覆蓋 translate 方法,方法有三個參數(shù),task 表示當(dāng)前操作要進行的任務(wù)是什么,sql就是執(zhí)行的 sql 語句, ex 表示 SQLException
28、,我們可以從中獲取異常信息, 其處理代碼僅僅捕捉了錯誤碼為-104(HSQL 數(shù)據(jù)庫)的錯誤,其余的配置信息可以根據(jù)需要來自行添加。之后要在 Spring 中重新配置它們:1. beanid=vehicleDuplicateKeyTranslator2.class=org.ourpioneer.vehicle.exception.VehicleDuplicateKeyTranslator/bean3. beanid=jdbcTemplateclass=org.springframework.jdbc.core.JdbcTpertyname=exceptionTransl
29、atorref=vehicleDuplicateKeyTranslator/5. propertyname=dataSourceref=dataSource/6. /bean7. beanid=vehicleDAOclass=org.ourpioneer.vehicle.dao.VehicleDAOImpl8. propertyname=jdbcTemplateref=jdbcTemplate/9. /bean10.beanid=vehicleDuplicateKeyTranslator11.class=org.ourpioneer.vehicle.exception.VehicleDupldbc.core.JdbcTpertyname=exceptionTranslatorref=vehicleDuplicateKeyTranslator/14.propertyname=dataSourceref=dataSource/15./bean16.b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際貿(mào)易試題庫及答案
- 校外小飯桌食品安全教育
- 產(chǎn)品眾籌業(yè)務(wù)合同范例
- 保證收益合同范例
- 機器學(xué)習(xí)技術(shù)在智能交通中的應(yīng)用
- 100個范例合同范例
- 洗煤行業(yè)分析
- ktv經(jīng)理用工合同范例
- 保險代理保證合同范例
- 買房附屬補充合同范例
- 2024年林芝地區(qū)人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2025年全國國家版圖知識測試競賽題庫(附答案)
- 旅游學(xué)概論-旅游產(chǎn)品和旅游市場
- 2024年居間業(yè)務(wù)收費標(biāo)準(zhǔn)最高限額合同
- 河南省“極飛杯”無人機應(yīng)用技術(shù)技能大賽-無人機植保應(yīng)用-技術(shù)文件
- GB 4404.1-2024糧食作物種子第1部分:禾谷類
- 計算流體力學(xué)CFD
- 三大戰(zhàn)役完整版本
- DB11T 353-2021 城市道路清掃保潔質(zhì)量與作業(yè)要求
- 2024電力建設(shè)土建工程施工技術(shù)檢驗規(guī)范
- 2024年中國除塵器濾袋市場調(diào)查研究報告
評論
0/150
提交評論