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.

Quảng cáo

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.

Quảng cáo

Đó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.vietjack.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
   System.out.println("\nVietJack chuc cac ban hoc tot!");
}// 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:

Statement trong JDBC

Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.

Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:

Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập doanh nghiệp với Java. Khóa học có giá chỉ 400K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.

Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu cầu mua, inbox trực tiếp chị Thu, trợ lý anh Tuyền để hỗ trợ thanh toán qua mã QR ngân hàng Việt Nam, fb: https://www.facebook.com/Thule.59

Anh Tuyền, tác giả khóa học, là cựu sinh viên chương trình đào tạo kĩ sư tài năng của đại học Bách Khoa Hà Nội với hơn 5 năm kinh nghiệm đi làm thực tế doanh nghiệp và cũng là Founder website vietjack.com, web giáo dục phổ biến nhất Việt Nam hiện tại (năm 2024). Java cũng là ngôn ngữ lập trình dễ đi xin việc nhất hiện tại, với mức lương cao, hãy nâng cao kiến thức IT của bản thân mình vì một Việt Nam giàu mạnh.

Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của: Tutorialspoint.com



Demo một bài giảng trong khóa học online tại vietjackteam.


Tài liệu giáo viên