Hướng dẫn Java JDBC, Ví dụ với PreparedStatement trong JDBC.
PreparedStatement
- PreparedStatement là một trong ba loại interace thực thi câu lệnh truy vấn SQL trong JDBC API
 - PreparedStatement có hiệu năng lớn hơn Statement nhưng thấp hơn CallableStatement.
 - PreparedStatement được sử dụng để thực thi các câu truy vấn SQL động hoặc có tham số.
 - PreparedStatement thừa kế từ Statement nhưng nó cho phép truyền các tham số vào câu SQL trong thời gian run time.
 - PreparedStatement được khuyên sử dụng trong trường hợp câu SQL được sử dụng nhiều lần.
 
Ví dụ với PreparedStatement trong JDBC.
Tạo cơ sở dữ liệu demo-jdbc như hình dưới:
CREATE SCHEMA `demo-jdbc` ;
(Xem lại: Cài đặt và cấu hình MySQL)
Bây giờ mình sẽ viết 1 chương trình Java kết nối tới database demo-jdbc
- Tạo 1 table ‘user_info’ với 3 column (id, name, address) trong đó id kiểu int là primary key và tự tăng; name và address kiểu varchar
 - Thêm, sửa, xóa, truy vấn với table ‘user_info’ đã tạo ở trên.
 
Để kết nối với MySQL bằng Java chúng ta cần download jdbc tương ứng cho MySQL
Các bạn có thể download thư viện jdbc cho MySQL tại đây mysql-connector-java-6.0.6.jar
Hoặc sử dụng maven:
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>
Ở đây mình dùng maven (nếu bạn nào chưa biết maven thì nên tìm hiểu luôn vì nó được dùng nhiều và khá quan trọng khi đi làm)
Tạo table user_info
package stackjava.com.demojdbc.preparedstatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class CreateTable {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    String sql = "CREATE TABLE user_info (" +
        "  id int(11) NOT NULL AUTO_INCREMENT," +
        "  name varchar(45) DEFAULT NULL," +
        "  address varchar(255) DEFAULT NULL," +
        "  PRIMARY KEY (id)" +
        ")";
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.execute();
    con.close();
    System.out.println("Created!");
  }
}
Thêm 2 bản ghi vào table user_inf (id tự tăng nên chúng ta không cần thêm nó vào câu lệnh INSERT)
Bạn có thể lấy, với PreparedStatement ta chỉ cần viết 1 câu SQL và truyền tham số cho nó 2 lần để tạo 2 bản ghi chứ không cần viết 2 câu SQL giống như Statement
package stackjava.com.demojdbc.preparedstatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import stackjava.com.demojdbc.entities.User;
public class InsertRow {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    
    String sql = "INSERT INTO user_info (name, address) VALUES (?, ?);";
    List<User> listUser = new ArrayList<User>();
    listUser.add(new User("Harry", "England"));
    listUser.add(new User("Batman", "USA"));
    PreparedStatement pstmt = con.prepareStatement(sql);
    for (User user : listUser) {
      pstmt.setString(1, user.getName());
      pstmt.setString(2, user.getAddress());
      pstmt.execute();
    }
    con.close();
    System.out.println("Inserted!");
  }
}
Update bản ghi (row) có address = “England” thành “VietNam”
package stackjava.com.demojdbc.preparedstatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UpdateRow {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    
    String sql = "UPDATE user_info SET address = 'VietNam' WHERE address = 'England';";
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.executeUpdate();
    con.close();
    System.out.println("Updated!");
  }
}
Xóa bản ghi có address = “USA”
package stackjava.com.demojdbc.preparedstatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DeleteRow {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    String sql = "DELETE FROM user_info WHERE address = 'USA';";
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.executeUpdate();
    con.close();
    System.out.println("DELETED!");
  }
}
Câu lệnh select tất cả các bản ghi trong table user_info:
package stackjava.com.demojdbc.preparedstatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SelectRow {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    String sql = "SELECT * FROM user_info;";
    
    PreparedStatement pstmt = con.prepareStatement(sql);
    ResultSet rs = pstmt.executeQuery();
    while (rs.next())
      System.out.println(rs.getInt(1) + "  " + rs.getString(2) + "  " + rs.getString(3));
    
    con.close();
    System.out.println("Done!");
  }
}
Kết quả:
Hướng dẫn Java JDBC, Ví dụ với PreparedStatement trong JDBC
Tương tự với Statement, cách dùng các method execute của PreparedStatement như sau:
- execute:dùng cho câu sql DDL (tạo, xóa, sửa bảng)
 - executeUpdate: dùng cho câu sql INSERT, UPDATE, DELETE
 - executeQuery: dùng câu sql SELECT
 
Okay, Done!
Xem thêm:
Truy vấn database với jdbc – StatementStatement
Truy vấn database với jdbc – CallableStatement
Download code ví dụ trên tại đây





