Mục lục
PreparedStatement interface là một sub-interface của Statement được dùng để triển khai các câu truy vấn nhận các tham số đầu vào.
Hãy xem một ví dụ về câu truy vấn có tham số sau
String sql="insert into EMPLOYEE values(?,?,?)";
Như bạn có thể thấy, các dấu (?) đại diện cho các tham số mà chúng ta phải truyền giá trị cho chúng. Giá trị của các tham số này sẽ được đặt bằng cách gọi các phương thức setter của PreparedStatement.
Tại sao lại sử dụng PreparedStatement?
PreparedStatement giúp tăng hiệu suất của ứng dụng bởi vì câu truy vấn chỉ được biên dịch một lần.
Làm thế nào để tạo ra PreparedStatement instance?
Chúng ta có thể tạo ra PreparedStatement instance thông qua prepareStatement() method của Connection interface.
public PreparedStatement prepareStatement(String query)
Các method thường sử dụng trong PreparedStatement
Các method dưới đây được sử dụng thường xuyên trong PreparedStatement, vì vậy chúng ta nên xem qua chúng
public void setInt(int paramIndex, int value) | Đặt giá trị int cho một tham số tại vị trí paramIndex. |
public void setString(int paramIndex, String value) | Đặt giá trị String cho một tham số tại vị trí paramIndex. |
public void setFloat(int paramIndex, float value) | Đặt giá trị Float cho một tham số tại vị trí paramIndex. |
public void setDouble(int paramIndex, double value) | Đặt giá trị double cho một tham số tại vị trí paramIndex. |
public int executeUpdate() | Dùng để thực thi các câu query. Thường được dùng cho các câu truy vấn: create, drop, insert, update, delete etc. |
public ResultSet executeQuery() | Thực thi một câu truy vấn SELECT và trả về ResultSet. |
Điều kiện tiên quyết
Hầu hết các ứng dụng Java hiện đây đều sử dụng Maven hoặc Gradle cho phép chúng ta dễ dàng quản lý các dependency, build source code etc. Vì vậy trong bài viết này mình sẽ sử dụng project maven để hướng dẫn.
Sau khi tạo project maven thành công, chúng ta cần thêm JDBC dependency tương ứng với cơ sở dữ liệu bạn muốn, ở đây mình sử dụng mysql.
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency>
Tiếp theo, chúng ta sẽ cần tạo database dưới cơ sở dữ liệu MySQL theo lệnh sau
CREATE DATABASE `empl`; CREATE TABLE `EMPLOYEE` ( `ID` int NOT NULL AUTO_INCREMENT, `NAME` varchar(45) DEFAULT NULL, `SALARY` decimal(10,0) DEFAULT NULL, PRIMARY KEY (`ID`) )
Triển khai ví dụ
Trong phần này chúng ta sẽ cần nhau làm một ví dụ đơn giản dựa trên các kiến thức mà nảy giờ bài viết đã trình bày.
import java.math.BigDecimal; import java.sql.*; public class Main { private static final String DB_URL = "jdbc:mysql://localhost:3306/empl?serverTimezone=UTC&useSSL=false"; private static final String USER = "root"; private static final String PASS = "123456"; public static void main(String[] args) { Connection conn = null; PreparedStatement stmt = null; try{ //dang ky driver Class.forName("com.mysql.jdbc.Driver"); // Mo ket noi System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); // thuc thi cau lenh update System.out.println("Creating statement..."); String sql = "UPDATE EMPLOYEE set NAME=? WHERE ID=?"; stmt = conn.prepareStatement(sql); // Gan gia tri cho cac tham so stmt.setString(1, "DEFT"); stmt.setInt(2, 5); // Let us update age of the record with ID = 102; int rows = stmt.executeUpdate(); System.out.println("Rows impacted : " + rows ); // Let us select all the records and display them. sql = "SELECT ID, NAME, SALARY FROM EMPLOYEE"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int id = rs.getInt("ID"); String name = rs.getString("NAME"); BigDecimal salary = rs.getBigDecimal("SALARY"); //Display values System.out.print("ID: " + id); System.out.print(", NAME: " + name); System.out.print(", SALARY: " + salary); System.out.println(); System.out.println("-------------------------------"); } // Dong ket noi rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ se.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } } }
Output
Connecting to database... Creating statement... Rows impacted : 1 ID: 5, NAME: DEFT, SALARY: 10 ------------------------------- ID: 6, NAME: marry, SALARY: 20 ------------------------------- ID: 17, NAME: deft, SALARY: 100 ------------------------------- ID: 18, NAME: marrin, SALARY: 20 -------------------------------
Nguồn
https://www.javatpoint.com/PreparedStatement-interface
https://www.tutorialspoint.com/jdbc/preparestatement-object-example.htm