Thứ Ba, 6 tháng 5, 2025

JDBC

 

🎯 Vấn đề

Khi phát triển ứng dụng Java (ví dụ: phần mềm quản lý sinh viên), bạn cần lưu trữ các thông tin như:

  • Tên sinh viên

  • Tuổi, lớp học

  • Danh sách sinh viên đã thêm

Nếu chỉ sử dụng biến thông thường, dữ liệu sẽ bị mất khi tắt chương trình. Do đó, cần lưu trữ vào cơ sở dữ liệu (database) như SQLite, MySQL, PostgreSQL...

💡 Ý tưởng

Ứng dụng Java không lưu trữ dữ liệu trực tiếp mà sẽ:

  1. Gửi các câu lệnh SQL (INSERT, SELECT, DELETE...) đến database

  2. Nhận dữ liệu trả về (nếu có)

  3. Hiển thị hoặc xử lý dữ liệu trong code

👉 Để thực hiện điều này, Java sử dụng thư viện JDBC.


📚 JDBC (Java Database Connectivity)

JDBC là API tiêu chuẩn trong Java, cung cấp phương thức để kết nối và tương tác với các hệ quản trị cơ sở dữ liệu quan hệ như MySQL, Oracle, PostgreSQL... Giúp thực hiện các thao tác CRUD (Create, Read, Update, Delete) dễ dàng.

🧩 Các thành phần chính

Thành phầnMô tả
DriverManagerQuản lý driver kết nối, xác định driver phù hợp qua URL
ConnectionĐại diện kết nối đến database, thực thi câu lệnh SQL
StatementThực thi câu lệnh SQL tĩnh (SELECT, INSERT...)
PreparedStatementThực thi câu lệnh SQL có tham số, bảo mật hơn (tránh SQL Injection)
ResultSetLưu trữ dữ liệu trả về từ truy vấn SELECT

🛠️ Quy trình làm việc với JDBC

1. Nạp Driver (Tự động từ Java 6+)


Class.forName("com.mysql.cj.jdbc.Driver"); // Ví dụ với MySQL

2. Tạo kết nối

String url = "jdbc:sqlite:students.db"; // SQLite
// Hoặc MySQL: jdbc:mysql://localhost:3306/ten_database
Connection conn = DriverManager.getConnection(url, "username", "password");

3. Thực thi lệnh SQL

Sử dụng Statement:



Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE students (id INT, name VARCHAR(100))");

Sử dụng PreparedStatement (khuyến khích):


PreparedStatement pstmt = conn.prepareStatement("INSERT INTO students VALUES (?, ?)");
pstmt.setInt(1, 101);
pstmt.setString(2, "Alice");
pstmt.executeUpdate();

4. Xử lý kết quả (SELECT)



ResultSet rs = stmt.executeQuery("SELECT * FROM students");
while (rs.next()) {
    System.out.println(rs.getInt("id") + " - " + rs.getString("name"));
}

5. Đóng kết nối



rs.close();
stmt.close();
conn.close();

⚙️ Ví dụ thực tế: CRUD với MySQL

🗃️ 1. Tạo cấu trúc database

sql

CREATE DATABASE demo_jdbc;
USE demo_jdbc;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100)
);

📦 2. Code Java hoàn chỉnh


import java.sql.*;

public class JdbcExample {
    static final String URL = "jdbc:mysql://localhost:3306/demo_jdbc";
    static final String USER = "root";
    static final String PASS = "";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) {
            System.out.println("Kết nối thành công!");
            
            // CREATE
            PreparedStatement insert = conn.prepareStatement("INSERT INTO users (name, email) VALUES (?, ?)");
            insert.setString(1, "Nguyễn Văn A");
            insert.setString(2, "a@gmail.com");
            insert.executeUpdate();

            // READ
            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM users");
            while (rs.next()) {
                System.out.printf("ID: %d, Name: %s, Email: %s\n", 
                    rs.getInt("id"), rs.getString("name"), rs.getString("email"));
            }

            // UPDATE
            PreparedStatement update = conn.prepareStatement("UPDATE users SET email = ? WHERE name = ?");
            update.setString(1, "newa@gmail.com");
            update.setString(2, "Nguyễn Văn A");
            update.executeUpdate();

            // DELETE
            PreparedStatement delete = conn.prepareStatement("DELETE FROM users WHERE name = ?");
            delete.setString(1, "Nguyễn Văn A");
            delete.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

📌 Lưu ý:

  • Thêm dependency Maven nếu cần:



<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

🔍 Đánh giá JDBC

Ưu điểm

  • API đơn giản, trực quan

  • Hỗ trợ đa dạng database

  • Hiệu suất cao

Nhược điểm

  • Code dài dòng

  • Không hỗ trợ ORM

  • Dễ bị SQL Injection nếu không dùng PreparedStatement

🌟 Công nghệ thay thế/mở rộng

  • Hibernate/JPA: ORM mạnh mẽ

  • Spring Data JPA: Giảm boilerplate code

  • MyBatis: Mapping SQL → Java objects

Không có nhận xét nào:

Đăng nhận xét

Sql