mysql如何无限极查找最顶层id节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql如何无限极查找最顶层id节点相关的知识,希望对你有一定的参考价值。

参考技术A 循环,向上遍历父节点。 参考技术B 什么叫做最顶层id节点呢?

基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)

 

先从后台讲起

1.表的设计

  parent_id就是另外一条记录的id,无限极表设计可以参考  http://m.blog.csdn.net/Rookie_Or_Veteran/article/details/75711386

 

2.mysql查询很容易,关键是要把id,text,parentId查出来

<?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="bs.photo">

<
select id="queryPhoto" parameterType="com.xgt.bean.bs.PhotoBean" resultType="com.xgt.dao.entity.bs.Photo"> SELECT bp.id, bb.`name` brandName, bp.`name` text, bp.photo_url photoUrl, bp.number, bp.add_time addTime, bp.modify_time modifyTime, bp.parent_id parentId, bp.photo_number photoNumber, bp.`description`, bp.`condition`, bp.specification, bp.version_name versionName FROM bs_photo bp INNER JOIN bs_brand bb ON bp.brand_id = bb.id <include refid="sqlWhere"/> <include refid="common.Pagination_Limit"/> </select>
</mapper>
 

 3.dao层

package com.xgt.dao.bs;

import com.xgt.bean.bs.PhotoBean;
import com.xgt.dao.entity.bs.Photo;
import org.jboss.resteasy.annotations.Query;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * Created by Administrator on 2017/8/21.
 */
@Repository
public class PhotoDao {
    @Autowired
    @Qualifier("sqlSession")
    private SqlSessionTemplate sqlSession;

    public List<Photo> queryPhoto(PhotoBean photoBean){
        return sqlSession.selectList("bs.photo.queryPhoto",photoBean);
    }
}

4.service逻辑层

   关键逻辑在buildPhoto方法和getChildren方法,这里用了lamda表达式,lamda表达式可以参考我的博客:http://www.cnblogs.com/Java-Starter/p/7424229.html

package com.xgt.service.bs;

import com.xgt.bean.bs.PhotoBean;
import com.xgt.dao.bs.PhotoDao;
import com.xgt.dao.entity.bs.Brand;
import com.xgt.dao.entity.bs.Photo;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2017/8/21.
 */
@Service
public class PhotoService {
    @Autowired
    private PhotoDao photoDao;

    private List<Photo> photoList;
    public List<Photo> queryPhotoArborescence(PhotoBean photoBean){
        photoList = photoDao.queryPhoto(photoBean);
        return buildPhoto();
    }
/**
     * 构建资源数
     * @return list
     */
    public List<Photo> buildPhoto() {
        List<Photo> target = new ArrayList<>();
        if (!photoList.isEmpty()) {
            // 根元素
            photoList.stream().filter(photo -> photo.getParentId() == 0).forEach(photo -> {  // 根元素
                List<Photo> children = getChildren(photo);
                photo.setChildren(children);
                target.add(photo);
            });
        }
        return target;
    }

    private List<Photo> getChildren(Photo photo) {
        List<Photo> children = new ArrayList<>();
        if (!photoList.isEmpty()) {
            photoList.stream().filter(child -> photo.getId().equals(child.getParentId())).forEach(child -> {
                List<Photo> tmp = getChildren(child);
                child.setChildren(tmp);
                if (tmp.isEmpty()) {
                    child.setLeaf(true);
                }
                children.add(child);
            });
        }
        return children;
    }
}

5.Controller层

  没什么操作

package com.xgt.controller;

import com.xgt.bean.bs.BrandBean;
import com.xgt.bean.bs.PhotoBean;
import com.xgt.common.BaseController;
import com.xgt.common.PcsResult;
import com.xgt.dao.entity.bs.Photo;
import com.xgt.exception.EnumPcsServiceError;
import com.xgt.service.bs.PhotoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jboss.resteasy.annotations.Form;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2017/8/28.
 */
@Controller
@Path("/photo")
public class PhotoController extends BaseController{
    @Autowired
    private PhotoService photoService;

    /**
     * 遍历商品树状结构
     * @param accessToken
     * @param keyWord
     * @return
     */
    @GET
    @Path("/queryPhotoArborescence")
    @Produces(MediaType.APPLICATION_JSON)
    public PcsResult queryPhotoArborescence(@QueryParam("keyWord") String keyWord) {
        PhotoBean photoBean = new PhotoBean();
        photoBean.setKeyWord(keyWord);
        List<Photo> list = photoService.queryPhotoArborescence(photoBean);
        if(list.size()==0){
            return newResult(false);
        }
        return newResult(true).setData(list);
    }

}

前台部分

1.model层

  数据声明,便于查看有哪些数据,少一些数据不设置也可以

/**
 * Created by C on 2017/08/05.
 */
Ext.define(\'Admin.model.photoArborescence.PhotoArborescence\', {
    extend: \'Admin.model.Base\',
    idProperty: \'id\',
    fields: [
        {name: \'id\', type: \'int\'},
        {name: \'name\', type: \'string\'},
        {name: \'parentId\', type: \'int\'}
    ]
});

2.store层

  和后台连接的桥梁

/**
 * Created by Cjy on 2017/08/05.
 */
Ext.define(\'Admin.store.photoArborescence.PhotoArborescence\', {
    extend: \'Ext.data.TreeStore\',

    requires: [
        \'Common.Config\'
    ],

    storeId: \'photoArborescence.PhotoArborescence\',

    root: {
        id: 0,
        text: \'效果图\'
    },
    proxy: {
        type: \'ajax\',
        api: {
            read: Common.Config.requestPath(\'Photo\', \'queryPhotoArborescence\')
        },
        reader: {
            type: \'json\',
            rootProperty: \'data\'
        }
    }
});

3.View层

/**
 * Created by Cjy on 2017/5/23.
 */
Ext.define(\'Admin.view.photoArborescence.PhotoArborescence\', {
    extend: \'Ext.container.Container\',

    xtype: \'photoArborescence\',

    requires: [
        \'Ext.tree.Panel\',
        \'Admin.view.photoArborescence.PhotoArborescenceController\'
    ],

    controller: \'photoArborescence\',

    layout: \'fit\',

    listeners: {
        beforerender: \'pictureBeforeRender\'
    },

    defaults: {
        height: \'100%\'
    },
    autoHeight : true,// 自动高度,默认false
    animate : true,// 展开动画
    enableDrag : true,// 是否可以拖动(效果上)
    enableDD : true,// 不进可以拖动,还可以改变节点层次结构
    enableDrop : false,// 仅仅drop
    rootVisible : true,// 是否显示根节点,默认true
    height : 150,

    items: [{
        title: \'自主报价管理\',
        xtype: \'treepanel\',
        reference: \'photoTree\',
        valueField: \'name\',
        useArrows: true,
        autoScroll:true,
        height:1150,
        store: \'photoArborescence.PhotoArborescence\'
    }]
});

4.Controller层

  js动作,执行前加载

/**
 * Created by Cjy on 2017/5/23.
 */
Ext.define(\'Admin.view.photoArborescence.PhotoArborescenceController\', {
    extend: \'Admin.view.BaseViewController\',
    alias: \'controller.photoArborescence\',


    /**
     * 界面 渲染的时候加载 菜单 tree
     */
    pictureBeforeRender: function () {
        var store = this.lookupReference(\'photoTree\').getStore();
        console.log(store);
        store.getRoot().set(\'expanded\', true);
        store.load();
    }

});

 

结果

 

以上是关于mysql如何无限极查找最顶层id节点的主要内容,如果未能解决你的问题,请参考以下文章

php如何查找会员无限分类的所有上级和所有下级

无限极分类中递归查找一个树结构

无限极分类

thinkphp5.0无限极分类及格式化输出

关于PHP无限极分类

基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)