作者:用户x735b8j5iu | 来源:互联网 | 2023-09-01 12:48
上一篇文章里说到使用递归查询多级树形结构数据,后来我想了一下,对于一直循环访问数据库还是不推荐,于是这篇文章对递归查询做了一些优化;既然不要循环访问数据库,那么我们就可以一次把所有数据查出来存到List
集合里,再通过递归
List把数据存到另一个List也是一个道理,下面上代码
首先依然建了一个测试菜单表:
实体类:
public class Menu {
private long ID;
private long parentid;
private String name;
private String type;
private String code;
@TableField(exist = false)
private List<Menu> childMenu;
get set方法省略...
}
childMenu是用于装子类数据的;@TableField(exist = false)
表示该属性不为数据库表字段,但是必须使用
控制层代码:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
public TestService testService;
@GetMapping("/menu")
public List<Menu> findMenu() {
return testService.findMenu();
}
}
这里我们就不需要传父类主键做参数了
业务实现层代码:
public interface TestService {
List<Menu> findMenu();
}
业务层逻辑有所改动,先将所有数据存到List,再递归遍历到另一个List中返回
@Service
public class TestServiceImpl implements TestService {
@Autowired
private BaseMapper<Menu> baseMapper;
@Override
public List<Menu> findMenu() {
List<Menu> list = baseMapper.selectList(new QueryWrapper());
List<Menu> resultList = new ArrayList<>();
for (Menu result : list) {
if (result.getParentID() == 0) {
resultList.add(getMenuTree(result, list));
}
}
return resultList;
}
private Menu getMenuTree(Menu result, List<Menu> list) {
for (Menu menu : list) {
if (menu.getParentID() == result.getID()) {
if (result.getChildMenu() == null) {
result.setChildMenu(new ArrayList<>());
}
result.getChildMenu().add(getMenuTree(menu, list));
}
}
return result;
}
}
sql语句
select id,`name`,`type`,`code`,parentID from menu where parentID = ?
测试一下
使用postman发送请求
可以看到数据也成功以多级形势返回了