📊 Các Thành Phần Chính của JDBC và Vai Trò
Thành Phần | Vai Trò |
|---|
JDBC Connection URL | Cung cấp thông tin kết nối đến cơ sở dữ liệu (driver, máy chủ, cổng, tên CSDL, tham số) |
DriverManager | Quản lý driver JDBC, tạo đối tượng Connection |
Connection | Đại diện cho kết nối tới cơ sở dữ liệu, dùng để gửi câu lệnh SQL |
Statement | Thực thi câu SQL tĩnh (SELECT, INSERT,...) |
PreparedStatement | Thực thi câu SQL có tham số, an toàn và tối ưu hơn |
ResultSet | Lưu kết quả câu lệnh SELECT, cho phép duyệt và đọc dữ liệu |
⚙️JDBC Conection URL
Cú pháp: jdbc:subprotocol:subname
Thành Phần | Ý Nghĩa |
|---|
jdbc | Giao thức bắt buộc trong JDBC |
subprotocol | Loại cơ sở dữ liệu (mysql, postgresql, sqlserver...) |
subname | Thông tin kết nối: host, port, database name, tham số... |
Ví Dụ :
Cú pháp: jdbc:mysql://localhost:3306/ten_csdl
Thành Phần | Vai Trò |
|---|
jdbc | Giao thức JDBC chuẩn |
mysql | Subprotocol - loại CSDL MySQL |
localhost:3306 | Máy chủ localhost, cổng 3306 (mặc định của MySQL) |
/ten_csdl | Tên cơ sở dữ liệu muốn kết nối |
Tham Số Tùy Chọn trong JDBC URL
Cú pháp: jdbc:mysql://localhost:3306/ten_csdl?useSSL=false&characterEncoding=UTF-8
Tham Số | Mục Đích |
|---|
useSSL=false | Tắt kết nối SSL |
characterEncoding=UTF-8 | Mã hóa dữ liệu UTF-8, hỗ trợ tiếng Việt |
📈 DriverManager
Là lớp trung gian trong JDBC, thuộc gói java.sql, có vai trò quản lý driver JDBC và thiết lập kết nối.
Vai Trò
- Tải và đăng ký JDBC driver.
- Cung cấp phương thức
getConnection(...) để tạo kết nối.
Các Phương Thức
Phương Thức | Mô Tả |
|---|
getConnection(url) | Tạo kết nối không dùng user/pass |
getConnection(url, user, pass) | Tạo kết nối có tài khoản |
registerDriver(driver) | Đăng ký driver thủ công |
getDrivers() | Lấy danh sách driver đã đăng ký |
Ví Dụ :
CSDL | URL Mẫu |
|---|
MySQL | jdbc:mysql://localhost:3306/ten_csdl
|
PostgreSQL | jdbc:postgresql://localhost:5432/ten_csdl
|
SQL Server | jdbc:sqlserver://localhost:1433;databaseName=ten_csdl
|
Oracle | jdbc:oracle:thin:@localhost:1521:ten_csdl
|
📅 Connection
Interface trong gói java.sql, đại diện cho một kết nối cơ sở dữ liệu.
Vai Trò
- Gửi câu lệnh SQL.
- Quản lý giao dịch (transaction):
commit(), rollback(). - Đóng kết nối sau khi xong.
Phương Thức
Phương Thức | Mô Tả |
|---|
createStatement() | Tạo Statement cho SQL đơn giản |
prepareStatement(sql) | Tạo PreparedStatement |
setAutoCommit(false) | Tắt chế độ tự động commit |
commit(), rollback() | Quản lý giao dịch |
close() | Đóng kết nối |
📄 Statement
Interface trong gói java.sql, dùng để gửi câu SQL tĩnh (đã biết trước).
Vai Trò
- Gửi các câu lệnh SQL như SELECT, INSERT, UPDATE, DELETE...
Phương Thức
Phương Thức | Mô Tả |
|---|
executeQuery(sql) | Trả về ResultSet khi thực hiện SELECT |
executeUpdate(sql) | Trả về số dòng bị ảnh hưởng (INSERT, UPDATE, DELETE) |
execute(sql) | Thực hiện mọi loại câu SQL |
close() | Đóng Statement |
Lưu Ý
- Dễ bị SQL Injection nếu ghép chuỗi với dữ liệu người dùng.
- Giải pháp: Sử dụng PreparedStatement để an toàn hơn.
📒 PreparedStatement
Là một phần mở rộng của Statement, cho phép truyền tham số theo đúng kiểu dữ liệu, giúp tăng hiệu suất.
Ưu Điểm
- Ngăn chặn SQL Injection.
- Dễ sử dụng và tối ưu khi thực hiện nhiều lần.
Phương Thức
Phương Thức | Mô Tả |
|---|
setString(i, value) | Gán chuỗi vào tham số ? thứ i |
setInt(i, value) | Gán số nguyên vào tham số ? thứ i |
executeQuery() | Thực hiện SELECT |
executeUpdate() | Thực hiện INSERT/UPDATE/DELETE |
close() | Đóng PreparedStatement |
So Sánh :
Tiêu Chí | Statement | PreparedStatement |
|---|
SQL có tham số | Ghép chuỗi | Dấu ? + setXXX() |
An toàn Injection | ❌ | ✅ |
Hiệu năng | Thấp | Cao |
📊 ResultSet
Interface trong gói java.sql, lưu trữ kết quả từ câu lệnh SELECT.
Vai Trò
- Lưu tạm kết quả truy vấn.
- Cho phép duyệt dòng và đọc cột theo kiểu dữ liệu.
Phương Thức
Phương Thức | Mô Tả |
|---|
next() | Di chuyển con trỏ xuống dòng tiếp theo |
getString("cot") | Lấy dữ liệu cột kiểu String |
getInt("cot") | Lấy số nguyên từ cột |
close() | Đóng ResultSet |
🔍 Con Trỏ
- Mặc định: ResultSet chỉ duyệt từ trên xuống.
- Để cuộn lại hoặc duyệt ngẫu nhiên, sử dụng
TYPE_SCROLL_INSENSITIVE: Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery("SELECT * FROM sanpham");
rs.last();
System.out.println("Tổng số dòng: " + rs.getRow());Giải thích :
Tạo Statement với TYPE_SCROLL_INSENSITIVE (cho phép cuộn qua lại) và CONCUR_READ_ONLY (chỉ đọc).
Thực thi truy vấn SELECT * FROM sanpham và lưu kết quả vào ResultSet rs.
Di chuyển con trỏ đến dòng cuối cùng bằng rs.last().
In ra tổng số dòng với rs.getRow().
- Lưu ý :
- Đóng ResultSet sau khi sử dụng xong.
- Truy cập có thể thực hiện theo tên hoặc chỉ số cột.
Không có nhận xét nào:
Đăng nhận xét