mybatis多层数据包含集合和对象的组装

前言、
业务表现为一组信息的数据在库表层面通常会被按主表明细表其他关联表来拆分,那么如果需要获取一个主信息(包含明细信息关联信息),就会有两种策略,一种在代码中处理(就是简单多次查询成对象,在内存中操作),另一种则是下沉到sql中处理,如何选择呢,是看业务的内聚程度了,我们假设这个信息,就是每次都要打包查询的,那么自然是放到sql中处理可以最大程度复用,写最少的代码。本文就是介绍如何利用mybatis的功能,完成sql多层数据,包含集合和对象的组装。
比如我们要获取这样的一组数据:


image.png

如果是代码中处理,
那就是
step 1 查找主表信息
step 2 根据主表id查询明细表信息
step 3 根据明细表内容查找关联的属性对象
以下介绍的是用mybatis的 collection association 等方式直接用一次查询语句搞定这三层数据的封装。
一、xml配置


image.png

如图
代码的自我描述性其实已经够清晰了,

    
        
        
        
    

    
    

    
        
    

    

    

表名和包路径做了些混淆处理,不过应该不影响阅读。

第一步,主体信息中声明一个 collection 集合数据,property是明细表的属性名,ofType为明细表类型,
column="{明细表入参1=主表字段1,明细表入参2=主表字段2}" 做参数传递,如果多个用逗号隔开, select="selectRelVOList" 则是真正封装明细的查询语句
第二步 执行明细表的查询语句(接主表的结果并传参进行查询),如果明细表都是基本类型字段,那么就不需要第三步了,我们发现明细表有个corpInventoryBo,它是一个一般java对象,则我们必须给明细表声明一个resultMap id="AgrFinishProductRelVO" 并且用到 association标签 其中的 property 就是指其在明细对象中的属性名称,javaType则是它的java类型,column="{inventory_id=inventory_id}" 及
select="getCorpInventory" 则和第一步的解释一样,不再重复。
第三步,查找association 中指明的select语句 把一般对象查询并设置给关联表
二、执行结果
结果当然如前言所展示的图,可以查询主表 明细表 及明细表中一个关联的java对象。
那么我们看下执行的sql打印内容和顺序,借用Restore sql 插件


image.png

我们发现实际上在mybatis层面,也是分次执行的,如果追求极致的效率,那和把这工作放在代码中处理,
我认为性能差不多。
那么优势主要还是体现在代码的复用程度。
三、最后
还是那句话,如果业务高度内聚,那么可以考虑用mybatis写一个完整的主信息查询。如果业务还能拆分,有零散组合的需求,那把每个模块抽成原子服务再代码中提供,可能是更好的选择!

你可能感兴趣的:(mybatis多层数据包含集合和对象的组装)