一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
mybatis将查询结果存入多层次结构
前文
首先说一下背景,由于需要从数据库中直接查询多层次的结构,简单而言在每个工序中包含多个要素,而每个要素又包含多个作业内容。因此引申出本文的解决方案,采用一条语句查询得到实际的结果,避免多次数据库的访问。
解决方案
这里主要采用了数据库框架的一对多处理方案进行当前问题的处理。首先返回值选择采用resultMap的方式进行处理。而在每一个返回值中,又利用collection关键字进行一对多的关联处理,保证得到的结果中直接包含了下一级的关联结果。每次查询时,直接利用该关键字进行直接的关联,即可将数据直接放入下一层的接收结构中。以这种方式,可以直接将查询结果存入目标的对象,不需要进行多次查询,即便包含多层递进结构,只需要采用list即可操作。这样查询的结果只需要直接利用对象接收即可。
解决代码
简单来看一个示例代码:
<resultMap id="procedureInfo" type="xx.KbXrProcedureVO">
<result property="id" column="id"></result>
<collection property="elementInfo" ofType="xx.KbXrElementVO" javaType="java.util.ArrayList" resultMap="elementInfo" >
</collection>
</resultMap>
<resultMap id="elementInfo" type="xx.KbXrElementVO">
<result property="elementId" column="element_id"></result>
<association property="videoInfo" column="video_info" resultMap="videoInfo"></association>
<collection property="imageInfo" javaType="java.util.List" ofType="xx.KbFileInfoDTO" resultMap="imageInfo">
</collection>
<collection property="jobList" javaType="java.util.List" ofType="xx.KbXrJobVO" resultMap="jobList">
</collection>
</resultMap>
<resultMap id="videoInfo" type="xx.KbFileInfoDTO">
<result property="fileUrl" column="video_url"></result>
</resultMap>
<resultMap id="imageInfo" type="xx.KbFileInfoDTO">
<result property="fileUrl" column="img_url"></result>
</resultMap>
<resultMap id="jobList" type="xx.KbXrJobVO">
<result property="jobId" column="job_id"></result>
</resultMap>
<select id="getImportedProcedureList" resultMap="procedureInfo">
select
kp.id,
elementInfo.element_id,
elementInfo.job_id,
from @{schema}.kb_procedure kp
left join
(
select
ke.id as element_id,
kj.id as job_id,
vf.file_url as video_url,
if.file_url as img_url
from @{schema}.kb_element ke
left join @{schema}.kb_job kj
on --此处省略条件--
left join @{schema}.public_file vf
on --此处省略条件--
left join @{schema}.public_file if
on --此处省略条件--
where ke.del_flag = 0
) elementInfo
on --此处省略条件--
分析一下该查询语句内容,主要有三层,分别是工序、要素、作业内容三级结构,每级结构之间均为列表方式的关联。也就是工序中有多个要素列表,要素中有多个作业内容列表。同时要素中还有多个图片列表以及一个视频信息。因此采用上述方式,利用resultMap的数据结构进行处理,直接在对象中获得目标结果。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。