资讯专栏INFORMATION COLUMN

Mybatis单表CRUD与多表关联的无SQL通用方案_2: 无SQL实现关联查询的自动绑定

30e8336b8229 / 558人阅读

摘要:对关联另外的实体关联查询另外一张表的多个实体如部门实体对应的对象中需要关联多个子部门实体。对于关联一个或多个实体的情况,一般通过的实现无的实现方案不写,不通过的,要更优雅的实现关联的自动绑定,一个主流的方案就是类似的注解了。

上一篇无SQL实现单表CRUD中我们已经通过Mybatis-plus插件的通用Mapper实现了单表的CRUD的无SQL化,已经可以有效减少Mybatis的代码量。但实际开发场景下,多数业务需求实现要涉及关联查询,你可以通过自己写SQL的方式去做,或者再深入思考一下有没有更方便的实现方案呢?
涉及关联的开发场景 1. 关联查询另外一张表的字段 1.1. id-name转换:

如department表中有org_id字段,关联organization表的id字段,前端显示Department部门信息时需要显示组织名称organization.name。

class DepartmentVO{
    String orgName; //关联organization表的name字段
}
1.2. 可配置的元数据/数据字典之类的value-label转换

如department表中有状态字段status,存储值是"A","I"...,显示时需要转换为"正常","无效"...。

class DepartmentVO{
    String statusLabel; //关联字典表转换为显示值
}
2. 关联查询另外一张表的单个实体

如部门实体Department(department表的Java映射对象)对应的VO对象中需要关联组织Organization实体(organization表的映射对象)。

class DepartmentVO {
    Organization organization; //1对1关联另外的实体
}
3. 关联查询另外一张表的多个实体

如部门实体Department对应的VO对象中需要关联多个子部门Department实体。

class DepartmentVO{
    List children; //1对多关联另外的实体
}
常规的实现方案

Mybatis-plus并未实现关联查询的解决方案:
对于字段关联,通常的解决方案是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代码去绑定。

对于关联一个或多个实体的情况,一般通过Mybatis的association实现:


   
无SQL的实现方案

不写SQL,不通过Mybatis的association,要更优雅的实现关联的自动绑定,一个主流的方案就是类似JPA的注解了。JPA的注解需要复杂的设置,我们可以只借鉴其思想,将注解尽可能的简化。

首先,需要明确关联到哪个表(实体),另外不管是哪种关联都必须要有关联条件condition,然后是字段关联呢我们需要指定字段名field。

那么我们可以将注解定义简化如下:

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 children;
}

简化的使用意味着要有完善的实现逻辑,后续的章节我们将具体讲解这些关联绑定注解的实现方案。

Diboot - 简单高效的轻代码开发框架

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74747.html

相关文章

  • MyBatis-Plus初步

    摘要:是最流行的关系型数据库管理系统之一,在应用方面,是最好的,关系数据库管理系统应用软件。是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 本章主要是对MyBatis-Plus的初步介绍,包括一些背景知识、环境搭建、初步使用等知识和例子。对于背景知识,主要包含对MyBatis-Plus的特性介绍、为什么使用MyB...

    娣辩孩 评论0 收藏0
  • Mybatis【配置文件】就是这么简单

    摘要:场合常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用将每一条记录映射到中,在前端页面遍历中是即可。如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。 配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装...

    freewolf 评论0 收藏0
  • MyBatis理解与掌握(关联查询

    摘要:订单信息与订单明细为一对多关系。例如先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。作用将关联查询信息映射到一个对象中。 MyBatis理解与掌握(关联查询) @(MyBatis)[Java, 框架, MyBatis] 一对一查询 案例:查询所有订单信息,关联查询下单用户信息 showImg(https://segmentfault...

    MiracleWong 评论0 收藏0
  • MyBatis缓存介绍

    摘要:缓存介绍正如大多数持久层框架一样,同样提供了一级缓存和二级缓存的支持一级缓存基于的本地缓存,其存储作用域为,当或之后,该中的所有就将清空。一级缓存实现对的操作内部都是通过来执行的。 MyBatis缓存介绍   正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持   一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se...

    mingde 评论0 收藏0

发表评论

0条评论

30e8336b8229

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<