【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(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

基于shard-jdbc中间件,实现数据分库分表

一、水平分割 1、水平分库 1)、概念: 以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中。 2)、结果 每个库的结构都一样;数据都不一样; 所有库的并集是全量数据; 2、水平分表 1)、概念 以字段为依据,按照一定策略,将一个表中的数据拆分到多个表中。 2)、结果 每个表的结构都一样;数据都不一样; 所有表的并集是全量数据; 二、Shard-jdbc 中间件 1、架构图 2、特点

基于Shard-Jdbc分库分表,数据库扩容方案

一、数据库扩容 1、业务场景 互联网项目中有很多“数据量大,业务复杂度高,需要分库分表”的业务场景。 这样分层的架构 (1)上层是业务层biz,实现业务逻辑封装; (2)中间是服务层service,封装数据访问; (3)下层是数据层db,存储业务数据; 2、扩容场景和问题 当数据量持续新增,面临着这样一些需求,两台数据库无法容纳,需要数据库扩容,这里选择2台—扩容到3台的模式,如下图

Java笔试面试题AI答之JDBC(3)

文章目录 13. 编写JDBC连Oracle的程序?14. 简述JDBC的主要组件有哪些 ?15. JDBC中如何防止SQL注入攻击?1. 使用预处理语句(PreparedStatement)2. 避免在SQL查询中直接拼接用户输入的数据总结 16. JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?脏读(Dirty Read)哪种数据库隔离级别能防止脏读? 17. 简述JDBC ex

myEclipse失去焦点时报错Unhandled event loop exception的解决方案

一句话:百度杀毒惹的祸。。。。果断卸载后问题解决。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArra

这个错误说的是一个不可变数组负值给了一个可变的数组。有可能你前面定义的数组是一个可变数组,但是在你其他方法里面用他的时候,他就是一个不可变数组,因为在可变数组拿到别的地方用的时候,他会默认为不可变的,可能这只是一个类里面你只是简单的声明了他吧,并没有进行对他初始化,或者分配什么内存,所以他只是一个不可变的数组,当你在其他地方用他的时候,他就默认为不可变的数组,他可能因为你的没分配内存,而变回不可变

Exception in plugin Android ButterKnife zelezny

所在页面的布局文件命名id有问题,不能有两个下划线,,如tv__name