在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的。在程序创建连接之后,如果不进行关闭,会消耗更多的资源。创建连接之后的代码挂掉了,后面的try/catch很难保证代码被执行。所以,这篇Java JDBC的基础知识(二)主要记录标准的异常处理。
一、要处理的代码如下
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class Test2 {
public static final String DRIVER = "com.mysql.jdbc.Driver"; public static void main(String[] args) throws SQLException {
try {
System.out.println(Class.forName(DRIVER));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/t_employee", "root", "root");
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("select*from t_employee");
while (rs.next()) {
System.out.print(rs.getInt("id") + "\t");
System.out.print(rs.getString("name") + "\t");
System.out.print(rs.getInt("age") + "\t");
System.out.println(rs.getInt("salary"));
}
try {
rs.close();
stm.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、利用finally关闭资源
利用finally关闭资源的好处就是,不管将来程序挂不挂,都会关闭资源。另外,只有finally处理异常依然显得不够严谨,因为rs、stm、conn有可能为null,当他们为null时,再去执行.close()就会出现空指针异常。要引入if对rs、stm、conn进行判断。具体代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class Test2 {
public static final String DRIVER = "com.mysql.jdbc.Driver"; public static void main(String[] args) throws SQLException { try {
System.out.println(Class.forName(DRIVER));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} Connection conn = null;
Statement stm = null;
ResultSet rs = null; try {
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/t_employee", "root", "root");
stm = conn.createStatement();
rs = stm.executeQuery("select*from t_employee");
while (rs.next()) {
System.out.print(rs.getInt("id") + "\t");
System.out.print(rs.getString("name") + "\t");
System.out.print(rs.getInt("age") + "\t");
System.out.println(rs.getInt("salary"));
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
// finally里面的每個.close()都要分別try/catch,另外进行null判断
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (stm != null) {
try {
stm.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
可见,上面的代码相当臃肿,如果每次写都要这样操作,整套代码就会很罗嗦,解决办法就是将他们封装起来。
之后会继续做相关学习介绍。
Java JDBC的基础知识(二)的更多相关文章
-
Java JDBC的基础知识(三)
在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...
-
Java JDBC的基础知识(五)
本文主要记录JDBC基础知识之后的部分内容.另外,我看到<Java核心基础2>中第四章是主要介绍数据库编程的.里面有一些说明和应用特别灵活,有些部分也太容易理解,建议大家看一下.这篇是依然 ...
-
Java JDBC的基础知识(一)
一.为什么引入JDBC 在学习JDBC之前,抛开它的概念,我先按照我的理解解释一下,为什么要引入JDBC.在我看来,引入JDBC跟我之前学过的引入JVM(Java虚拟机)有些相似之处.当然,关于JVM ...
-
java接口自动化基础知识(二)
二.HttpClient+testNG实现对接口的测试及校验 在上面第一篇中已经实现了基础配置和测试用例数据准备,本篇文章将以登录举例进行测试执行. 这是之前login接口的代码 @Test(grou ...
-
Java JDBC的基础知识(四)
之前学习了如何创建一个数据库工具类,如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...
-
java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
-
Java面试题-基础知识
参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...
-
JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)
一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...
-
JAVA核心技术I---JAVA基础知识(static关键字)
一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...
随机推荐
-
php strtotime 在32位操作系统下的限制
php strtotime 在32位操作系统下的限制 <?php class DateHelper{ /** * 在32位操作系统下,超过 2038-01-19 03:14:07 ,会溢出 * ...
-
Mutex
#include "stdafx.h" #include <string> #include <iostream> #include <Windows ...
-
[IR] Tolerant Retrieval &; Spelling Correction &; Language Model
Dictionary不一定是个list,它可以是多种形式. 放弃Hash的原因: 通常,tree是比较适合的结构. From: http://www.cnblogs.com/v-July-v/arch ...
-
PostgreSQL的prepare 和 execute 动作背后
我给PostgreSQL的源代码加入了调试信息以后,会有如下表现: 我执行Prepare: postgres=# prepare s(; PREPARE postgres=# 背后的反应: ** In ...
-
DVWA 黑客攻防演练(四)文件包含 File Inclusion
文件包含(file Inclusion)是一种很常见的攻击方式,主要是通过修改请求中变量从而访问了用户不应该访问的文件.还可以通过这个漏洞加载不属于本网站的文件等.下面一起来看看 DVWA 中的文件包 ...
-
浅谈JS中String()与 .toString()的区别
我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的 1..toString()可以将所有的的数据都转换为字符串,但 ...
-
vscode 缩进改为2空格
因为vscode默认启用了"editor.detectIndentation": true”根据文件类型自动设置tabsize的选项. 在配置中加上 "editor.de ...
-
Python问题汇总
1.dict is not callable tree是一个字典类型. tree("left") -> tree["left"] 2.list ind ...
-
WCF揭秘学习笔记(1):基础知识
最近找工作,面试时经常被问懂不懂WCF.不少招聘高级.NET工程师的要求上都 写着有WCF开发经验的优先考虑.我对于WCF仅仅是通过看一些教学视频这种山寨学习法了解一些.现在要下决心好好学习一下WCF ...
-
linux gcc 区分32位或64位编译 &;&; 请问arm存储,是以小端格式还是以大端格式?
linux gcc 区分32位或64位编译 Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_ ...