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