Spring访问数据库异常的处理方法_第1页
Spring访问数据库异常的处理方法_第2页
Spring访问数据库异常的处理方法_第3页
Spring访问数据库异常的处理方法_第4页
Spring访问数据库异常的处理方法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Spring 访问数据库异常的处理方法来源:Javaeye 博客发布时间:2011-01-2220:45 阅读:134 次原文链接全屏阅读收藏编辑点评:天我们将谈谈 Spring 访问数据库异常的处理方法,使用 JDBCAPI 时,很多操作都要声明抛出 java.sql.SQLException 异常,通常情况下是要制定异常处理策略。使用 JDBCAPI 时,很多操作都要声明抛出 java.sql.SQLException 异常,通常情况下是要制定异常处理策略。而 Spring 的 JDBC 模块为我们提供了一套异常处理机制,这套异常系统的基类是 DataAccessException,它是

2、RuntimeException 的一种类型,那么就不用强制去捕捉异常了,Spring 的异常体系如下:RuntimeExceptonNestedRuntimeExceptifjn5DataAccessExceptionrypeMismatcfiDataAccessExceptionUncategorizedSQLException目前为止我们还没有明确地处理 Spring 中 JDBC 模块的异常。要理解它的异常处理机制,我们来做几个测试。看下面的测试代码: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 语句,不使用自增主键的特性,并在这里设置重复的主键,那么运行程序,就会报出字段重复的异常。下面来捕

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 状态(不同的数据库系统会有不同):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*关于 HSQL 数据库的错误码可以到 org.hsqldb.Trace 类中查看,只要注意运行结果会有一个负号,而类中定义的是没有负号的。这样就知道了这个错误的具体含义,比如 104:唯一约束验证失败。这就是我们故意设置的重复主键问题。Spring 的 JDBC 模块为我们预定义了一些

10、错误代码,它存储在org.springframework.jdbc.support 包下的 sql-error-codes.xml 文件中,其中描述HSQL 的内容为: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其余数据库的错误码内容也可以从这个文件之中获得。下面我们来看看如何自定义异常处理。上面我们已经知道在 org.springframework.jdbc.support 包下有sql-error-codes.xml 文件,在 Spring 启动时会自动读取这个文件中的错误码,它为我们预分类了一些错误码,而我们可以加强它,来使用我们自定义的异常。首先,定义一个异常类,我们就来自定义一下前面的-104 错误,就是 HSQL 的重复键的问题: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 会发现它并使用我们自定义的文件,在配置中定义如下: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,就可以使用我们自己定义的异常类了。在主函数中移除 try/catch 块,启动程序,我们就可以看到如下内容: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 卜学upporx.?:LErrorU已gaFteEory僖息;3QLEfrOC&dloHledi(DB3,D4byfH3,KSOL,rnza*.MS-SQLrMySQLFOc*cl*rP*htq三二工二m二二:

22、q小:三亡七寸,二urpi.ci:i=型人二口工工廿EhAu工甘二口工10.二11仁.口工白口:.fm从启动信息中可以发现 Spring 发现了我们自定义的 sql-error-codes.xml,并替换其中的 HSQL 数据库处理部分,使用了我们定义的异常,模拟出主键重复的异常后,VehicleDuplicateKeyException 就抛出了。除此之外,还可以实现SQLExceptionTranslator 接口,并在 JDBC 模板中注入其实例来实现异常控制,我们来看一下,首先创建一个 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数据库操彳异常:+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数据库操彳异常:+task+;SQL+sql+44.;+ex.getMessage();45.46.其中,要覆盖 translate 方法,方法有三个参数,task 表示当前操作要进行的任务是什么,sql就是执行的 sql 语句, ex 表示 SQLException

28、,我们可以从中获取异常信息, 其处理代码仅仅捕捉了错误码为-104(HSQL 数据库)的错误,其余的配置信息可以根据需要来自行添加。之后要在 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论