JDBC Statement trong java (Bài 4)

JDBC Statement trong java (Bài 4)

jdbc statement trong java
Lập trình cơ sở dữ liệu

JDBC Statement trong java (Bài 4)

Thông qua bài JDBC Statement trong java chúng tôi sẽ hướng dẫn các bạn cách thực thi các câu lệnh sql từ java. Cụ thể, khi một kết nối được thiết lập, chúng ta có thể tương tác với cơ sở dữ liệu.

JDBC Statement, PreparedStatement và CallableStatement định nghĩa những phương thức và thuộc tính, cho phép chúng ta thực thi câu lệnh SQL và nhận dữ liệu từ cơ sở dữ liệu của bạn.

Bảng sau đây mô tả tóm tắt về Statement, PreparedStatement và CallableStatement

JDBC StatementsMục đích sử dụng
StatementHữu ích khi bạn đang sử dụng câu lệnh SQL tĩnh khi chạy. Statement không chấp nhận tham số (parameters).
PreparedStatementPreparedStatement cho phép chỉ định tham số đầu vào khi chạy.
CallableStatementSử dụng khi bạn muốn truy cập stored procedures. CallableStatement cũng chấp nhận tham số đầu vào khi chạy.

JDBC Statement trong java – Đối tượng Statement (Statement Objects)

Tạo đối tượng Statement

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

Thực thi câu lệnh SQL (Execute an SQL statement)

  • boolean execute (String SQL): Trả về giá trị true nếu thực thi thành công câu lệnh SQL; ngược lại sẽ trả về giá trị false. Sử dụng phương thức này để thực thi các câu lệnh SQL DDL như tạo cơ sở dữ liệu, tạo bảng, …
  • int executeUpdate (String SQL): Trả về số dòng bị tác động khi thực thi các câu lệnh như INSERT, UPDATE hoặc DELETE.
  • ResultSet executeQuery (String SQL): Trả về một đối tượng ResultSet khi bạn thực thi câu lệnh SELECT.

Đóng đối tượng Statement (Closing Statement Object)

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

JDBC Statement trong java – Ví dụ chương trình Java kết nối đến máy chủ localhost, thực hiện truy cập vào cơ sở dữ liệu tên EMPDB sử dụng tài khoản sa, mật khẩu sa. Ứng dụng thực hiện thêm mới (thực thi câu lệnh insert) một nhân viên vào bảng Employee và thực hiện xem dữ liệu (thực thi câu lệnh select) của bảng này.

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 *
 * @author giasutinhoc.vn
 */
public class JDBCStatementExample {
 // SQL Server JDBC connection string
 static final String DB_URL = "jdbc:sqlserver://localhost;databaseName=EMPDB;user=sa;password=sa";
 public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try {
     //Open a connection
     System.out.println("Connecting to database...");
     conn = DriverManager.getConnection(DB_URL);
     //Execute a query
     System.out.println("Creating statement...");
     stmt = conn.createStatement();
     String sql = "INSERT INTO Employees VALUES (100, 18, N'gia sư', N'tin học');";
     int rows = stmt.executeUpdate(sql);
     System.out.println("Rows impacted : " + rows);
     // Let us select all the records and display them.
     sql = "SELECT id, first, last, age FROM Employees";
     ResultSet rs = stmt.executeQuery(sql);
     //Extract data from result set
     while (rs.next()) {
       //Retrieve by column name
       int id = rs.getInt("id");
       int age = rs.getInt("age");
       String first = rs.getString("first");
       String last = rs.getString("last");
       //Display values
       System.out.print("ID: " + id);
       System.out.print(", Age: " + age);
       System.out.print(", First: " + first);
       System.out.println(", Last: " + last);
     }
     //Clean-up environment
     rs.close();
     stmt.close();
     conn.close();
   } catch (SQLException se) {
     //Handle errors for JDBC
     se.printStackTrace();
   } finally {
     //finally block used to close resources
     try {
       if (stmt != null) {
         stmt.close();
       }
     } catch (SQLException se2) {
     }// nothing we can do
     try {
       if (conn != null) {
         conn.close();
       }
     } catch (SQLException se) {
         se.printStackTrace();
     }//end finally try
    }//end try
   System.out.println("Done!");
 }
}

JDBC Statement trong java – Đối tượng PreparedStatement (PreparedStatement Objects)

Tạo đối tượng PreparedStatement

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Tất cả các tham số được đại diện bởi ?, bạn phải cung cấp giá trị cho tất cả các tham số số trước khi thực hiện các câu lệnh SQL bằng cách sử dụng phương thức setXXX() với XXX đại diện cho kiểu dữ liệu. Và mỗi tham số được đánh dấu bằng số thứ tự; tha số đầu tiên có vị trí là 1, tham số kế tiếp có vị trí là 2, …

Đóng đối tượng PreparedStatement

pstmt.close();

Ví dụ

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 *
 * @author giasutinhoc.vn
 */
public class JDBCPreparedStatementExample {
 // SQL Server JDBC connection string
 static final String DB_URL = "jdbc:sqlserver://localhost;databaseName=EMPDB;user=sa;password=sa";
 public static void main(String[] args) {
 Connection conn = null;
 PreparedStatement stmt = null;
 try {
   //Open a connection
   System.out.println("Connecting to database...");
   conn = DriverManager.getConnection(DB_URL);
   //Execute a query
   System.out.println("Creating statement...");
   String sql = "UPDATE Employees set age=? WHERE id=?";
   stmt = conn.prepareStatement(sql);
   //Bind values into the parameters.
   stmt.setInt(1, 35); // This would set age
   stmt.setInt(2, 100); // This would set ID
   // Let us update age of the record with ID = 100;
   int rows = stmt.executeUpdate();
   System.out.println("Rows impacted : " + rows);
   // Let us select all the records and display them.
   sql = "SELECT id, first, last, age FROM Employees";
   stmt = conn.prepareStatement(sql);
   ResultSet rs = stmt.executeQuery();
   //Extract data from result set
   while (rs.next()) {
     //Retrieve by column name
     int id = rs.getInt("id");
     int age = rs.getInt("age");
     String first = rs.getString("first");
     String last = rs.getString("last");
     //Display values
     System.out.print("ID: " + id);
     System.out.print(", Age: " + age);
     System.out.print(", First: " + first);
     System.out.println(", Last: " + last);
   }
  //Clean-up environment
  rs.close();
  stmt.close();
  conn.close();
 } catch (SQLException se) {
   //Handle errors for JDBC
   se.printStackTrace();
 } finally {
   //finally block used to close resources
   try {
     if (stmt != null) {
      stmt.close();
     }
   } catch (SQLException se2) {
     se2.printStackTrace();
   }// nothing we can do
   try {
    if (conn != null) {
     conn.close();
    }
   } catch (SQLException se) {
     se.printStackTrace();
   }//end finally try
  }//end try
  System.out.println("Done!");
 }
}

JDBC Statement trong java – Đối tượng CallableStatement (CallableStatement Objects)

Tạo đối tượng CallableStatement (Creating CallableStatement Object)

CallableStatement cstmt = null;
try {
   String SQL = "{call ProcedureName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Đóng đối tượng CallableStatement (Closing CallableStatement Object)

cstmt.close();

Ví dụ

Tạo thủ tục getEmpName trong EMPDB sử dụng Microsoft SQL Server Management Studio

GO
USE EMPDB
GO
CREATE PROCEDURE getEmpName
 @EMP_ID INT, @EMP_FIRST NVARCHAR(255) OUTPUT
AS
BEGIN
 SELECT @EMP_FIRST = first
 FROM Employees
 WHERE ID = @EMP_ID
END

Tạo lớp JDBCCallableStatementExample và viết xử lý

package jdbc;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 *
 * @author giasutinhoc.vn
 */
public class JDBCCallableStatementExample {
 // SQL Server JDBC connection string
 static final String DB_URL = "jdbc:sqlserver://localhost;databaseName=EMPDB;user=sa;password=sa";
 public static void main(String[] args) {
  Connection conn = null;
  CallableStatement stmt = null;
  try {
    //Open a connection
    System.out.println("Connecting to database...");
    conn = DriverManager.getConnection(DB_URL);
    //Execute a query
    System.out.println("Creating statement...");
    String sql = "{call getEmpName (?, ?)}";
    stmt = conn.prepareCall(sql);
    //Bind IN parameter first, then bind OUT parameter
    int empID = 100;
    stmt.setInt(1, empID); // This would set ID as 100
    // Because second parameter is OUT so register it
    stmt.registerOutParameter(2, java.sql.Types.NVARCHAR);
    //Use execute method to run stored procedure.
    System.out.println("Executing stored procedure...");
    stmt.execute();
    //Retrieve employee name with getXXX method
    String empName = stmt.getString(2);
    System.out.println("Emp name with ID (" + empID + ") is " + empName);
    stmt.close();
    conn.close();
  } catch (SQLException se) {
    //Handle errors for JDBC
    se.printStackTrace();
  } finally {
    //finally block used to close resources
    try {
     if (stmt != null) {
       stmt.close();
     }
    } catch (SQLException se2) {
      se2.printStackTrace();
    }
    try {
     if (conn != null) {
       conn.close();
     }
    } catch (SQLException se) {
      se.printStackTrace();
    }//end finally try
   }//end try
   System.out.println("Done!");
 }
}

Khi chạy chương trình trên, chúng ta sẽ nhận được kết quả sau

jdbc statement trong java 1

JDBC Statement trong java – Các bước xử lý

Bước 1: Thiết lập kết nối đến máy chủ cơ sở dữ liệu

Bước 2: Tạo đối tượng thực thi câu lệnh SQL (Statement, PrepareStatement hoặc CallableStatement)

Bước 3: Viết câu lệnh SQL, thực thi câu lệnh SQL và xử lý kết quả (nếu có)

Bước 4: Đóng kết nối

JDBC Statement trong java – Tổng kết

  • Thực thi câu lệnh SQL tĩnh với Statement
  • Thực thi câu lệnh SQL có tham số với PreparedStatement
  • Thực thi thủ tục với CallableStatement
Alert: You are not allowed to copy content or view source !!