Hướng dẫn Java JDBC, Ví dụ với PreparedStatement trong JDBC

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ở tài 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)

Hướng dẫn Java JDBC, Ví dụ với Statement trong JDBC

Bây giờ mình sẽ viết 1 chương trình Java liên kết 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.

Để liên kết với MySQL bằng Java tất cả chúng ta cần tải về jdbc tương ứng cho MySQL
Các bạn hoàn toàn có thể tải về thư viện jdbc cho MySQL tại đây mysql-connector-java-6.0.6.jar
Hoặc sử dụng maven :



    mysql
    mysql-connector-java
    6.0.6

Ở đây mình dùng maven ( nếu bạn nào chưa biết maven thì nên tìm hiểu và khám phá 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!");
  }
}

jdbc statement create table

Thêm 2 bản ghi vào table user_inf ( id tự tăng nên tất cả chúng ta không cần thêm nó vào câu lệnh INSERT )
Bạn hoàn toà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 listUser = new ArrayList();
    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!");
  }
}

jdbc statement insert row

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!");
  }
}

jdbc statement update row

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!");
  }
}

jdbc statement delete row

Câu lệnh select toàn bộ những 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

Hướng dẫn Java JDBC, Ví dụ với PreparedStatement trong JDBC

Tương tự với Statement, cách dùng những 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