Tiếp theo, chúngta cùng tìm hiểu về giao diện Statement trong JDBC. Giao diện này cung cấp nhiều phương thức để thực thicác truy vấn vớicơ sở dữ liệu và trả về kết quà mà nó tạo ra. Theo mặc định, tại cùng một thời điểm chỉ có một đối tượng ResultSet có thể được mở cho mỗi đốitượng Statement. Vì thế, nếu hoạtđộng đọc một đối tượng ResultSet bị chen ngang bời hoạt động đọc đối tượng khác thì đối tượng khác này phải đượctạo bởi đốitượng Statementkhác.
7.9.1. Tạo đối tượng statement
Đe tạo đối tượng Statement, bạn sử dụng phương thức createStatementO của đối tượng Connection, như sau:
Statement stmt = null;
try{
stmt = conn.createStatementQ;
}
catch (SQLException e) { }
finally { }
Sau khi đã tạo đối tượng Statement, bạn có thể sử dụng rất nhiều phương thức của đối tượng này để thực thi một lệnh SQL. Dưới đây là một số phương thức được sử dụng phổ biếncủaStatement giao diện.
- public ResultSet executeQuery(String sql):
Thực thimột lệnh SQL đã cho và trả về một đối tượng Resultset đơn. Tham số sql là một lệnh SQL. Phương thức này không thể được gọi trên một đối tượng PreparedStatement hoặc CallableStatement.
- public int executeUpdate(String sql):
Thực thi lệnh SQL đã cho, có thể là INSERT, UPDATE, DELETE hoặc một lệnh SQL mà không trả về bất kỳ cái gì như lệnh SQL DDL. Phương thức nàykhông thể được gọitrên một đối tượng PreparedStatement hoặc CallableStatement.
- public boolean execute(String sql):
Thực thi lệnh SQL đã cho mà có thể trả về nhiều kết quả. Thường thì bạn có thể bò qua phương thức này, trừkhi bạn đang thực thi một store procedure mà bạn biết rằng nó sẽ trả về nhiều kết quả hoặc bạn đang thực thi một chuỗi SQL mà bạn chưa biết. Phương thức này không thể được gọi trên một đốitượngPreparedStatementhoặc CallableStatement.
- public int[] executeBatch():
Được sử dụng để thực thi một nhóm các lệnh và nếu thành công thì trả về một mảng.
Các phần tử trong mảng trả về được sắp xếp theo thứ tự tương ứng với lệnh trong batch.
Cácphần tử trongmảng được trả về này có thế là:
+ Một số lớn hơn hoặc bằng 0, chỉ rằng lệnh được thực thi thành công và đó là số hàng bị tác động trongcơsở dữ liệu.
+ Một giá trị SUCCESS NO INFOchỉ rằng lệnh được thực thi thành công nhưng số hàng bị tác động làchưa biết.
+ Một giá trịEXECUTE-FAILED chỉ rằng lệnh đã thất bại.
-void close() throws SQLException:
Đóng đối tượng Statement và giải phóng resource ngay lập tức. Khi đã đóng đối tượng Statement rồi, thì các lời gọi phương thức nào tới đối tượngđó sẽ không hoạt động.
Khi một đốitượng Statement đã bị đóng thìđối tượng ResultSet củanó cũng bị đóng.
7.9.2. Đóng đối tượng statement
Lý do tương tự như khi bạn đóng đối tượng Connection để giải phóng tài nguyên, thì ở đây sau khi đã thực hiện xong các hoạt động với giao diện Statement thỉ bạn nên đóng đối tượng Statementlại. Việc này được thực hiện đơngiảnbởi phương thức close() ở trên.
Điều tất nhiên là nếu bạn đã đóng đối tượng Connection thì đối tượng Statement cũng sẽ bị đóng (theo ngầm định). Tuy nhiên, việc đóng tường minh đối tượng Statement là
một bước thực hành tốt đế đảm bảo chắc chắn rằng đối tượng đã được đóng và resource đượcgiải phóng.
Dưới đây là mẫu chung:
Statement stmt = null;
try{
stmt = conn.createStatementQ;
}
catch (SQLException e) { }
finally { stmtcloseQ;
}
7.9.3. Ví dụ minh họa đối tượng statement trong JDBC
Chưong trình 7.4 minh họa cách sử dụng giao diện Statement trong JDBC với cơ sở dữ liệu MySQL.
Chương trình 7.4
//Buoc 1: Ban can import cacgoi can thiet import java.sql.*;
public classJDBCStatement{
// Ten cua driver vadia chi URL cuaco so du lieu
static final StringJDBC-DRIVER= "com.mysql.jdbc.Driver";
static final String DB-URL = "jdbc:mysql://localhost/sinhvien";
// Ten nguoi dung va matkhau cua co so du lieu static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// Buoc 2: Dang ky Driver
Class. forName("com.mysql.jdbc.Driver");
// Buoc 3: Mo mot ket noi
System.out.printlnf'Dang ket noi toi co so du lieu...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// Buoc 4: Thue thitruy van
System.out.printlnf'Tao cac lenh truy van SQL...");
stmt = conn.createStatementf);
String sql = "UPDATE sinhvienkóO SET diemthi=10 WHERE mssv=3";
// Chung takiem tra xem no co tra vemottrue ResultSet hay khong Booleanret= stmtexecute(sql);
System.out.println("\nGia tri tra ve la:" +ret.toStringO);
11Chung ta cap nhat diem thi cua ban ghi co mssv = 3;
int rows = stmt.executeUpdate(sql);
System.out.println("So hang bi tacdong:" + rows);
11 Lua chon tat ca ban ghiva hien thi.
sql = "SELECT mssv, ho, ten, diemthi FROM sinhvienkóO";
ResultSetrs - stmt.executeQuery(sql);
11Buoc 5: Lay du lieu tu Result Set while(rs.next()){
// Lay du lieu boi su dung ten cot int mssv = rs.getlntf'mssv");
int diemthi = rs.getlntf'diemthi");
String ho = rs.getStringf'ho");
String ten = rs.getStringf'ten");
11 Hien thi cac gia tri
System.out.print("\nMSSV:" + mssv);
System.out.print("\nHo:" +ho);
System.out.println("\nTen:" + ten);
System.out.print("\nDiem Thi:" + diemthi);
System.out.print("\n=================");
}
// Buoc 6: Don sach moi truong va giaiphongresource rs.closeQ;
stmt.closeQ;
conn.closeQ;
} catchfSQLException se) { // Xu ly cac loi cho JDBC se.printStackTracef);
} catch(Exception e) {
// Xu ly cac loi cho Class.forName e.printStackTraceQ;
} finally {
// Khoi finally duoc sudung de dong cacresource try{
if (stmt!=null) stmtcloseQ;
} catchfSQLException se2){) try{
if (conn!=null) conn.closeQ;
} catch(SQLException se) {
se.printStackTraceQ;
}// Ketthuckhoi finally }// Ket thuckhoi try }// Ketthucmain }// KetthucJDBCStatement