JDBC的异常转换器
传统的JDBC API在发生几乎所有的数据操作问题都抛出相同的SQLException,它将异常的细节性信息封装在异常属性中,所以如果希望了解异常的具体原因,你必须分析异常对象的信息。
SQLException拥有两个代表异常具体原因的属性:错误码和SQL状态码,前者是数据库相关的,可通过getErrorCode()返回,其值的类型是int;而后者是一个标准的错误代码,可通过getSQLState()返回,是一个String类型的值,由5字符组成。
Spring根据错误码和SQL状态码信息将SQLExeption翻译成Spring DAO的异常体系。在org.springframework.jdbc.support包中定义了SQLExceptionTranslator接口,该接口的两个实现类SQLErrorCodeSQLExceptionTranslator和SQLStateSQLExceptionTranslator分别负责处理SQLException中错误代码和SQL状态码的翻译工作。将SQLException翻译成Spring DAO异常体系的工作是比较艰辛的,但Spring框架替我们完成这项艰巨的工作并保证转换的正确性,我们有充分的理由依赖这个转换的正确性。
spring这样做主要有2个作用,一是统一建立spring框架的异常框架体系,使得不同的异常最后都封装转换成spring异常体系框架中,这个框架体系分类很详细,这样对问题也比较好定位。
二是使得spring对底层异常保持独立,涡轮采用什么样的dao层,都不影响spring的异常体系。
异常的基本概念:
实现代码:
import org.springframework.dao.ConcurrencyFailureException; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.PermissionDeniedDataAccessException; import org.springframework.dao.RecoverableDataAccessException; import org.springframework.dao.TransientDataAccessResourceException; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.UncategorizedSQLException; /** * 统一捕获异常 * @author zhengjunxiang * */ public class CaptureException { //处理异常方法 private void catchException(){ try{ }catch(BadSqlGrammarException e1){//NonTransient /** * Exception thrown when SQL specified is invalid. Such exceptions always have * a <code>java.sql.SQLException</code> root cause. * * <p>It would be possible to have subclasses for no such table, no such column etc. * A custom SQLExceptionTranslator could create such more specific exceptions, * without affecting code using this class. * * @author Rod Johnson * @see InvalidResultSetAccessException */ }catch(DataIntegrityViolationException e2){ /** * Exception thrown when an attempt to insert or update data * results in violation of an integrity constraint. Note that this * is not purely a relational concept; unique primary keys are * required by most database types. * * @author Rod Johnson */ }catch(DataAccessResourceFailureException e3){ /** * Data access exception thrown when a resource fails completely: * for example, if we can't connect to a database using JDBC. * * @author Rod Johnson * @author Thomas Risberg */ }catch(PermissionDeniedDataAccessException e5){ /** * Exception thrown when the underlying resource denied a permission * to access a specific element, such as a specific database table. * * @author Juergen Hoeller * @since 2.0 */ }catch(ConcurrencyFailureException e6){//Transient /** * Exception thrown on concurrency failure. * * <p>This exception should be subclassed to indicate the type of failure: * optimistic locking, failure to acquire lock, etc. * * @author Thomas Risberg * @since 1.1 * @see OptimisticLockingFailureException * @see PessimisticLockingFailureException * @see CannotAcquireLockException * @see DeadlockLoserDataAccessException */ }catch(TransientDataAccessResourceException e7){ /** * Data access exception thrown when a resource fails temporarily * and the operation can be retried. * * @author Thomas Risberg * @since 2.5 * @see java.sql.SQLTransientConnectionException */ }catch(RecoverableDataAccessException e8){//Recoverable /** * Data access exception thrown when a previously failed operation might be able * to succeed if the application performs some recovery steps and retries the entire * transaction or in the case of a distributed transaction, the transaction branch. * At a minimum, the recovery operation must include closing the current connection * and getting a new connection. * * @author Thomas Risberg * @since 2.5 * @see java.sql.SQLRecoverableException */ }catch(UncategorizedSQLException e9){ /** * Exception thrown when we can't classify a SQLException into * one of our generic data access exceptions. * * @author Rod Johnson * @author Juergen Hoeller */ }catch(DataAccessException e10){ //所以异常的基类,下包括事务异常和非事务异常,以上是spring抛出的SqlException异常 /** * Root of the hierarchy of data access exceptions discussed in * <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0764543857/">Expert One-On-One J2EE Design and Development</a>. * Please see Chapter 9 of this book for detailed discussion of the * motivation for this package. * * <p>This exception hierarchy aims to let user code find and handle the * kind of error encountered without knowing the details of the particular * data access API in use (e.g. JDBC). Thus it is possible to react to an * optimistic locking failure without knowing that JDBC is being used. * * <p>As this class is a runtime exception, there is no need for user code * to catch it or subclasses if any error is to be considered fatal * (the usual case). * * @author Rod Johnson */ }catch(NumberFormatException nfe){ /** * 数字转换异常 */ }catch(Throwable e){ /** * 异常的最基类 */ } } }
相关推荐
SpringBoot 是一个基于 Spring 框架的快速开发工具,它简化了配置并集成了大量常用的第三方库,如数据访问、安全、缓存等。Thymeleaf 是一个现代服务器端 HTML 模板引擎,特别适合与 SpringMVC 结合使用,提供动态...
4. **AOP技术**:Spring框架集成了AOP技术,使得诸如权限拦截、运行时监控等功能的实现变得异常简单,进一步增强了应用程序的功能性和安全性。 5. **辅助类支持**:Spring框架提供了一系列辅助类,可以帮助开发者...
2. **统一异常处理**: - SpringBoot提供了一种全局异常处理机制,可以通过@ControllerAdvice或@ExceptionHandler注解创建一个处理类,捕获并统一处理所有控制器可能出现的异常。 - 异常处理类中可以定义各种异常...
因此,统一异常处理是必要的,以实现更高效的故障排查和用户体验。 博客中提到的解决方案可能是通过自定义全局异常处理器实现的。在Spring Boot中,我们可以创建一个实现了`ErrorController`接口的类,或者定义一个...
7. **异常处理**:Spring提供了全局异常处理机制,可以捕获并处理Struts2中抛出的异常,提供统一的错误页面或者返回JSON格式的错误信息。 8. **国际化**:Struts2和Spring都可以支持国际化,集成后可以更好地协调这...
13. **异常处理**:Spring MVC提供全局异常处理机制,可以统一处理应用程序中抛出的异常。 14. **测试支持**:Spring提供MockMVC工具,可以在不运行整个Web服务器的情况下,对Spring MVC应用程序进行单元测试和集成...
5. **Spring JDBC**和**JPA**:Spring提供了对数据库操作的支持,包括JDBC抽象层,简化了SQL的编写和异常处理。同时,Spring也支持Java Persistence API(JPA),提供了一种标准的方式来访问和操作持久化数据。 6. ...
10. **异常处理**:Spring MVC 提供了统一的异常处理机制,通过 @ExceptionHandler 或配置 ExceptionResolver,可以优雅地处理应用中的异常。 11. **RESTful 支持**:Spring MVC 通过 @RequestMapping 注解支持 ...
项目可能采用了Spring Boot的全局异常处理机制,通过实现`ErrorAttributes`接口和定义`@ControllerAdvice`注解的类,可以捕获并统一处理所有控制器级别的异常,返回格式化的错误信息,增强系统的健壮性。 拦截器...
结合Spring的异常翻译机制,可以实现统一的异常处理策略。 7. **测试**:Spring的MockMVC可以与Wink集成,用于单元测试和集成测试REST服务。这样可以在不实际发送HTTP请求的情况下,模拟客户端和服务器的交互。 8....
**Spring的优点** 包括但不限于:提高代码可测试性(通过依赖注入和接口编程)、降低组件之间的耦合、简化事务管理、支持多种数据访问策略、促进模块化和解耦、提供统一的异常处理机制以及增强应用的可扩展性。...
7. **异常处理**:提供了强大的异常处理机制,简化了异常处理代码。 8. **国际化(I18N)支持**:支持多语言应用程序,方便进行国际化和本地化。 #### Spring框架的发展历程 - **2003年6月**:Spring框架由Rod ...
创建一个全面的Spring Boot应用,涵盖了多个关键领域,包括RESTful接口、数据库交互、用户认证、分布式Token的实现(JWT)、Redis缓存操作、日志记录以及统一异常处理。下面将详细阐述这些知识点。 1. **Spring ...
Spring框架是一个全面的企业级应用开发框架,它提供依赖注入(DI)和面向切面编程(AOP)等功能,简化了Java应用的复杂性。另一方面,Hibernate是一个对象关系映射(ORM)框架,允许开发者用Java对象来操作数据库...
4. 异常处理:由于达梦数据库的异常处理机制可能与标准JDBC有所不同,需要在代码中适当地捕获和处理。 最后,关于Spring Cloud的集成,我们需要考虑以下几点: 1. 服务注册与发现:使用Eureka或Consul等服务注册与...
本教程将深入探讨如何利用Spring Boot的AOP特性来实现日志的统一处理。 首先,我们需要了解AOP的基本概念。AOP允许程序员定义“切面”,它是一个包含业务逻辑和元数据的模块,可以跨越多个对象进行分布。在Spring中...
这允许我们在一个地方捕获并处理所有控制器层的异常,统一返回格式化的错误信息,同时记录日志,提高系统的异常处理能力。 5. **日志打印**:在业务异常发生时,详细的日志记录有助于定位问题。Spring Boot集成了...
同时,Spring Data 提供了一套统一的接口,用于操作各种数据存储,如 JPA、MongoDB等。 6. **Spring Boot** 虽然不在 Spring 4.x 的范畴内,但 Spring Boot 在这个时期已经兴起,它简化了 Spring 应用的启动和配置...
4. **Spring DAO**:提供了一套JDBC异常层次结构,简化了异常处理,同时还提供了事务管理支持。 5. **Spring Context**:建立在core之上,提供了与环境相关的支持,比如资源加载、事件传播和国际化。 6. **Spring ...