Java 遞迴建樹
阿新 • • 發佈:2021-01-29
文章目錄
資料庫欄位
實體類
@Data
public class Tree {
//主鍵id
private Integer id;
//選單名稱
private String name;
//父id
private Integer parentId;
//孩子集合
List<Tree> children;
}
Dao層
public interface TreeDao { List<Tree> findAll(); }
Mapper層
<?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.example.vue.dao.TreeDao"> <resultMap id="BaseResultMap" type="com.example.vue.entity.Tree"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="parent_id" property="parentId"/> </resultMap> <!-- 查詢全部/模糊查詢 --> <select id="findAll" resultMap="BaseResultMap"> select * from t_tree </select> </mapper>
Service層
//遞迴建樹
List<Tree> handleTree();
ServiceImpl層
@Service public class TreeServiceImpl implements TreeService { @Resource private TreeDao treeDao; @Override public List<Tree> handleTree() { //從資料庫獲取所有得資料 List<Tree> allTree = treeDao.findAll(); //根節點list List<Tree> treeList = new ArrayList<>(); //遍歷從資料庫取到的資料 if (allTree != null && allTree.size() > 0) { for (Tree tree : allTree) { //如果父id等於0,把資料迴圈存入根節點 if (tree.getParentId() == 0) { //存入根節點 treeList.add(tree); } } } //遍歷根節點中的資料 if (treeList != null && treeList .size() > 0) { for (Tree tree : treeList) { List<Tree> childrenList = getChildren(tree.getId(), allTree); //將獲取到的children放入children集合中 tree.setChildren(childrenList); } } return treeList; } /** * 使用遞迴獲取根節點下面的children集合 */ public List<Tree> getChildren(Integer id, List<Tree> allTree) { //children集合 List<Tree> childrenList = new ArrayList<>(); //迴圈從資料庫查詢到的資料 for (Tree tree : allTree) { //如果父id的內容和傳過來的一級選單id一致 if (tree.getParentId().equals(id)) { //存入根節點 childrenList.add(tree); } } //迴圈根節點,將根節點中的資料存入實體物件的children中 if (childrenList != null && childrenList.size() > 0) { //迴圈children集合 for (Tree tree : childrenList) { //將獲取到的children放入children集合中 tree.setChildren(getChildren(tree.getId(), allTree)); } }else { return null; } return childrenList; } }
Controller層
@RestController
@Api(tags = "遞迴建樹")
public class TreeController {
@Resource(name = "treeServiceImpl")
private TreeService treeService;
@GetMapping("tree")
public Map tree(){
Map map = new HashMap<>();
try {
List<Tree> trees = treeService.handleTree();
map.put("success", trees);
map.put("message", true);
}catch (Exception e){
e.printStackTrace();
map.put("err", false);
}
return map;
}
}
測試結果
{
"success": [
{
"id": 1,
"name": "一級選單",
"parentId": 0,
"children": [
{
"id": 2,
"name": "二級選單",
"parentId": 1,
"children": [
{
"id": 3,
"name": "三級選單",
"parentId": 2,
"children": null
}
]
}
]
}
],
"message": true
}