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 & 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 & 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; } }); });