上一篇 无SQL实现单表CRUD中咱们已经经过Mybatis-plus插件的通用Mapper实现了单表的CRUD的无SQL化,已经能够有效减小Mybatis的代码量。但实际开发场景下,多数业务需求实现要涉及关联查询,你能够经过本身写SQL的方式去作,或者再深刻思考一下有没有更方便的实现方案呢?
如department表中有org_id字段,关联organization表的id字段,前端显示Department部门信息时须要显示组织名称organization.name。前端
class DepartmentVO{ String orgName; //关联organization表的name字段 }
如department表中有状态字段status,存储值是"A","I"...,显示时须要转换为"正常","无效"...。java
class DepartmentVO{ String statusLabel; //关联字典表转换为显示值 }
如部门实体Department(department表的Java映射对象)对应的VO对象中须要关联组织Organization实体(organization表的映射对象)。git
class DepartmentVO { Organization organization; //1对1关联另外的实体 }
如部门实体Department对应的VO对象中须要关联多个子部门Department实体。github
class DepartmentVO{ List<Department> children; //1对多关联另外的实体 }
Mybatis-plus并未实现关联查询的解决方案:
对于字段关联,一般的解决方案是SQL关联查询,如:sql
SELECT d.*, o.name as orgName, m.item_label as statusLabel FROM department d LEFT JOIN organization o ON d.org_id=o.id LEFT JOIN metadata m ON u.status=m.item_value AND m.type='STATUS'
或者经过另一种不太优雅的方式:查询整个表获得id-name的Map,而后经过Java代码去绑定。segmentfault
对于关联一个或多个实体的状况,通常经过Mybatis的association实现:app
<resultMap type="XX" id="xx"> <association select="..."> </resultMap>
不写SQL,不经过Mybatis的association,要更优雅的实现关联的自动绑定,一个主流的方案就是相似JPA的注解了。JPA的注解须要复杂的设置,咱们能够只借鉴其思想,将注解尽量的简化。框架
首先,须要明确关联到哪一个表(实体),另外无论是哪一种关联都必需要有关联条件condition,而后是字段关联呢咱们须要指定字段名field。this
那么咱们能够将注解定义简化以下:插件
public class DepartmentVO { ... // 关联Entity中的某字段 @BindField(entity=Organization.class, field="name", condition="this.org_id=id") private String orgName; // 关联Entity @BindEntity(entity=Organization.class, condition="this.org_id=id") private Organization organization; // 关联多个Entity @BindEntityList(entity=Department.class, condition="this.id=parent_id") private List<Department> children; }
简化的使用意味着要有完善的实现逻辑,后续的章节咱们将具体讲解这些关联绑定注解的实现方案。