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. 将欢迎消息添加到PeopleSoft主页--登录事件

    以下是如何为PeopleSoft应用程序设置Signon事件消息. 导航到PeopleTools>实用程序>管理> SignOn事件消息 在此页面上,您将看到当前处于活动状态或过去处 ...

  2. maven 禁止连接外网仓库

    有些内网机器不能连外网的情况下,因为依赖的项目pom配置问题,mvn package时仍会尝试请求外网的repo(比如默认中央repo或oss). 此时配置 settings.xml 为自己内网rep ...

  3. Mybatis_4.DBUtil.java

    1.获取SqlSessionFactory /** * @author:滕鹏飞 * @version: 1.0 * @Created on: 2018-8-31 下午2:10:45 * 类说明:加载配 ...

  4. grafana--邮箱告警配置

    安装 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-6.0.2-1.x86_64.rpm yum l ...

  5. boa调试

    Cannot access memory at address 0x0 0x400fc7e0 in ?? () 0 0x4014f0dc in wcscasecmp_l () from /lib/li ...

  6. seed实验——Set-UID Program Vulnerability实验

    一.实验描述 Set-UID是Unix OS中的一个·非常重要的安全机制.当一个Set-UID程序运行的时候,它具有代码拥有者的权限.举个例子,如果代码的拥有者是root用户,那么不论任何用户运行该程 ...

  7. 使用abcpdf分页设置的问题

    如果需要在分页时不对模块进行截断,请为相应模块添加打印样式“page-break-inside: avoid” 如果需要在指定位置进行强制分页,请添加:“<div style="pag ...

  8. C语言常用的编程规范

    1排版 1-1相对独立的程序块之间.变量说明之后必须加空行. 示例:如下例子不符合规范. if (!valid_ni(ni)) { ... // program code } repssn_ind = ...

  9. C++通过GetAdapatersInfo获取网卡配置信息

    DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, //指向一个缓冲区,用来取得IP_ADAPTER_INFO结构列表 PULONG pOutB ...

  10. 给ASP.NET Core Web发布包做减法

    1.引言 紧接上篇:ASP.NET Core Web App应用第三方Bootstrap模板.这一节我们来讲讲如何优化ASP.NET Core Web发布包繁重的问题. 在ASP.NET Core W ...