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

栏目: Java · 发布时间: 5年前

内容简介:上一篇无SQL实现单表CRUD中我们已经通过Mybatis-plus插件的通用Mapper实现了单表的CRUD的无SQL化,已经可以有效减少Mybatis的代码量。但实际开发场景下,多数业务需求实现要涉及关联查询,你可以通过自己写SQL的方式去做,或者再深入思考一下有没有更方便的实现方案呢?如department表中有org_id字段,关联organization表的id字段,前端显示Department部门信息时需要显示组织名称organization.name。如department表中有状态字段sta

上一篇无 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<Department> child; //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实现:

<resultMap type="XX" id="xx">
   <association select="...">
</resultMap>

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

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

Diboot 轻代码开发框架


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

走进搜索引擎

走进搜索引擎

梁斌 / 电子工业出版社 / 2007-1 / 49.80元

《走进搜索引擎》由搜索引擎开发研究领域年轻而有活力的科学家精心编写,作者将自己对搜索引擎的深刻理解和实际应用巧妙地结合,使得从未接触过搜索引擎原理的读者也能够轻松地在搜索引擎的大厦中邀游一番。《走进搜索引擎》作为搜索引擎原理与技术的入门书籍,面向那些有志从事搜索引擎行业的青年学生、需要完整理解并优化搜索引擎的专业技术人员、搜索引擎的营销人员,以及网站的负责人等。《走进搜索引擎》是从事搜索引擎开发的......一起来看看 《走进搜索引擎》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具