java菜单树生成
程序员文章站
2022-04-06 16:42:53
...
java菜单树生成
方法一(多节点添加)
有时我们会用到一些菜单树返回给前端数据,生成目录结构
如何生成这样的菜单树生成给前端,接下来就是实现方法:
数据库:数据字段一定要有pid(父目录的id)
返回的实体类:要有一个子节点
public class ResVo extends Model<ResVo> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId
@ApiModelProperty(value="id")
private String id;
/**
* 类别设置
*/
@ApiModelProperty(value="类别设置")
private String categoryName;
/**
* 上级类别id
*/
@ApiModelProperty(value="上级类别id")
private String pid;
/**
* 上级分类
*/
@ApiModelProperty(value="上级分类")
private String pname;
/**
* 子节点
*/
@ApiModelProperty(value="子节点")
private List<ResVo> children;
//构造子节点
public ResVo() {
this.children = new ArrayList<>();
}
//子节点添加方法
public void addChildern(ResVo resVo){
this.children.add(resVo);
}
}
service层:就可以实现多级分类
public List<ResVo> selectAll() {
//新建一个list集合
List<ResVo> treelist = new ArrayList<>();
//从数据库查询出所有节点(这儿我演示全部查询,SQL如何查询可自定义)
List<ResVo> resVoList = resMapper.selectAll();
//判空
if (null == resVoList || resVoList .isEmpty()) {
return null;
}
//把List集合装换成Map集合
Map<String, ResVo> map = resVoList .stream().collect(Collectors.toMap(ResVo::getId, a -> a, (k1, k2) -> k1));
// 如果id是父级的话就放入tree中treelist
for (ResVo resVo : resVoList ) {
if (null == map.get(resVo.getPid())) {
treelist.add(resVo);
} else {
// 子级通过父id获取到父级的类型
ResVo parent = map.get(resVo.getPid());
// 父级获得子级,再将子级放到对应的父级中
parent.addChildern(resVo);
}
}
return treelist;
}
总结:这种方式是可以无限制添加节点,但是节点多时就会比较耗时
方法二(少节点添加)
第二种方法就是只需要mapper.xml进行修改就行了
数据库一样
返回的实体类:要有一个子节点
public class ResVo extends Model<ResVo> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId
@ApiModelProperty(value="id")
private String id;
/**
* 类别设置
*/
@ApiModelProperty(value="类别设置")
private String categoryName;
/**
* 上级类别id
*/
@ApiModelProperty(value="上级类别id")
private String pid;
/**
* 上级分类
*/
@ApiModelProperty(value="上级分类")
private String pname;
/**
* 子节点
*/
@ApiModelProperty(value="子节点")
private List<ResVo> children;
}
service层:
public List<ResVo> selectAll() {
List<ResVo> resVoList = resMapper.selectAll();
}
mapper层:
public interface ClassifySettingMapper extends BaseMapper<ClassifySetting> {
/**
* 设备分类查询全部
* @return
*/
List<ResVo> selectAll();
}
mapper.xml
<mapper namespace="com.bbibm.industry.basicsetup.mapper.ClassifySettingMapper">
<!--映射结果集-->
<resultMap id="resVoMap" type="com.XXX.ResVo">
<id column="one_id" property="id"></id>
<result column="one_category_name" property="categoryName"></result>
<result column="one_pid" property="pid"></result>
<result column="one_pname" property="pname"></result>
<collection property="children" ofType="com.XXX.ResVo">
<id column="tow_id" property="id"></id>
<result column="tow_category_name" property="categoryName"></result>
<result column="tow_pid" property="pid"></result>
<result column="tow_pname" property="pname"></result>
</collection>
</resultMap>
<select id="selectAll" resultMap="resVoMap">
SELECT
a.id one_id,
a.category_name one_category_name,
a.pid one_pid,
a.pname one_pname,
b.id tow_id,
b.category_name tow_category_name,
b.pid tow_pid,
b.pname tow_pname
FROM
bbibm_classify_setting a
LEFT JOIN bbibm_classify_setting b ON b.pid = a.id
WHERE
a.pid =0
</select>
总结:这种方法就只适合节点固定的,每连接(left join) 一张表就会多一个节点,查询快,但是不适合多节点的添加。
链接: 参考大神博客.
上一篇: 装饰器概念,有什么功能,及业务场景?
下一篇: Redis应用场景