这篇文章演示了如何使用 try-with-resources,顺序关闭JDBC数据库资源- 结果集, 语句和 连接。
try-with-resources是一种新的异常处理机制,使得它更容易被一个try-catch块内使用正确关闭资源。从Java 7开始提供。
Java 7之前的示例
如果使用旧版应用程序,则经常会遇到这种异常处理方式:
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
public class MySqlJdbcSample {
public static void main(String... a) {
Connection connection = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/turretadb", "root", "password");
stmt = connection.createStatement();
rs = stmt.executeQuery("SELECT LASTNAME, FIRSTNAME, MIDDLENAME FROM PERSON");
while(rs.next()) {
System.out.println("LASTNAME: " + rs.getString("LASTNAME"));
System.out.println("MIDDLENAME: " + rs.getString("MIDDLENAME"));
System.out.println("FIRSTNAME: " + rs.getString("FIRSTNAME"));
System.out.println("================================================");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
使用 try - with - resources语句
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
// Requires Java 7+
public class MySqlJdbcSample throws ClassNotFoundException{
public static void main(String... a) {
Class.forName("com.mysql.jdbc.Driver");
try (
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/turretadb", "root", "password");
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT LASTNAME, FIRSTNAME, MIDDLENAME FROM PERSON")
) {
while(rs.next()) {
System.out.println("LASTNAME: " + rs.getString("LASTNAME"));
System.out.println("MIDDLENAME: " + rs.getString("MIDDLENAME"));
System.out.println("FIRSTNAME: " + rs.getString("FIRSTNAME"));
System.out.println("================================================");
}
}
}
}
这些代码之所以有效,是因为 try - with - resources语句以打开它们的相反顺序关闭了资源。