在之前一篇文章 MyBatis多表關(guān)聯(lián)的無SQL通用方案 中我們提到了注解綁定關(guān)聯(lián)查詢的實踐方案役首,這里我們再匯總梳理一下常用開發(fā)場景中需要涉及到 關(guān)聯(lián) 的場景以及其要支持的綁定方式。
1. 注解自動綁定數(shù)據(jù)字典(自定義枚舉)的顯示值Label
開發(fā)過程中的枚舉值陆盘,比如用戶狀態(tài)(ACTIVE:激活经瓷,LOCKED:鎖定 ...)汤善、身份證類型等,我們會將其名稱name和值value定義在數(shù)據(jù)字典表牧愁,以支持擴展不改代碼以及用戶可編輯素邪。其他數(shù)據(jù)表中關(guān)聯(lián)該字典時,存儲對應的value猪半,顯示時又需要查詢字典表將value轉(zhuǎn)換為對應的name兔朦。
通過注解綁定,我希望簡單使用如這樣:
@BindDict(type="USER_STATUS", field = "status")
private String statusLabel;
2. 注解自動綁定其他表的字段
如部門實體Department(department表的Java映射對象)對應的VO對象中需要關(guān)聯(lián)組織Organization實體(organization表的映射對象)磨确。
我希望簡單使用如這樣:
// 支持關(guān)聯(lián)條件+附加條件綁定字段
@BindField(entity=Department.class, field="name", condition="department_id=id AND parent_id>=0")
private String deptName;
// 支持通過中間表的級聯(lián)關(guān)聯(lián)綁定字段
@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對象中需要關(guān)聯(lián)組織Organization實體(organization表的映射對象)沽甥。
我希望簡單使用如這樣:
// 支持關(guān)聯(lián)條件+附加條件綁定Entity
@BindEntity(entity = Department.class, condition="department_id=id")
private Department department;
// 通過中間表的級聯(lián)關(guān)聯(lián)綁定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對象中需要關(guān)聯(lián)多個子部門Department實體。
我希望簡單使用如這樣:
// 支持關(guān)聯(lián)條件+附加條件綁定多個Entity
@BindEntityList(entity = Department.class, condition = "id=parent_id")
private List<Department> children;
// 通過中間表的 多對多關(guān)聯(lián) 綁定Entity(支持附加條件)
@BindEntityList(entity = Role.class, condition="this.id=user_role.user_id AND user_role.role_id=id")
private List<Role> roleList;
實現(xiàn)以上方案乏奥,開發(fā)過程中的大部分關(guān)聯(lián)場景SQL都可以大大簡化摆舟,使代碼具備極好的可維護性。另外以上方案實現(xiàn)需要拆解成單表查詢SQL通過主鍵去查詢邓了,可以充分利用數(shù)據(jù)庫緩存恨诱,提高性能。
詳細了解其實現(xiàn)代碼骗炉,請至 Diboot - 簡單高效的輕代碼開發(fā)框架 (歡迎star)