Thứ Ba, 6 tháng 5, 2025

JDBC Components

📊 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 :

    1. Tạo Statement với TYPE_SCROLL_INSENSITIVE (cho phép cuộn qua lại) và CONCUR_READ_ONLY (chỉ đọc).

    2. Thực thi truy vấn SELECT * FROM sanpham và lưu kết quả vào ResultSet rs.

    3. Di chuyển con trỏ đến dòng cuối cùng bằng rs.last().

    4. 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

Sql