在以前一篇文章 MyBatis多表关联的无SQL通用方案 中咱们提到了注解绑定关联查询的实践方案,这里咱们再汇总梳理一下经常使用开发场景中须要涉及到 关联 的场景以及其要支持的绑定方式。
开发过程当中的枚举值,好比用户状态(ACTIVE:激活,LOCKED:锁定 ...)、身份证类型等,咱们会将其名称name和值value定义在数据字典表,以支持扩展不改代码以及用户可编辑。其余数据表中关联该字典时,存储对应的value,显示时又须要查询字典表将value转换为对应的name。java
经过注解绑定,我但愿简单使用如这样:git
@BindDict(type="USER_STATUS", field = "status") private String statusLabel;
如部门实体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;
如部门实体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;
如部门实体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