Spring訪問數(shù)據(jù)庫(kù)異常的處理方法_第1頁(yè)
Spring訪問數(shù)據(jù)庫(kù)異常的處理方法_第2頁(yè)
Spring訪問數(shù)據(jù)庫(kù)異常的處理方法_第3頁(yè)
Spring訪問數(shù)據(jù)庫(kù)異常的處理方法_第4頁(yè)
Spring訪問數(shù)據(jù)庫(kù)異常的處理方法_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論