代码如下
<resultMap id="userDeptRspResult" type="com.ruoyi.system.domain.DeptStreetRsp" extends="SysDeptResult">
<!--
childs:接收返回结果的对象中的属性名
javaType:用于接受结果的集合的类型
ofType:集合中泛型的类型
select:要调用的mapper方法
column:对应的本次返回结果中列的名称,会当成参数传到select中,此处相当于selectDeptByParentId(dept_id);
-->
<collection property="childs" javaType="java.util.ArrayList" ofType="com.ruoyi.common.core.domain.entity.SysDept"
select="com.ruoyi.system.mapper.SysDeptMapper.selectDeptByParentId" column="dept_id" />
</resultMap>
<!-- 查询父节点 -->
<select id="findUserDept" resultMap="userDeptRspResult" parameterType="string">
<include refid="selectDeptVo"/>
where dept_id = #{deptId}
and `status` = '0'
and del_flag='0'
</select>
<!-- 根据父id查询子节点 -->
<select id="selectDeptByParentId" resultMap="SysDeptResult" parameterType="string">
<include refid="selectDeptVo"/>
where parent_id = #{pid}
and `status` = '0'
and del_flag='0'
</select>
利弊分析
1、对于简单的sql而言,主要的时间消耗都在应用与数据库建立连接上,所以在写代码的时候要尽量考虑到建立网络连接消耗的时间,能一次查回来的情况下,就不要用java遍历查询。
2、就上述的mybatis写法而言,对于资源的节省并没有提升,基本上和使用java遍历调用是一样的,因为mybatis在查询的时候,查询父节点与查询子节点仍是相互独立的,仍是需要与数据库建立两次连接,只是代码编写上简单了些,方便简洁了些。
3、针对于需要查询父子节点这种需要关联节点的情况下,可以考虑使用collection的另一种写法,使用id标签作为父节点,result为子节点接受,这样便可以一次连接下,将结果都查询回来以后,再根据id和result解析到java对象中,节省了建立连接的时间。