MyBatis collection 集合嵌套查询树形节点

java

浏览数:1,181

2019-1-7


mapper实现

  <!--
    这样的实现原理,嵌套 SQL 执行,这里就存在一个性能上的问题。比如 10 万条数据,需要执行 10 万次 SELECT 语句。所以不推荐数据量级大的树形结构。
    如果结构不经常改变,数量级还行,可以考虑加缓存。这样,读取的数据库的次数大大减少,比如省市区。
    必备3个属性:id,name,childList.
    -->
    <resultMap id="BaseTreeResultMap" type="com.soyea.dto.DeptLevelDTO">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="parent_id" property="parentId" jdbcType="INTEGER"/>
        <result column="level" property="level" jdbcType="VARCHAR"/>
        <result column="seq" property="seq" jdbcType="INTEGER"/>
        <result column="remark" property="remark" jdbcType="VARCHAR"/>
        <result column="operator" property="operator" jdbcType="VARCHAR"/>
        <result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/>
        <result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/>
        <!--
            property:JavaBean中的属性名称
            column:数据库中的字段名称,代表会拿父节点 id ,作为参数获取deptList对象
            ofType 用来区分 JavaBean 属性类型和集合包含的类型
            select 是用来执行循环哪个 SQL
        -->
        <collection column="id" property="deptList"  ofType="com.soyea.dto.DeptLevelDTO"
                    select="selectDeptChildrenById"/>
    </resultMap>

    <!-- 根据parent_id,先查出所有一级部门 -->
    <select id="queryDeptTreeList" resultMap="BaseTreeResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        from sys_dept
        where parent_id = 0;
    </select>

    <!-- 再递归查询出一级部门下的所有子部门 -->
    <select id="selectDeptChildrenById" resultMap="BaseTreeResultMap">
        select
        <include refid="Base_Column_List"/>
        from sys_dept
        where parent_id= #{id}
    </select>