欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    Spring访问数据库异常的处理方法.docx

    • 资源ID:4925025       资源大小:265.59KB        全文页数:18页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Spring访问数据库异常的处理方法.docx

    Spring访问数据库异常的处理方法来源:Javaeye博客发布时间:2011-01-22 20:45阅读:134次原文链接 全屏阅读 收藏 编辑点评:天我们将谈谈Spring访问数据库异常的处理方法,使用JDBC API时,很多操作都要声明抛 出java.sql.SQLException异常,通常情况下是要制定异常处理策略。使用JDBC API时,很多操作都要声明抛出java.sql.SQLException异常,通常情况 下是要制定异常处理策略。而Spring的JDBC模块为我们提供了一套异常处理机制,这套 异常系统的基类是DataAccessException,它是RuntimeException的一种类型,那么 就不用强制去捕捉异常了,Spring的异常体系如下:目前为止我们还没有明确地处理Spring中JDBC模块的异常。要理解它的异常处理机 制,我们来做几个测试。看下面的测试代码:1. public void insert(final Vehicle vehicle) 2. String sql = "insert into vehicle3. (ID,PLATE,CHASSIS,COLOR,WHEEL,SEAT) values4. (:id,:plate,:chassis,:color,:wheel,:seat)”;5. SqlParameterSource parameterSource new BeanPropert ySqlParameterSource(6. vehicle);7. getSimpleJdbcTemplate().update(sql, parameterSourc e);8. 9. public void insert(final Vehicle vehicle) 10. String sql = "insert into vehicle(ID,PLATE,CHASS IS,COLOR,WHEEL,SEAT)11. values(:id,:plate,:chassis,:color,:wheel,:seat)”;12. SqlParameterSource parameterSource new BeanPro pertySqlParameterSource(13. vehicle);14. getSimpleJdbcTemplate().update(sql, parameterSou rce);15. public static void main(String args) ApplicationContext ctx new ClassPathXmlApplicationC ontext("classpath:org/ourpioneer/vehicle/spring/applicationContex t.xml");VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("vehicleDAO");Vehicle vehicle new Vehicle("辽B-000000", "1A000000 01”, "RED”, 4, 4);vehicle.setld(l);vehicleDAO.insert(vehicle); public static void main(String args) Applicationcontext ctx new ClassPathXmlApplicationC ontext("classpath:org/ourpioneer/vehicle/spring/applicationContex t.xml");VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("veh icleDAO");Vehicle vehicle new Vehicle("辽B-000000", "1A000000 01”, "RED”, 4, 4);vehicle.setld(l);vehicleDAO.insert(vehicle);修改SQL语句,不使用自增主键的特性,并在这里设置重复的主键,那么运行程序, 就会报出字段重复的异常。下面来捕捉这个异常:1. try 2. vehicleDAO.insert(vehicle);3. catch (DataAccessException e) 4.SQLException sqle = (SQLException) e.getCause();5.System.out.println("Error code: " + sqle.getErrorCode();6. System.out.println("SQL state: " + sqle.getSQLState ();7. 8. try 9. vehicleDAO.insert(vehicle);10. catch (DataAccessException e) 11. SQLException sqle = (SQLException)e.getCause();12. System.out.println("Error code:" + sqle.getErrorCode();13. System.out.println("SQL state:" +sqle.getSQLState();14. 此时,我们就可以获得错误码和SQL状态(不同的数据库系统会有不同):关于HSQL数据库的错误码可以到org.hsqldb.Trace类中查看,只要注意运行结果 会有一个负号,而类中定义的是没有负号的。这样就知道了这个错误的具体含义,比如104: 唯一约束验证失败。这就是我们故意设置的重复主键问题。Spring的JDBC模块为我们预定义了一些错误代码,它存储在org.springframework.jdbc.support 包下的 sql-error-codes.xml 文件中,其中描述 HSQL的内容为:1. bean id="HSQL"class="org.springframework.jdbc.support.SQLErrorCodes"2. property name="databaseProductName”3. valueHSQL Database Engine/value4. /property5. property name="badSqlGrammarCodes”6. value-22,-28/value7. /property8. property name="duplicateKeyCodes”9. value-104/value10. /property11. property name="dataIntegrityViolationCodes”12. value-9/value13. /property14. property name="dataAccessResourceFailureCodes”15. value-80/value16. /property17. /bean18.bean id="HSQLClass="org.springframework.jdbc.support.SQLErrorCodes"19. property name="databaseProductName”20. valueHSQL Database Engine/value21. /property22. property name="badSqlGrammarCodes”23. value-22,-28/value24. /property25. property name="duplicateKeyCodes”26. value-104/value27. /property28. property name="dataIntegrityViolationCodes”29. value-9/value30. /property31. property name="dataAccessResourceFailureCodes”32. value-80/value33. /property34. /bean其余数据库的错误码内容也可以从这个文件之中获得。下面我们来看看如何自定义异常处理。上面我们已经知道在org.springframework.jdbc.support包下有sql-error-codes.xml文件,在Spring启动时会自动读取这个文件中的错误码,它为我们 预分类了一些错误码,而我们可以加强它,来使用我们自定义的异常。首先,定义一个异常 类,我们就来自定义一下前面的-104错误,就是HSQL的重复键的问题:1. package org.ourpioneer.vehicle.exception;2. import org.springframework.dao.DatalntegrityViolationEx ception;3. public class VehicleDuplicateKeyException extends4. DataIntegrityViolationException 5. public VehicleDuplicateKeyException(String msg) 6. super(msg);7. 8. public VehicleDuplicateKeyException(String msg, Thro wable cause) 9. super(msg, cause);10. 11. 12. package org.ourpioneer.vehicle.exception;13. import org.springframework.dao.DataIntegrityViolationE xception;14. public class VehicleDuplicateKeyException extends15. DataIntegrityViolationException 16. public VehicleDuplicateKeyException(String msg) 17. super(msg);18. 19. public VehicleDuplicateKeyException(String msg, Thr owable cause) 20.super(msg, cause);121.22. 之后我们重新新建一个sql-error-codes.xml代码,并将它放到类路径的根目录下,这样Spring会发现它并使用我们自定义的文件,在配置中定义如下:1. bean id="HSQL"class="org.springframework.jdbc.support. SQLErrorCodes"2. property name="databaseProductName" value="HSQLDatabase Engine" /3. propertyname="useSqlStateForTranslation"value="false" /4. propertyname="customTranslations"5. list6. ref local="vehicleDuplicateKeyTranslation"/7. /list8. /property9. /bean10. bean id="vehicleDuplicateKeyTranslation"11. class="org.springframework.jdbc.support.CustomSQLEr rorCodesTranslation"12. property name="errorCodes" value="-104" /13. property name="exceptionClass"14. value="org.ourpioneer.vehicle.exception.VehicleDupl15./bean16. bean id="HSQL"class="org.springframework.jdbc.support.SQLErrorCodes"17. property name="databaseProductName" value="HSQL Database Engine" /18. propertyname="useSqlStateForTranslation"value="false" /19. propertyname="customTranslations"20. list21. ref local="vehicleDuplicateKeyTranslation "/22. /list23. /property24. /bean25. bean id="vehicleDuplicateKeyTranslation"26. class="org.springframework.jdbc.support.CustomSQLEr rorCodesTranslation"27. property name="errorCodes" value="-104" /28. property name="exceptionClass"29. value="org.ourpioneer.vehicle.exception.VehicleDupl icateKeyException" /30./beanHSQL 的 bean 的名称不要改,并将 useSqlStateForTranslation 置为 false,就可以使用我们自己定义的异常类了。在主函数中移除try/catch块,启动程序,我们就可以看 到如下内容:从启动信息中可以发现Spring发现了我们自定义的sql-error-codes.xml,并替换其中的HSQL数据库处理部分,使用了我们定义的异常,模拟出主键重复的异常后,VehicleDuplicateKeyException就抛出了。除此之外,还可以实现SQLExceptionTranslator接口,并在JDBC模板中注入其实例来实现异常控制,我们来 看一下,首先创建一个Translator类:1. package org.ourpioneer.vehicle.exception;2. import java.sql.SQLException;3. import org.springframework.dao.DataAccessException;4. import org.springframework.jdbc.UncategorizedSQLExcepti on;5. import org.springframework.jdbc.support.SQLExceptionTra nslator;6. public class VehicleDuplicateKeyTranslator implements SQLExceptionTranslator 7.public DataAccessException translate(String task, String sql,8.SQLException ex) 9.if (task = null) 10.task =""11.12.if (sql = null) 13.14.if (ex.getErrorCode() = -104) 15.return new VehicleDuplicateKeyException(buildMessage(task, sql, ex);16.else 17.return new UncategorizedSQLException(task, sql, ex);18.19.20. private String buildMessage(String task, String sql, SQLException ex) 21. return ”数据库操作异常:"+ task + " SQL " + sql + ; " + ex.getMessage();22. 23. 24. package org.ourpioneer.vehicle.exception;25. import java.sql.SQLException;26. import org.springframework.dao.DataAccessException;27. importorg.springframework.jdbc.UncategorizedSQLException;28. importorg.springframework.jdbc.support.SQLExceptionTranslator;29. publicclass VehicleDuplicateKeyTranslator implements SQLExceptionTranslator 30.publicDataAccessException translate(String task, String sql,31.SQLException ex)32.if(task = null) 33.task34.35.if(sql = null) 36.37.if(ex.getErrorCode()-104) 38.return new VehicleDuplicateKeyException(buildMessage(task,sql, ex);39.else 40.return new UncategorizedSQLException(task, sql, ex);41.42.43.private String buildMessage(String task, String sql,SQLException ex) 44.return ”数据库操作异常:"+ task + " SQL " + sql +" " + ex.getMessage();45. 46. 其中,要覆盖translate方法,方法有三个参数,task表示当前操作要进行的任务是什么,sql就是执行的sql语句,ex表示SQLException,我们可以从中获取异常信息,其处理代码仅仅捕捉了错误码为-104(HSQL数据库)的错误,其余的配置信息可以根据 需要来自行添加。之后要在Spring中重新配置它们:1. bean id="vehicleDuplicateKeyTranslator”2. class="org.ourpioneer.vehicle.exception.VehicleDuplica teKeyTranslator"/bean3. bean id="jdbcTemplate"class="org.springframework.jdbc. core.JdbcTemplate”4. property name="exceptionTranslator" ref="vehicleDup licateKeyTranslator" /5. property name="dataSource" ref="dataSource" /6. /bean7. bean id="vehicleDAO"class="org.ourpioneer.vehicle.dao.VehicleDAOImpl”8. property name="jdbcTemplate" ref="jdbcTemplate" /9. /bean10. bean id="vehicleDuplicateKeyTranslator"11. class="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyTranslator"/bean12. bean id="jdbcTemplateclass="org.springframework.jdbc.core.JdbcTemplate”13. property name="exceptionTranslator" ref="vehicle DuplicateKeyTranslator" /14. property name="dataSource" ref="dataSource" /15. /bean16. bean id="vehicleDAOclass="org.ourpioneer.vehicle.dao.VehicleDAOImpl"17. property name="jdbcTemplate" ref="jdbcTemplate”/18. /bean调整DAO实现类的代码:1. public class VehicleDAOImpl extends SimpleJdbcDaoSupport implements VehicleDAO 2. 3. public void insert(final Vehicle vehicle) 4. String sql = "insert into vehicle(ID,PLATE,CHASSI S,COLOR,WHEEL,SEAT) values(?,?,?,?,?,?)”;5. getJdbcTemplate().update(sql, vehicle.getId(),vehicle.getPlate(),vehicle.getChassis(),vehicle.getColor(),veh icle.getWheel(),vehicle.getSeat();6. '/. . 8. 9. public class VehicleDAOImpl extends SimpleJdbcDaoSupport implements VehicleDAO 10. 11. public void insert(final Vehicle vehicle) 12. String sql = "insert into vehicle(ID,PLATE,CHASS IS,COLOR,WHEEL,SEAT) values(?,?,?,?,?,?)”;13. getJdbcTemplate().update(sql, vehicle.getId(),vehicle.getPlate(),vehicle.getChassis(),vehicle.getColor(),veh icle.getWheel(),vehicle.getSeat();14. 1516. 为了进行测试,其它代码可不用修改,这样继续运行测试程序,同时将 sql-error-codes.xml文件从类路径的根路径下去除,就可以得到如下结果:Spring的JDBC模块在自定义异常处理上也非常灵活,可以选择自己喜欢的方式来实现。希望对使用者有用,欢迎交流,下一部分开始介绍Spring的ORM。

    注意事项

    本文(Spring访问数据库异常的处理方法.docx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开