SQLExprTableSource Trong Druid: Các Thuộc Tính Và Phương Thức Toàn Diện
Cơ Bản
Tên đầy đủ: com.alibaba.druid.sql.ast.statement.SQLExprTableSource
Lớp cha: SQLTableSourceImpl → SQLObjectImpl
Chức năng: Biểu diễn nguồn bảng trong câu lệnh SQL FROM (bao gồm bảng đơn, view, hàm bảng, và các dạng db.table)
Ứng dụng: Phân tích cú pháp SQL, kiểm tra quyền hạn, định tuyến phân bảng, chỉnh sửa SQL, duyệt cây cú pháp
Tất Cả Thuộc Tính Thành Viên
| Tên thuộc tính | Kiểu dữ liệu | Quyền truy cập | Mô tả |
|---|---|---|---|
bieuThuc |
SQLExpr |
private |
Biểu thức bảng (cốt lõi: tên bảng/định danh) |
tenGoi |
String |
protected |
Tên gọi khác của bảng |
gachNho |
List<sqlhint> |
private |
Gợi ý bảng (ví dụ /\*+ ... \*/) |
phanBo |
SQLPartitionClause |
private |
Lệnh phân vùng (ví dụ PARTITION(p1)) |
quayVeDiemXua |
SQLFlashbackClause |
private |
Lệnh quay về điểm trước đó |
Danh Sách Phương Thức Hoàn Chỉnh
1. Hàm Khởi Tạo
SQLExprTableSource()
SQLExprTableSource(SQLExpr bieuThuc)
SQLExprTableSource(SQLExpr bieuThuc, String tenGoi)
2. Phương Thức Public Quan Trọng
| Phương thức | Trả Về | Mô tả |
|---|---|---|
getBieuThuc() |
SQLExpr |
Lấy biểu thức bảng |
setBieuThuc(SQLExpr) |
void |
Đặt lại biểu thức bảng |
getTenGoi() |
String |
Lấy tên gọi khác |
setTenGoi(String) |
void |
Đặt tên gọi khác |
getTenBang() |
String |
(Phiên bản 1.2.16+) Trả về tên bảng thuần |
getTenKho() |
String |
(Phiên bản 1.2.16+) Trả về tên kho chứa |
getGachNho() |
List<sqlhint> |
Lấy gợi ý bảng |
getPhanBo() |
SQLPartitionClause |
Lấy phân vùng |
clone() |
SQLExprTableSource |
Sao chép sâu |
toString() |
String |
Xuất ra đoạn SQL |
3. Phương Thức Protected Quan Trọng
| Phương thức | Trả Về | Quyền | Mô tả |
|---|---|---|---|
getName() |
SQLName |
protected |
Chuyển đổi tự động bieuThuc thành SQLName |
setName(SQLName) |
void |
protected |
Đặt nút tên bảng |
4. Phương Thức Kế Thừa
// Nhận bộ xử lý AST (duyệt cần thiết)
void accept(SQLASTVisitor visitor)
Phân Tích Chi Tiết getName()
1. Mã Nguồn
protected SQLName getName() {
if (bieuThuc instanceof SQLName) {
return (SQLName) bieuThuc;
}
return null;
}
2. Vai Trò
- Xác định tự động nếu
bieuThuclà kiểu tên bảng - Trả về đối tượng
SQLName(nút tên bảng) - Dễ dàng hơn
getBieuThuc()vì không cần chuyển đổi thủ công
3. Trường Hợp Sử Dụng
- Duyệt Visitor trong Druid
- Phân tích liên kết bảng
- Lấy tên bảng nhanh chóng
4. So Với getTenBang()
getName()trả về đối tượngSQLName, có thể lấy toàn bộ tên, tên kho, tên bảnggetTenBang()chỉ trả về chuỗi, chỉ tên bảng thuần
Các Phương Thức Thường Dùng Của SQLName
SQLName name = x.getName();
name.getTenDon() // Tên bảng thuần: user
name.toString() // Tên đầy đủ: db.user
name.getChuSoHuu() // Nút tên kho: db
Ví Dụ Sử Dụng
Ví Dụ 1: Duyệt Visitor
@Override
public boolean visit(SQLExprTableSource x) {
SQLName name = x.getName();
if (name == null) {
return true;
}
String tableName = name.getTenDon(); // user
String fullName = name.toString(); // db.user
String alias = x.getTenGoi(); // u
nameMap.computeIfAbsent(tableName, k -> new ArrayList<>()).add(x);
aliases.add(alias);
return true;
}
Ví Dụ 2: Phân Tích SQL Thông Thường
String sql = "SELECT * FROM db.user u";
SQLStatement stmt = SQLUtils.parseSingleMysqlStatement(sql);
SQLSelectQueryBlock query = (SQLSelectQueryBlock) ((SQLSelectStatement) stmt).getSelect().getQuery();
SQLExprTableSource ts = (SQLExprTableSource) query.getFrom();
String tableName = ts.getTenBang(); // user
String schema = ts.getTenKho(); // db
String alias = ts.getTenGoi(); // u
SQLExpr expr = ts.getBieuThuc(); // db.user node
Ví Dụ 3: Xây Dựng Bảng Nguồn
SQLPropertyExpr expr = new SQLPropertyExpr("db", "user");
SQLExprTableSource ts = new SQLExprTableSource(expr, "u");
System.out.println(ts.toString());
// Xuất: db.user u
Ví Dụ 4: Chỉnh Sửa SQL (Thay Đổi Tên Bảng)
ts.setBieuThuc(new SQLIdentifierExpr("user_2026"));
Tóm Tắt Quyền Gọi Phương Thức
- Mã bình thường: Chỉ dùng
getBieuThuc()/getTenBang()/getTenGoi() - Mã Visitor: Có thể dùng
getName()(protected) - Lấy tên bảng ưu tiên:
- Trong Visitor:
SQLName name = x.getName() - Ngoài mã:
String tableName = x.getTenBang() - Tương thích nhất:
((SQLName)x.getBieuThuc()).getTenDon()