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





