JDBC (Java Database Connectivity) là bộ giao diện chuẩn của Java để truy cập cơ sở dữ liệu quan hệ. Nó cung cấp lớp trừu tượng hóa giúp ứng dụng Java tương tác với nhiều hệ quản trị cơ sở dữ liệu (RDBMS) như MySQL, PostgreSQL, Oracle mà không cần thay đổi logic truy vấn — chỉ cần điều chỉnh chuỗi kết nối và driver tương ứng.
Các thành phần chính trong kiến trúc JDBC
- DriverManager: Quản lý việc đăng ký và tải driver JDBC; dùng để thiết lập kết nối qua phương thức
getConnection(). - Connection: Đại diện cho một phiên kết nối tới cơ sở dữ liệu; được sử dụng để tạo các đối tượng thực thi câu lệnh SQL.
- Statement: Giao diện để gửi câu lệnh SQL thuần (không tham số). Các biến thể phổ biến gồm:
Statement: Dành cho truy vấn tĩnh, dễ bị tấn công SQL injection.PreparedStatement: Hỗ trợ tham số hóa, tăng bảo mật và hiệu năng khi thực thi lặp.CallableStatement: Dùng gọi stored procedure hoặc hàm hệ thống.
- ResultSet: Chứa tập kết quả trả về từ truy vấn
SELECT, hỗ trợ duyệt tuần tự qua từng dòng bằng phương thứcnext(). - SQLException: Ngoại lệ kiểm soát được phát sinh khi có lỗi trong quá trình giao tiếp với CSDL.
Ví dụ triển khai với MySQL
Dưới đây là các thao tác CRUD cơ bản trên bảng courses, sử dụng MySQL Connector/J phiên bản 8.x và xử lý tài nguyên đúng cách (tránh rò rỉ kết nối).
1. Truy vấn dữ liệu (SELECT)
public void fetchCourses() throws SQLException {
String url = "jdbc:mysql://localhost:3306/lianxi?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
try (Connection conn = DriverManager.getConnection(url, "root", "123456");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT cno, cname, tno FROM courses")) {
while (rs.next()) {
String courseCode = rs.getString("cno");
String courseName = rs.getString("cname");
int teacherId = rs.getInt("tno");
System.out.printf("Mã: %s | Tên: %s | GV: %d%n", courseCode, courseName, teacherId);
}
}
}
2. Xóa bản ghi (DELETE)
public void removeCourseByTeacherId(int teacherId) throws SQLException {
String url = "jdbc:mysql://localhost:3306/lianxi?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
String sql = "DELETE FROM courses WHERE tno = ?";
try (Connection conn = DriverManager.getConnection(url, "root", "123456");
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, teacherId);
int rowsAffected = pstmt.executeUpdate();
System.out.println("Số bản ghi đã xóa: " + rowsAffected);
}
}
3. Cập nhật dữ liệu (UPDATE)
public void updateCourse(String oldCode, String newCode, String newName, int newTeacherId) throws SQLException {
String url = "jdbc:mysql://localhost:3306/lianxi?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
String sql = "UPDATE courses SET cno = ?, cname = ?, tno = ? WHERE cno = ?";
try (Connection conn = DriverManager.getConnection(url, "root", "123456");
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, newCode);
pstmt.setString(2, newName);
pstmt.setInt(3, newTeacherId);
pstmt.setString(4, oldCode);
int updatedRows = pstmt.executeUpdate();
System.out.println("Số bản ghi cập nhật: " + updatedRows);
}
}
4. Thêm bản ghi mới (INSERT)
public void addNewCourse(String code, String name, int teacherId) throws SQLException {
String url = "jdbc:mysql://localhost:3306/lianxi?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
String sql = "INSERT INTO courses (cno, cname, tno) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url, "root", "123456");
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, code);
pstmt.setString(2, name);
pstmt.setInt(3, teacherId);
int insertedRows = pstmt.executeUpdate();
System.out.println("Số bản ghi chèn thành công: " + insertedRows);
}
}
Lưu ý: Tất cả ví dụ trên đều sử dụng khối try-with-resources để đảm bảo đóng tự động Connection, Statement và ResultSet. Chuỗi kết nối bao gồm các tham số bắt buộc như serverTimezone và allowPublicKeyRetrieval nhằm tương thích với phiên bản MySQL 8+ và driver mới nhất.