🎯 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ẽ:
Gửi các câu lệnh SQL (INSERT, SELECT, DELETE...) đến database
Nhận dữ liệu trả về (nếu có)
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ần Mô tả DriverManager Quả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 Statement Thực thi câu lệnh SQL tĩnh (SELECT, INSERT...) PreparedStatement Thực thi câu lệnh SQL có tham số, bảo mật hơn (tránh SQL Injection) ResultSet Lưu trữ dữ liệu trả về từ truy vấn SELECT
| Thành phần | Mô tả |
|---|---|
| DriverManager | Quả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 |
| Statement | Thực thi câu lệnh SQL tĩnh (SELECT, INSERT...) |
| PreparedStatement | Thực thi câu lệnh SQL có tham số, bảo mật hơn (tránh SQL Injection) |
| ResultSet | Lư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
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");
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"));
}
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();
rs.close(); stmt.close(); conn.close();
⚙️ Ví dụ thực tế: CRUD với MySQL
🗃️ 1. Tạo cấu trúc database
CREATE DATABASE demo_jdbc;
USE demo_jdbc;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100)
);
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();
}
}
}
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>
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
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
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
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