mybatis-plus 註解實現多表關聯查詢的最佳實踐

在以前一篇文章 MyBatis多表關聯的無SQL通用方案 中咱們提到了註解綁定關聯查詢的實踐方案,這裏咱們再彙總梳理一下經常使用開發場景中須要涉及到 關聯 的場景以及其要支持的綁定方式。

1. 註解自動綁定數據字典(自定義枚舉)的顯示值Label

開發過程當中的枚舉值,好比用戶狀態(ACTIVE:激活,LOCKED:鎖定 ...)、身份證類型等,咱們會將其名稱name和值value定義在數據字典表,以支持擴展不改代碼以及用戶可編輯。其餘數據表中關聯該字典時,存儲對應的value,顯示時又須要查詢字典表將value轉換爲對應的name。java

經過註解綁定,我但願簡單使用如這樣:git

@BindDict(type="USER_STATUS", field = "status")
private String statusLabel;

2. 註解自動綁定其餘表的字段

如部門實體Department(department表的Java映射對象)對應的VO對象中須要關聯組織Organization實體(organization表的映射對象)。github

我但願簡單使用如這樣:數據庫

// 支持關聯條件+附加條件綁定字段
@BindField(entity=Department.class, field="name", condition="department_id=id AND parent_id>=0")
private String deptName;

// 支持經過中間表的級聯關聯綁定字段
@BindField(entity = Organization.class, field="name", condition="this.department_id=department.id AND department.org_id=id")
private String orgName;

3. 註解自動綁定其餘表實體Entity

如部門實體Department(department表的Java映射對象)對應的VO對象中須要關聯組織Organization實體(organization表的映射對象)。segmentfault

我但願簡單使用如這樣:緩存

// 支持關聯條件+附加條件綁定Entity
@BindEntity(entity = Department.class, condition="department_id=id")
private Department department;

// 經過中間表的級聯關聯綁定Entity(支持附加條件)
@BindEntity(entity = Organization.class, condition = "this.department_id=department.id AND department.org_id=id AND department.deleted=0")
private Organization organization;

4. 註解自動綁定其餘表實體集合List<Entity>

如部門實體Department對應的VO對象中須要關聯多個子部門Department實體。框架

我但願簡單使用如這樣:性能

// 支持關聯條件+附加條件綁定多個Entity
@BindEntityList(entity = Department.class, condition = "id=parent_id")
private List<Department> children;

// 經過中間表的 多對多關聯 綁定Entity(支持附加條件)
@BindEntityList(entity = Role.class, condition="this.id=user_role.user_id AND user_role.role_id=id")
private List<Role> roleList;
實現以上方案,開發過程當中的大部分關聯場景SQL均可以大大簡化,使代碼具有極好的可維護性。另外以上方案實現須要拆解成單表查詢SQL經過主鍵去查詢,能夠充分利用數據庫緩存,提升性能。

詳細瞭解其實現代碼,請至 Diboot - 簡單高效的輕代碼開發框架 (歡迎star)this

相關文章
相關標籤/搜索