【JDBC4.2】JDBC中的Exception

2024-05-31 22:58
文章标签 jdbc exception jdbc4.2

本文主要是介绍【JDBC4.2】JDBC中的Exception,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JDBC中的异常类包括SQLException类和它的子类们。

1.SQLException

SQLException包含下面信息:

信息项获取方法备注
错误描述SQLException#getMessage
SQLStateSQLException#getSQLState
error codeSQLException#getMessage
causeSQLException#getCause递归获取一个异常上的Throwable
多个异常SQLException#getNextException递归如果已经没有异常,返回null

对Chained Execeptions的支持

chained exceptions :异常链或链式异常
在java代码中常常会再捕获一个异常后抛出另外一个异常,并且希望把异常原始信息保存下来,这被称为异常链
JDK1.4以后,所有Throwable的子类子构造器中都可以接受一个cause对象作为参数,这个cause就异常原由,代表着原始异常,即使在当前位置创建并抛出行的异常,也可以通过这个cause追踪到异常最初发生的位置。比如:throw new RuntimeException("ex---2",e1); 把e1加载到另一个异常的异常链上。

SQLException对异常链的支持包括:
1.增加了构造函数支持cause Throwable参数
2.可以使用ForEach循环获取所有Cause(代替每次getNextException后调用getCause)
3.getCause可能返回一个非SQLException的Exception

定位SQLExceptions的代码

在执行SQL的时候,可能会出现多个Exception,每个Exception都有它们自己的Cause。可以递归使用getNextException获取所有的Exception,每次获取Exception时候再递归调用getCause获取所有Cause Throwable。

try{//...
}catch(SQLException ex) {while(ex != null) {System.out.println("SQLState:" + ex.getSQLState());System.out.println("Error Code:" + ex.getErrorCode());System.out.println("Message:" + ex.getMessage());Throwable t = ex.getCause();while(t != null) {System.out.println("Cause:" + t);t = t.getCause();}ex = ex.getNextException();}
}

使用ForEach直接获取所有Cause Throwable

try{//...
}catch(SQLException ex) {for(Throwable e : ex ) {System.out.println("Error encountered: " + e);}
}

2.SQLWarning

SQLWarning是SQLException的子类,下面这些接口的实现类的getWarnings方法会生成SQLWarning
■ Connection
■ DataSet
■ Statement
■ ResultSet
如果出现多个SQLWarning,他们会被串联到第一个SQLWarning上,通过getNextWarning方法递归地获取所有SQLWarning

3.DataTruncation数据截断

DataTruncation是SQLWarning的子类,当数据库中的数据被截断时,会生成此对象。比如:
数据库中student表的name是varchar(5),当我保存超过五个字符。

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC","root","123456");Statement statement = connection.createStatement();
int rows = statement.executeUpdate("INSERT INTO student(name,age) VALUES ('TooLongName',19)");

会抛出如下异常:

try{Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC","root","123456");Statement statement = connection.createStatement();int rows = statement.executeUpdate("INSERT INTO student(name,age) VALUES ('TooLongName',19)");statement.close();connection.close();}catch (DataTruncation e){System.out.println(e.getSQLState());//22001为写入,01004为读取System.out.println(e.getMessage());System.out.println(e.getParameter());//...其他方法
}

5.BatchUpdateException

批量更新(BatchUpdate)产生的异常。

6.分类的异常Categorized SQLExceptions

这些异常可以和特定的 SQLStates相关:
■ SQLNonTransientException
■ SQLTransientException
■ SQLRecoverableException

NonTransient SQLExceptions

通常是由代码错误引起的,重试后任然会执行失败。异常出现时,Connection仍然有效。
包含SQLFeatureNotSupportedException,SQLNonTransientConnectionException,SQLDataException,SQLIntegrityConstraintViolationException,SQLInvalidAuthorizationException,SQLSyntaxErrorException等

SQLTransientException

通常不是由代码错误引起的,重新执行后可能会成功。异常出现时,Connection仍然有效。
包括SQLTransientConnectionException,SQLTransactionRollbackException,SQLTimeoutException等。

SQLRecoverableException

需要关闭Connection,重新建立。异常出现时,Connection不再有效。

7.SQLClientinfoException

该异常由Connection.setClientInfo引发。

这篇关于【JDBC4.2】JDBC中的Exception的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019279

相关文章

Java Exception异常类的继承体系详解

《JavaException异常类的继承体系详解》Java中的异常处理机制分为异常(Exception)和错误(Error)两大类,异常分为编译时异常(CheckedException)和运行时异常... 目录1. 异常类的继承体系2. Error错误3. Exception异常3.1 编译时异常: Che

Java Exception与RuntimeException使用及说明

《JavaException与RuntimeException使用及说明》:本文主要介绍JavaException与RuntimeException使用及说明,具有很好的参考价值,希望对大家有所... 目录简介ExceptionRuntimeException自定义异常选择继承Exception(受检异常)

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

关于Mybatis和JDBC的使用及区别

《关于Mybatis和JDBC的使用及区别》:本文主要介绍关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、JDBC1.1、流程1.2、优缺点2、MyBATis2.1、执行流程2.2、使用2.3、实现方式1、XML配置文件

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

jdbc连接数据库使用sid和service_name的区别 ?

问题描述: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was: 10.12.162.84:1521:xxxx  oracle数据的tnsnames.ora中配置的是:SERVICE

Java项目中,配置打印 JDBC 日志的几种方法

在 IDEA 项目中,如果你想打印 JDBC 日志,可以通过配置日志框架(如 Logback 或 Log4j)来实现。Spring Boot 使用的默认日志框架是 Logback,你可以通过在 application.yml 文件中配置日志级别来打印 JDBC 日志。 方法 1: 使用 application.yml 配置 JDBC 日志 logging:level:# 显示 SQL 语句co