实现效果:
数据库设计:
模拟数据展示:把superior设置成父节点的id,如果没有父级id直接给定固定值,例如:0
MyBatis查询:
<!--找下级-->
<select id="getchildren" resultType="com.speedchina.ch.gcxm.server.domain.base.PageData" parameterType="String">
select id,name,short,cycle,instructions from jdjdxx where superior = #{supID} order by number
</select>
Servic层递归查询:第一次调用时直接传个0,也就是一级列表的superior字段,查到后循环自己调用自己,用查到的父级id去替换成superior,
再次查询,直到递归查询结束
@Override
public PageData getMenu(String supID) {
//查询所有当前节点
List<PageData> children = progressNodeMapper.getchildren(supID);
if (ListUtiles.isNotEmpty(children)) {
for (PageData child : children) {
//当前节点id为supID
PageData pd = getMenu(child.getString("id"));
child.put("children",pd.get("data"));
}
}
pageDataResult = GetResult.selectSuccess();
pageDataResult.put("data",children);
return pageDataResult;
}
带分页的级联查询(只做到按最上级的分页):可以显示级联列表详情
@Override
public PageData getMenuList(String supID, Integer pageSize, Integer pageNum) {
PageHelper.startPage(pageNum,pageSize);
//查询所有当前节点
List<PageData> children = progressNodeMapper.getchildren(supID);
PageInfo<PageData> PageInfo = new PageInfo<>(children);
//对数据进行判空
if (ListUtiles.isNotEmpty(PageInfo.getList())) {
//放入查询结果
for (PageData child : PageInfo.getList()) {
//当前节点id为supID 这里再调用自己会对子级列表再次分页,调用上面的无分页的递归
PageData pd = getMenu(child.getString("id"));
child.put("children",pd.get("data"));
}
}
pageDataResult = GetResult.selectSuccess();
pageDataResult.put("data",PageInfo);
return pageDataResult;
}