Druid Nguồn Dữ Liệu: Tổng Quan Các Lớp và Công Cụ SQL Cốt Lõi

Druid SQL Tổng Hợp Toàn Diện Các Lớp & Công Cụ Chính

Phân loại theogiải mã SQL, cây cú pháp trừu tượng AST, định dạng SQL, xác thực SQL, xử lý tham số, bộ lọc, tiện ích, bao phủ đầy đủ các lớp cốt lõi thường dùng trong phát triển.

I. Đường Dẫn Gói Cốt Lõi

com.alibaba.druid.sql       // Giải mã SQL, AST, trình phân tích cú pháp
com.alibaba.druid.sql.parser // Phân từ, phân tích cú pháp
com.alibaba.druid.sql.ast   // Nút cây cú pháp trừu tượng AST
com.alibaba.druid.util      // Lớp tiện ích chung
com.alibaba.druid.filter    // Bộ lọc SQL

II. Các Lớp Mở Đầu Giải Mã SQL

1. SQLParserManager

  • Chức năng:Tự động lấy trình phân tích SQL phù hợp dựa trên loại cơ sở dữ liệu
  • Hỗ trợ phương ngữ: MySQL, Oracle, PostgreSQL, SQLServer, DB2
  • Phương thức thường dùng:``` // Giải mã SQL thành danh sách câu lệnh AST List<SQLStatement> parse = SQLParserManager.parseStatements(duongDanSQL, LoaiCSDL.MYSQL);

### 2. SQLStatementParser

Lớp cha cho các trình phân tích SQL riêng của từng cơ sở dữ liệu

- `MySqlStatementParser` Dành riêng cho MySQL
- `OracleStatementParser` Dành riêng cho Oracle
- `PGStatementParser` PostgreSQL
- `SQLServerStatementParser` SQLServer
Phương thức cốt lõi:
- `parseStatement()` Giải mã một câu lệnh SQL
- `parseStatements()` Giải mã nhiều câu lệnh SQL

### 3. Lexer Trình Phân Tự Từ

`com.alibaba.druid.sql.parser.Lexer`

- Chịu trách nhiệm**phân tách SQL**: từ khóa, tên bảng, trường, toán tử, hằng số
- Trình phân tích phụ thuộc vào Lexer để phân tích từ vựng ở tầng thấp

III. Các Lớp Cây Cú Pháp Trừu Tượng AST Cốt Lõi
------------------------------------

### 1. SQLStatement

Lớp**cha gốc** cho tất cả các câu lệnh SQL
Các lớp con tương ứng với các loại SQL:

- `SQLSelectStatement` Câu lệnh truy vấn
- `SQLInsertStatement` Câu lệnh chèn
- `SQLUpdateStatement` Câu lệnh cập nhật
- `SQLDeleteStatement` Câu lệnh xóa
- `SQLAlterStatement` Sửa đổi bảng
- `SQLDropStatement` Xóa cơ sở dữ liệu/bảng
- `SQLCreateStatement` Tạo cơ sở dữ liệu/bảng

### 2. SQLExpr Biểu Thức SQL

Lớp cha cho tất cả các biểu thức:

- `SQLIdentifierExpr` Tường/cột
- `SQLBinaryOpExpr` Biểu thức nhị phân (và/hằng/bằng/like)
- `SQLNumberExpr` Hằng số số
- `SQLCharExpr` Hằng số chuỗi
- `SQLInExpr` biểu thức in
- `SQLBetweenExpr` biểu thức between

### 3. SQLTableSource Nguồn Bảng

- Đại diện cho bảng, truy vấn con, bảng liên kết sau FROM
- `SQLTableSourceTable` Bảng thông thường
- `SQLTableSourceSubQuery` Truy vấn con
- `SQLJoinTableSource` Bảng liên kết join

IV. Công Cụ Định Dạng &amp; Tối Ưu SQL
--------------------------------

### 1. SQLUtils (Thường dùng nhất)

**Lớp tiện dụng đa năng**, bắt buộc phải dùng trong phát triển hàng ngày
Phương thức tĩnh cốt lõi:

// Định dạng SQL, làm đẹp String duongDanDaDinhDang = SQLUtils.format(duongDanSQL, LoaiCSDL.MYSQL);

// Nén SQL, loại bỏ dòng và khoảng trắng String duongDanNen = SQLUtils.compactSql(duongDanSQL);

// Giải mã SQL để lấy AST List<SQLStatement> danhSachCauLenh = SQLUtils.parseStatements(duongDanSQL, LoaiCSDL.MYSQL);

// Xác thực cú pháp boolean hopLe = SQLUtils.isValidSql(duongDanSQL, LoaiCSDL.MYSQL);


### 2. SQLFormatOption

Tham số cấu hình định dạng

- Đặt có viết hoa từ khóa, thụt lề, xuống dòng, có định dạng truy vấn con hay không

V. Mô Thống Truy Cập SQL (Duyệt AST)
------------------------------

### SQLASTVisitor / SQLASTVisitorAdapter

Chức năng:**Duyệt cây cú pháp AST, tùy chỉnh xử lý tên bảng, trường, điều kiện**
Ứng dụng điển hình:

- Viết lại tên bảng (tiền tố sau khi phân mảnh cơ sở dữ liệu)
- Thêm điều kiện ID tenant
- Mã hóa trường nhạy cảm
- Trích xuất tất cả tên bảng, tên trường từ SQL

Cấu trúc ví dụ:

public class NguonTruyVanBieuThuc extends SQLASTVisitorAdapter { @Override public boolean visit(SQLTableSourceTable x) { // Lấy tên bảng, sửa tên bảng return super.visit(x); } }


VI. Lớp Tường Lửa SQL &amp; Xác Thực Bảo Mật
---------------------------------

### 1. WallFilter

Bộ lọc tường lửa SQL của Druid

- Ngăn chặn xóa/cập nhật toàn bảng, chống chèn, chống DDL nguy hiểm
- Cấu hình danh sách đen/trắng, cấm delete/update không điều kiện where

### 2. WallConfig

Cấu hình quy tắc tường lửa

- `setDeleteAllow(false)` Cấm xóa
- `setDropTableAllow(false)` Cấm xóa bảng
- `setSelectAllColumnAllow(false)` Cấm select *

### 3. SqlInjectionDetector

Lớp công cụ phát hiện chèn SQL

- Phát hiện tham số đầu vào có chứa từ khóa chèn không

VII. Lớp Bao Bọc SQL Tầng JDBC
----------------------

### 1. DruidConnection / DruidStatement / DruidPreparedStatement

- Chặn thực thi SQL gốc JDBC
- Bắt SQL, thời gian thực thi, ngoại lệ, tham số
- Kích hoạt giải mã SQL, in nhật ký, thống kế SQL chậm ở tầng thấp

### 2. FilterChain / FilterEvent

Chuỗi bộ lọc Druid

- Bộ lọc tùy chỉnh SQL, xử lý mặt cắt trước/sau khi thực thi SQL

VIII. Liệt Kê Phương Ngôn Cơ Sở Dữ Liệu
-----------------------------

### LoaiCSDL

`com.alibaba.druid.LoaiCSDL`

MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, DB2, H2, SQLITE


Giải mã, định dạng phải chỉ định LoaiCSDL

IX. Tổng Hợp Công Cụ Thường Dùng
-----------------------

| Tên lớp | Mục đích chính |
|---|---|
| SQLUtils | Định dạng SQL, giải mã, nén, xác thực cú pháp |
| SQLParserManager | Tự động lấy trình phân tích phương ngữ phù hợp |
| DruidSqlParser | Một điểm vào giải mã nhanh |
| WallFilter + WallConfig | Tường lửa SQL, chặn SQL nguy hiểm |
| SQLASTVisitorAdapter | Duyệt AST, viết lại SQL, trích xuất tên bảng |
| SQLFormatOption | Tùy chỉnh quy tắc định dạng |

X. Mẫu Mã Thực Tế Thường Dùng
---------------------

### 1. Giải mã SQL + Định dạng

String cauLenhSQL = "select id,ten from nguoidung where id=1"; // Định dạng String duongDanDep = SQLUtils.format(cauLenhSQL, LoaiCSDL.MYSQL); // Giải mã AST List<SQLStatement> danhSachCauLenh = SQLUtils.parseStatements(cauLenhSQL, LoaiCSDL.MYSQL);


### 2. Duyệt AST để trích xuất tên bảng

SQLUtils.parseStatements(cauLenhSQL, LoaiCSDL.MYSQL).forEach(cauLenh -> { cauLenh.accept(new SQLASTVisitorAdapter() { @Override public boolean visit(SQLTableSourceTable bang) { System.out.println("Tên bảng: " + bang.getTableName()); return true; } }); });

Thẻ: Druid sql AST Java cơ sở dữ liệu

Đăng vào ngày 28 tháng 7 lúc 06:05