Hiện nay hầu hết các ứng dụng Java hay các framework của nó đều dần chuyển sang các ORM(Object Relational Mapping) để làm việc với database, có thể kể đến là hibernate được sử dụng rộng rãi. Thế nên mọi người có xu hướng dần quên đi JDBC, thế nhưng các bạn có biết rằng bên dưới hibernate đang sử dụng JDBC để để kết nối đến database và thực thi các lệnh SQL được nó tạo ra.

Trong loạt bài viết này, chúng ta sẽ cùng tìm hiểu về JDBC và cách sử dụng chúng.

JDBC là gì?

JDBC - Java Database Connectivity, là một API chuẩn để kết nối giữa ngôn ngữ lập trình Java và các database. Nó là một phần của JavaSE (Java Standard Edition). API JDBC sử dụng JDBC drivers để kết nối với cơ sở dữ liệu.

Kiến trúc JDBC

  • JDBC API: Cho phép chương trình Java thực thi các câu lệnh SQL và truy xuất kết quả. Một số lớp và interface quan trọng được định nghĩa trong JDBC API như sau:
  • DriverManager: Đóng vai trò quan trọng trong kiến trúc JDBC. Nó sử dụng một số quy trình điều khiển dành riêng cho cơ sở dữ liệu để kết nối hiệu quả các ứng dụng doanh nghiệp với database
  • JDBC Driver: Để giao tiếp với nguồn dữ liệu thông qua JDBC, bạn cần JDBC Driver để giao tiếp với nguồn dữ liệu tương ứng. Có 4 loại JDBC drivers:
    • JDBC - ODBC Bridge Driver
    • Native Drive
    • Network Protocol Driver
    • Thin driver

Các thành phần chính trong JDBC

  • DriverManager: Là một class dùng để quản lý danh sách các Driver
  • Driver: Là một interface, chịu trách nhiệm xử lý các hoạt động giao tiếp giữa ứng dụng và database
  • Connection: Là một interface, cung cấp các phương thức cho việc thao tác với database
  • Statement: Là một interface, để thực thi các câu lệnh SQL xuống database
  • ResultSet: Là một bảng dữ liệu mà biểu diễn tập kết quả từ cơ sở dữ liệu trả về bởi các lệnh SQL
  • SQLException: Xử lý ngoại lệ xảy ra trong database

Các bước kết nối database với Java

  • Load driver
  • Tạo kết nối (Create Connection)
  • Tạo câu lệnh truy vấn SQL (Statement)
  • Thực thi câu lệnh truy vấn SQL (Excute query)
  • Đóng kết nối (Close Connection)

Tạo project ví dụ JDBC

Chuẩn bị database

Trong ví dụ này mình sẽ sử dụng MySQL. Mình có một bảng users với cấu trúc sau:

Thêm một số dữ liệu vào bảng users

Cài đặt thư viện

Ở đây mình sẽ sử dụng Maven để quản lý chương trình Java

Add 2 dependency vào file pom.xml

<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc10 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc10</artifactId>
    <version>19.13.0.0.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

Nếu bạn sử dụng database khác thay vì MySQL thì hãy sử dụng các dependency khác

Tạo kết nối tới database

Để có thể kết nối tới database chúng ta cần chuẩn bị các thông tin như: hostname, username, password, database

public class ConnectJDBC {
    private String hostName = "localhost:8082";
    private String dbName = "my_database";
    private String username = "root";
    private String password = "123";

    private String connectionURL = "jdbc:mysql://"+hostName+"/"+dbName;

    public Connection connect(){
        //Tạo đối tượng Connection
        Connection conn = null;

        try {
            conn = DriverManager.getConnection(connectionURL, username, password);
            System.out.println("Kết nối thành công");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return conn;
    }
}

Sử dụng JDBC API để truy vấn dữ liệu

Lấy ra toàn bộ thông tin users

public class Main {
    public static void main(String[] args) {
        ConnectJDBC connectJDBC = new ConnectJDBC();
        Connection conn = connectJDBC.connect();

        String query = "SELECT * FROM users";

        Statement stm = null;
        try {
            //Tạo đối tượng Statement
            stm = conn.createStatement();

            //Thực thi truy vấn và trả về đối tượng ResultSet
            ResultSet rs = stm.executeQuery(query);

            //Duyệt kết quả trả về
            while (rs.next()){  //Di chuyển con trỏ xuống bản ghi kế tiếp
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String password = rs.getString("password");
                String email = rs.getString("email");

                System.out.println(id + " - " + username + " - " + password + " - " + email);
            }
            //Đóng kết nối
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

Kết quả:

Kết nối thành công
1 - ngoc - 12345 - ngoc@gmail.com
2 - hoang - 12345 - hoang@gmail.com
3 - linh - 12345 - linh@gmail.com
4 - quan - 12345 - quan@gmail.com

Chỉ định tham số đầu vào với PreparedStatement

Tham số được đại diện bởi dấu ?, bạn phải cung cấp giá trị cho tất cả các tham số trước khi thực hiện câu lệnh SQL. Mỗi tham số sẽ được đánh dấu bằng số thứ tự, tham số đầu tiên có vị trí là 1, kế tiếp là 2,…

public class Main {
    public static void main(String[] args) {
        ConnectJDBC connectJDBC = new ConnectJDBC();
        Connection conn = connectJDBC.connect();

        String query = "SELECT * FROM users WHERE username = ?";

        PreparedStatement pstm = null;
        try {
            //Tạo đối tượng Statement
            pstm = conn.prepareStatement(query);

            //gán các giá trị vào tham số
            pstm.setString(1, "ngoc");

            //Thực thi truy vấn và trả về đối tượng ResultSet
            ResultSet rs = pstm.executeQuery();

            //Duyệt kết quả trả về
            while (rs.next()){
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String password = rs.getString("password");
                String email = rs.getString("email");

                System.out.println(id + " - " + username + " - " + password + " - " + email);
            }

            //Đóng kết nối
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Kết quả:

Kết nối thành công
1 - ngoc - 12345 - ngoc@gmail.com

Thêm dữ liệu mới

public class Main {
    public static void main(String[] args) {
        ConnectJDBC connectJDBC = new ConnectJDBC();
        Connection conn = connectJDBC.connect();

        String query = "INSERT INTO users(id, username, password, email) " +
                "VALUES (null, ?,?,?)";

        PreparedStatement pstm = null;
        try {
            pstm = conn.prepareStatement(query);

            pstm.setString(1, "hung");
            pstm.setString(2, "123456789");
            pstm.setString(3, "hung@gmail.com");

            //Khi thực hiện các lệnh insert/update/delete sử dụng executeUpdate(), nó sẽ trả về số hàng bị tác động
            int row = pstm.executeUpdate();
            if(row != 0){
                System.out.println("Thêm thành công " + row);
            }

            //Đóng kết nối
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Kết quả:

Update password

public class Main {
    public static void main(String[] args) {
        ConnectJDBC connectJDBC = new ConnectJDBC();
        Connection conn = connectJDBC.connect();

        String query = "UPDATE users SET password = ? WHERE id = ?";

        PreparedStatement pstm = null;
        try {
            pstm = conn.prepareStatement(query);

            pstm.setString(1, "ngoc123");
            pstm.setInt(2, 1);

            //Khi thực hiện các lệnh insert/update/delete sử dụng executeUpdate, nó sẽ trả về số hàng bị tác động
            int row = pstm.executeUpdate();
            if(row != 0){
                System.out.println("Cập nhật thành công " + row);
            }

            //Đóng kết nối
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Kết quả:

Xóa một record

public class Main {
    public static void main(String[] args) {
        ConnectJDBC connectJDBC = new ConnectJDBC();
        Connection conn = connectJDBC.connect();

        String query = "DELETE FROM users WHERE id = ?";

        PreparedStatement pstm = null;
        try {
            pstm = conn.prepareStatement(query);

            pstm.setInt(1, 1);

            //Khi thực hiện các lệnh insert/update/delete sử dụng executeUpdate, nó sẽ trả về số hàng bị tác động
            int row = pstm.executeUpdate();
            if(row != 0){
                System.out.println("Xóa thành công " + row);
            }

            //Đóng kết nối
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Kết quả:

Xem toàn bộ code tại đây

Khóa học Java FullStack dành cho người mới bắt đầu

Chi tiết: https://java.techmaster.vn/

Liên hệ hỗ trợ: Ms Mẫn - 0963023185 (zalo)