SQL 异常简介

对于数据库的操作访问,必然也很可能抛出异常。
JDBC中定义了SQLException,用于描述数据库相关操作中可能出现的异常情况。
java.sql.SQLException 
 
异常本质没有什么特别的逻辑,通常借助于异常的名称传达异常的类型,通过携带的信息进行进一步分析
SQLException是SQL相关的异常的始祖,主要有以下扩展:
  • BatchUpdateException
  • RowSetWarning
  • SerialException
  • SQLClientInfoException
  • SQLNonTransientException
  • SQLRecoverableException
  • SQLTransientException
  • SQLWarning
  • SyncFactoryException
  • SyncProviderException
每个 SQLException 都可提供以下多种消息:
特定于每个供应商的整数错误代码。通常,这将是底层数据库返回的实际错误代码。
描述错误的字符串。此字符串用作 Java Exception 消息,可以通过方法 getMessage 获得(继承来的方法)。
"SQLstate" 字符串,该字符串遵守 XOPEN SQLstate 约定或 SQL:2003 约定。SQLState 字符串的值在适当的规范中描述。DatabaseMetaData 的方法 getSQLStateType 可用于确定驱动程序返回 XOPEN 类型还是 SQL:2003 类型。
到下一个 Exception 的链接。可以使用此链接提供其他错误信息。
因果关系,如果存在任何导致此 SQLException 的原因。 

方法列表如下:

int getErrorCode()
          获取此 SQLException 对象的特定于供应商的异常代码。
String getSQLState()
          获取此 SQLException 对象的 SQLState。
Iterator<Throwable> iterator()
          返回在链接的 SQLExceptions 上进行迭代的迭代器。
void setNextException(SQLException ex)
          将 SQLException 对象添加到链接的末尾。
SQLException getNextException()
          通过 setNextException(SQLException ex) 获取链接到此 SQLException 对象的异常。

异常处理

下面是第一个JDBC示例中的代码,没有很好地处理异常,直接throws Exception了
package jdbc.jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

/**

* 第一个JDBC

* @author noteless

*/

public class FirstJDBC {

public static void main(String[] args) throws Exception {

//1、注册驱动

Class.forName("com.mysql.jdbc.Driver");

//数据库连接所需参数

String user = "root";

String password = "123456";

String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";

//2、获取连接对象

Connection conn = DriverManager.getConnection(url, user, password);

//设置sql语句

String sql = "select * from student";

//3、获得sql语句执行对象

Statement stmt = conn.createStatement();

//4、执行sql并保存结果集

ResultSet rs = stmt.executeQuery(sql);

//5、处理结果集

while (rs.next()) {

System.out.print("id:" + rs.getInt(1));

System.out.print(",姓名:" + rs.getString(2));

System.out.print(",年龄:" + rs.getInt(3));

System.out.println(",性别:" + rs.getString(4));

}

//6、资源关闭

rs.close();

stmt.close();

conn.close();

}

}
对于可能抛出异常的代码,应该使用try包裹
不管如何,资源最终都应该被关闭,但是如果资源在打开前就出现异常,直接关闭可能会出现问题
而且在资源关闭过程中也可能出现异常
一个稍微规范一点的形式可能如下所示
package jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class FirstJDBCFormal {

public static void main(String[] args) throws Exception {

//1、注册驱动

Class.forName("com.mysql.jdbc.Driver");

//数据库连接所需参数

String user = "root";

String password = "123456";

String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

try {

//2、获取连接对象

conn = DriverManager.getConnection(url, user, password);

//3、设置sql语句

String sql = "select * from student";

//4、获得sql语句执行对象

stmt = conn.createStatement();

//5、执行并保存结果集

rs = stmt.executeQuery(sql);

//6、处理结果集

while (rs.next()) {

System.out.print("id:" + rs.getInt(1));

System.out.print(",姓名:" + rs.getString(2));

System.out.print(",年龄:" + rs.getInt(3));

System.out.println(",性别:" + rs.getString(4));

}

} catch (Exception e) {

throw new RuntimeException(e);

} finally {

//7、资源关闭

try {

if (conn != null) {

conn.close();

}

if (rs != null) {

rs.close();

}

if (stmt != null) {

stmt.close();

}
} catch (SQLException e) { }
}
}
}
最后一块的finally也可以处理成下面这种形式
if (conn != null) {

try{

conn.close();

}catch (SQLException e){

}

}

if (rs != null) {

try{

rs.close();

}catch (SQLException e){

}

}

if (stmt != null) {

try{

stmt.close();

}catch (SQLException e){

}

}
注意:
catch()后面都应该做些处理的,上面的示例中也省略了

总结

对于JDBC中的异常,我们重点在于要认识常见的异常,以及出现异常的原因,能够通过异常信息得到对问题有一个基本的定位
现在借助于各种框架工具,根本就不需要手动编写JDBC程序,更别说自己处理JDBC中的异常了
但是,借助于框架底层的一些异常仍旧是根源于JDBC,所以需要对JDBC中的异常有一个简单了解,以及如何使用
 
在执行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);

}

}
 
 
 

JDBC 异常简介 jDBC简介(六)的更多相关文章

  1. JDBC设计理念浅析 JDBC简介(一)

    概念 JDBC是J2EE的标准规范之一,J2EE就是为了规范JAVA解决企业级应用开发制定的一系列规范,JDBC也不例外. JDBC是用于Java编程语言和数据库之间的数据库无关连接的标准Java A ...

  2. JDBC驱动程序注册 JDBC简介(二)

    使用JDBC进行数据库操作的第一步就是驱动注册(当然你得先导入JAR). 驱动注册有多种方式,第一步必然是获得正确的驱动名称与URL格式 驱动名称与URL格式 RDBMS 驱动程序名称        ...

  3. DriverManager 驱动管理器类简介 JDBC简介(三)

    驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...

  4. Data Source与数据库连接池简介 JDBC简介(八)

    DataSource是作为DriverManager的替代品而推出的,DataSource 对象是获取连接的首选方法. 起源 为何放弃DriverManager DriverManager负责管理驱动 ...

  5. JDBC 异常特殊原因 (数据库只读解决办法)

    JDBC 异常特殊原因   有时候并不是因为程序写的有问题  ,是因为  数据库只读 在sqlserver2005中附加数据库时,附加的数据库会变成只读的,只能进行查询操作. 解决方法: 1 打开Sq ...

  6. JDBC异常之数据库表不存在

    JDBC异常之数据库表不存在 1.具体错误如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table 'YHD.t_yhd_ ...

  7. maven(多个模块)项目 部署 开发环境 问题处理历程【异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE】

    maven(多个模块)项目 部署 开发环境 问题处理历程[异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE] 201 ...

  8. Spring之 JDBC 异常

    JDBC异常抽象 Spring会将数据操作的异常转换为DataAccessException 解析错误码 SQLErrorCodeSQLExceptionTranslator ErrorCode定义 ...

  9. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

随机推荐

  1. 学习笔记-----《Pattern Recognition and Machine Learning》Christopher M. Bishop

    Preface 模式识别这个词,以前一直不懂是什么意思,直到今年初,才开始打算读这本广为推荐的书,初步了解到,它的大致意思是从数据中发现特征,规律,属于机器学习的一个分支. 在前言中,阐述了什么是模式 ...

  2. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  3. GeoHash(Java实现)

    package com.koubei.collect_script.demo; import java.util.ArrayList; import java.util.Arrays; import ...

  4. java课程之团队开发冲刺阶段1.4

    一.总结昨天进度 1.昨天任务全部完成 二.遇到的问题 1.对数据库的使用陌生 2.使用sqlite有些困难 3.对如何解决查询课程问题暂时没有找到好的解决方案 三.今日任务 1.由于周一的课程比较紧 ...

  5. composer 实现自动加载原理

    简介 一般在框架中都会用到composer工具,用它来管理依赖.其中composer有类的自动加载机制,可以加载composer下载的库中的所有的类文件.那么composer的自动加载机制是怎么实现的 ...

  6. Android Studio 设置不同分辨率的图标Icon

    右键你的项目 -->"NEW"-->"Image Asset" 'Asset Type' 勾选”Image“才可以选择”Path“,其他选项可以自己 ...

  7. Bugly 多渠道热更新解决方案

    作者:巫文杰 Gradle使用productFlavors打渠道包的痛 有很多同学可能会采用配置productFlavors来打渠道包,主要是它是原生支持,方便开发者输出不同定制版本的apk,举个例子 ...

  8. Redis缓存实现排序功能

    如果对实时并发排序感兴趣,请关注这个项目(java):https://github.com/xuerong/hqrank,欢迎参与开发,pass:支持多字段排行 最近遇到一个问题就是根据需求需要对所有 ...

  9. 使用RSA加密在Python中逆向shell

    i春秋翻译小组-Neo(李皓伟) 使用RSA加密在Python中逆向shell 这是一个关于使用RSA加密编程逆向shell的python教程. 我想提一下,这篇文章更多的是关于理解shell中涉及的 ...

  10. Redis基础入门,Redis的优点也特点,Redis五种数据类型

    Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. 1.Redis的主要特点 Redis有三个主要特点,使它优越于其它键值数据存储系统 - Redis将 ...