美文网首页
单表联查生成树状数据

单表联查生成树状数据

作者: dwwl | 来源:发表于2019-04-23 15:49 被阅读0次

    pageHelper:

    配置及简单原理

    <https://www.cnblogs.com/billmiao/p/9872158.html

    单表联查生成树结构

    caategory表

    -- auto-generated definition
    create table category
    (
        id       varchar(32) not null comment '主键'
            primary key,
        name     varchar(32) not null comment '分类名称',
        label    varchar(32) null comment '分类标签默认和名称一样',
        parentid varchar(32) null comment '父结点id',
        isshow   char        null comment '是否显示',
        orderby  int(4)      null comment '排序字段',
        isleaf   char        null comment '是否叶子'
    );
    

    前台所需的数据结构:

    {
              id: 1,
              label: '一级 1',
              children: [{
                id: 4,
                label: '二级 1-1',
                children: [{
                  id: 9,
                  label: '三级 1-1-1'
                }, {
                  id: 10,
                  label: '三级 1-1-2'
                }]
              }]
            }, {
              id: 2,
              label: '一级 2',
              children: [{
                id: 5,
                label: '二级 2-1'
              }, {
                id: 6,
                label: '二级 2-2'
              }]
            },
    

    结合实际考虑,需要采用左外链接,因为假如某个二级节点下没有子节点,采用内连接的话,这样的二级节点会丢失,看实际需要吧

    查询方案:

    封装类:

    package com.xuecheng.framework.domain.course.ext;
    
    import lombok.Data;
    import lombok.ToString;
    
    import java.util.List;
    
    /**
     * Created by admin on 2018/2/7.
     */
    @Data
    @ToString
    public class CategoryNode {
        String id;
        String label;
        List<CategoryNode> children;
    
    }
    

    持久层:CategoryMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.xuecheng.manager_course.dao.CategoryMapper">
        <resultMap id="categoryMap" type="com.xuecheng.framework.domain.course.ext.CategoryNode">
            <id column="c1_id" property="id"/>
            <result column="c1_label" property="label"/>
            <collection property="children" ofType="com.xuecheng.framework.domain.course.ext.CategoryNode">
                <id column="c2_id" property="id"/>
                <result column="c2_label" property="label"/>
            <collection property="children" ofType="com.xuecheng.framework.domain.course.ext.CategoryNode">
                <id column="c3_id" property="id"/>
                <result column="c3_label" property="label"/>
            </collection>
            </collection>
        </resultMap>
        <select id="findCategories" resultMap="categoryMap">
            select c1.id c1_id,c1.label c1_label,
                   c2.id c2_id,c2.label c2_label,
                   c3.id c3_id,c3.label c3_label
            from category c1
                     left join category c2 on c1.id = c2.parentid
                     left join category c3 on c2.id = c3.parentid where c1.id = #{categoryId};
        </select>
    </mapper>
    

    dao:

    @Mapper
    public interface TeachplanMapper {
        List<TeachplanNode> findPlanTree(String courseId);
    }
    
    

    注意外连接时 on 和 where的区别

    1、``on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left` `join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    select *
    from teachplan p1
             left join teachplan p2
                       on p1.parentid = 0;//不管``on``中的条件是否为真,都会返回左边表中的记录。
    

    相关文章

      网友评论

          本文标题:单表联查生成树状数据

          本文链接:https://www.haomeiwen.com/subject/ydivgqtx.html