Statement Interface trong JDBC

Tiếp theo chúng ta cùng tìm hiểu về Statement Interface trong JDBC. Interface này cung cấp nhiều phương thức để thực thi các truy vấn với cơ 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 đối tượ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 được tạo bởi đối tượng Statement khác.

Tạo đối tượng Statement

Để tạo đối tượng Statement, bạn sử dụng phương thức createStatement() của đối tượng Connection, như sau:

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
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ến của Statement Interface.

1. public ResultSet executeQuery(String sql)

Thực thi mộ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.

2. 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ày không thể được gọi trên một đối tượng PreparedStatement hoặc CallableStatement.

3. 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 đối tượng PreparedStatement hoặc CallableStatement.

4. 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ác phần tử trong mảng được trả về này có thể là:

  • Một số >= 0, chỉ rằng lệnh được thực thi thành công và đó là số hàng bị tác động trong cơ sở dữ liệu.
  • Một giá trị SUCCESS_NO_INFO chỉ 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.

5. 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 đối tượng Statement đã bị đóng thì đối tượng ResultSet của nó cũng bị đóng.

Đóng đối tượng Statement

Lý do tương tự như khi bạn đóng đối tượng Connection để giải phóng resource, thì ở đây sau khi đã thực hiện xong các hoạt động với Statement Interface thì bạn nên đóng đối tượng Statement lại.

Việc này được thực hiện đơn giản bở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 được giải phóng.

Dưới đây là mẫu chung

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

Ví dụ minh họa đối tượng Statement trong JDBC

package com.hoctv.jdbc;


//Buoc 1: Ban can inport cac package can thiet
import java.sql.*;


public class ViDuJDBC {
   // Ten cua driver va dia chi URL cua co so du lieu
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/sinhvien";


   //  Ten nguoi dung va mat khau 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.println("Dang ket noi toi co so du lieu ...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);


      // Buoc 4: Thuc thi truy van
      System.out.println("Tao cac lenh truy van SQL ...");
      stmt = conn.createStatement();
      String sql = "UPDATE sinhvienk60 SET diemthi=10 WHERE mssv=3";


      // Chung ta kiem tra xem no co tra ve mot true Result Set hay khong
      Boolean ret = stmt.execute(sql);
      System.out.println("\nGia tri tra ve la : " + ret.toString() );


      // Chung ta cap nhat diem thi cua ban ghi co mssv = 3;
      int rows = stmt.executeUpdate(sql);
      System.out.println("So hang bi tac dong : " + rows );


      // Lua chon tat ca ban ghi va hien thi.
      sql = "SELECT mssv, ho, ten, diemthi FROM sinhvienk60";
      ResultSet rs = stmt.executeQuery(sql);


      // Buoc 5: Lay du lieu tu Result Set
      while(rs.next()){
         // Lay du lieu boi su dung ten cot
         int mssv  = rs.getInt("mssv");
         int diemthi = rs.getInt("diemthi");
         String ho = rs.getString("ho");
         String ten = rs.getString("ten");


         // 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 giai phong resource
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      // Xu ly cac loi cho JDBC
      se.printStackTrace();
   }catch(Exception e){
      // Xu ly cac loi cho Class.forName
      e.printStackTrace();
   }finally{
      // Khoi finally duoc su dung de dong cac resource
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      } 
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }// Ket thuc khoi finally
   }// Ket thuc khoi try
}// Ket thuc main
}// Ket thuc ViDuJDBC

Sao chép và dán ví dụ trên trong ViDuJDBC.java, sau đó biên dịch và chạy chương trình Java trên sẽ cho kết quả sau:

Bình luận