Bạn có thể đóng tài nguyên tự động bằng câu lệnh try-with-resources trong JDBC (và I/O tổng quát).
Cú pháp
try(Declaration of resource){
body.....
} catch (SQLException e) {
e.printStackTrace();
}
Đây là câu lệnh try với một hoặc nhiều tài nguyên khai báo ngay tại try. Resource là đối tượng cần đóng khi không còn sử dụng. Bạn có thể khai báo nhiều tài nguyên, tất cả sẽ được đóng tự động khi khối try kết thúc.
Các đối tượng/tài nguyên khai báo phải implement interface java.lang.AutoCloseable hoặc java.io.Closeable, hoặc kế thừa lớp java.lang.AutoCloseable.
Trong JDBC, có thể dùng: java.sql.CallableStatement, Connection, PreparedStatement, Statement, ResultSet, RowSet trong try-with-resources.
Ví dụ hoàn chỉnh (JDBC MySQL)
1. Tạo bảng MyPlayers:
CREATE TABLE MyPlayers(
ID INT,
First_Name VARCHAR(255),
Last_Name VARCHAR(255),
Date_Of_Birth date,
Place_Of_Birth VARCHAR(255),
Country VARCHAR(255),
PRIMARY KEY (ID)
);
2. Chèn 7 bản ghi:
insert into MyPlayers values(1, 'Shikhar', 'Dhawan', DATE('1981-12-05'), 'Delhi', 'India');
insert into MyPlayers values(2, 'Jonathan', 'Trott', DATE('1981-04-22'), 'CapeTown', 'SouthAfrica');
insert into MyPlayers values(3, 'Kumara', 'Sangakkara', DATE('1977-10-27'), 'Matale', 'Srilanka');
insert into MyPlayers values(4, 'Virat', 'Kohli', DATE('1988-11-05'), 'Delhi', 'India');
insert into MyPlayers values(5, 'Rohit', 'Sharma', DATE('1987-04-30'), 'Nagpur', 'India');
insert into MyPlayers values(6, 'Ravindra', 'Jadeja', DATE('1988-12-06'), 'Nagpur', 'India');
insert into MyPlayers values(7, 'James', 'Anderson', DATE('1982-06-30'), 'Burnley', 'England');
3. Chương trình JDBC dùng try-with-resources:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TryWithResources_Example {
public static void main(String args[]) {
String mysqlUrl = "jdbc:mysql://localhost/mydatabase";
System.out.println("Connection established......");
try(Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
Statement stmt = con.createStatement(); ) {
try(ResultSet rs = stmt.executeQuery("select * from MyPlayers");) {
while(rs.next()) {
System.out.print(rs.getInt("ID") + ", ");
System.out.print(rs.getString("First_Name") + ", ");
System.out.print(rs.getString("Last_Name") + ", ");
System.out.print(rs.getDate("Date_Of_Birth") + ", ");
System.out.print(rs.getString("Place_Of_Birth") + ", ");
System.out.print(rs.getString("Country"));
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Kết quả đầu ra
Connection established...... 1, Shikhar, Dhawan, 1981-12-05, Delhi, India 2, Jonathan, Trott, 1981-04-22, CapeTown, SouthAfrica 3, Kumara, Sangakkara, 1977-10-27, Matale, Srilanka 4, Virat, Kohli, 1988-11-05, Mumbai, India 5, Rohit, Sharma, 1987-04-30, Nagpur, India 6, Ravindra, Jadeja, 1988-12-06, Nagpur, India 7, James, Anderson, 1982-06-30, Burnely, England 8, Ryan, McLaren, 1983-02-09, Kumberly, null
Lợi ích: Không cần khối finally để đóng Connection, Statement, ResultSet thủ công. Code ngắn gọn, an toàn, tránh rò rỉ tài nguyên.