版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Spring 訪問數(shù)據(jù)庫(kù)異常的處理方法來(lái)源:Javaeye 博客發(fā)布時(shí)間:2011-01-2220:45 閱讀:134 次原文鏈接全屏閱讀收藏編輯點(diǎn)評(píng):天我們將談?wù)?Spring 訪問數(shù)據(jù)庫(kù)異常的處理方法,使用 JDBCAPI 時(shí),很多操作都要聲明拋出 java.sql.SQLException 異常,通常情況下是要制定異常處理策略。使用 JDBCAPI 時(shí),很多操作都要聲明拋出 java.sql.SQLException 異常,通常情況下是要制定異常處理策略。而 Spring 的 JDBC 模塊為我們提供了一套異常處理機(jī)制,這套異常系統(tǒng)的基類是 DataAccessException,它是
2、RuntimeException 的一種類型,那么就不用強(qiáng)制去捕捉異常了,Spring 的異常體系如下:RuntimeExceptonNestedRuntimeExceptifjn5DataAccessExceptionrypeMismatcfiDataAccessExceptionUncategorizedSQLException目前為止我們還沒有明確地處理 Spring 中 JDBC 模塊的異常。要理解它的異常處理機(jī)制,我們來(lái)做幾個(gè)測(cè)試??聪旅娴臏y(cè)試代碼: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 語(yǔ)句,不使用自增主鍵的特性,并在這里設(shè)置重復(fù)的主鍵,那么運(yùn)行程序,就會(huì)報(bào)出字段重復(fù)的異常。下面來(lái)捕
7、捉這個(gè)異常: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.此時(shí),我們就可以獲得錯(cuò)誤碼和 SQL 狀態(tài)(不同的數(shù)據(jù)庫(kù)系統(tǒng)會(huì)有不同):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ù)庫(kù)的錯(cuò)誤碼可以到 org.hsqldb.Trace 類中查看,只要注意運(yùn)行結(jié)果會(huì)有一個(gè)負(fù)號(hào),而類中定義的是沒有負(fù)號(hào)的。這樣就知道了這個(gè)錯(cuò)誤的具體含義,比如 104:唯一約束驗(yàn)證失敗。這就是我們故意設(shè)置的重復(fù)主鍵問題。Spring 的 JDBC 模塊為我們預(yù)定義了一些
10、錯(cuò)誤代碼,它存儲(chǔ)在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ù)庫(kù)的錯(cuò)誤碼內(nèi)容也可以從這個(gè)文件之中獲得。下面我們來(lái)看看如何自定義異常處理。上面我們已經(jīng)知道在 org.springframework.jdbc.support 包下有sql-error-codes.xml 文件,在 Spring 啟動(dòng)時(shí)會(huì)自動(dòng)讀取這個(gè)文件中的錯(cuò)誤碼,它為我們預(yù)分類了一些錯(cuò)誤碼,而我們可以加強(qiáng)它,來(lái)使用我們自定義的異常。首先,定義一個(gè)異常類,我們就來(lái)自定義一下前面的-104 錯(cuò)誤,就是 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.之后我們重新新建一個(gè) sql-error-codes.xml 代碼,并將它放到類路徑的根目錄下,這樣 Spring 會(huì)發(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 塊,啟動(dòng)程序,我們就可以看到如下內(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從啟動(dòng)信息中可以發(fā)現(xiàn) Spring 發(fā)現(xiàn)了我們自定義的 sql-error-codes.xml,并替換其中的 HSQL 數(shù)據(jù)庫(kù)處理部分,使用了我們定義的異常,模擬出主鍵重復(fù)的異常后,VehicleDuplicateKeyException 就拋出了。除此之外,還可以實(shí)現(xiàn)SQLExceptionTranslator 接口,并在 JDBC 模板中注入其實(shí)例來(lái)實(shí)現(xiàn)異??刂疲覀儊?lái)看一下,首先創(chuàng)建一個(gè) 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ù)庫(kù)操彳異常:+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ù)庫(kù)操彳異常:+task+;SQL+sql+44.;+ex.getMessage();45.46.其中,要覆蓋 translate 方法,方法有三個(gè)參數(shù),task 表示當(dāng)前操作要進(jìn)行的任務(wù)是什么,sql就是執(zhí)行的 sql 語(yǔ)句, ex 表示 SQLException
28、,我們可以從中獲取異常信息, 其處理代碼僅僅捕捉了錯(cuò)誤碼為-104(HSQL 數(shù)據(jù)庫(kù))的錯(cuò)誤,其余的配置信息可以根據(jù)需要來(lái)自行添加。之后要在 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中課件大全教學(xué)課件
- 高中技術(shù)高二上學(xué)期期中考試試題
- 南京工業(yè)大學(xué)浦江學(xué)院《自動(dòng)化儀表與過程控制》2023-2024學(xué)年第一學(xué)期期末試卷
- 網(wǎng)絡(luò)培訓(xùn)課件教學(xué)課件
- doyoulikepears說(shuō)課稿全英文
- 南京工業(yè)大學(xué)浦江學(xué)院《建筑工程造價(jià)》2022-2023學(xué)年第一學(xué)期期末試卷
- 《小手真干凈》說(shuō)課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《概率論與數(shù)理統(tǒng)計(jì)(理工)》2022-2023學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)《主題短片創(chuàng)作II》2023-2024學(xué)年第一學(xué)期期末試卷
- 租地合同安全協(xié)議書(2篇)
- 胸痹中醫(yī)臨床路徑和診療方案
- 歐盟鐵路機(jī)車車輛互聯(lián)互通技術(shù)規(guī)范_TSI_CE認(rèn)證解析
- 個(gè)人獨(dú)資企業(yè)有限公司章程(模板)
- 小學(xué)生安全用電知識(shí)(課堂PPT)
- 裝飾自己的名字說(shuō)課稿
- 人教版(PEP)四年級(jí)上冊(cè)英語(yǔ)unit 1 My classroom圖文完美版(課堂PPT)
- 幼小銜接中存在的問題及對(duì)策
- 中級(jí)漢語(yǔ)期末考試測(cè)試題(共5頁(yè))
- 《國(guó)家電網(wǎng)公司安全生產(chǎn)事故隱患排查治理管理辦法》(國(guó)家電網(wǎng)安監(jiān)[
- 水保監(jiān)理報(bào)告范文
- xx售樓部鋼結(jié)構(gòu)及玻璃幕墻工程拆除施工方案
評(píng)論
0/150
提交評(píng)論