树的查询
介绍
我们在做权限管理时,大多都会用到树的查询
在进行查询我们需要进行递归查询,在查询时有很多方法,我最喜欢用的是把集合转换成流去处理(主要是代码少),下面是测试代码
这是返回数据DTO
public class UserFuncDTO {
//主键id
private Integer funcModuleId;
//权限名
private String name;
//父id
private Integer parentId;
//存下级数据
List<UserFuncDTO> list;
public List<UserFuncDTO> getList() {
return list;
}
public void setList(List<UserFuncDTO> list) {
this.list = list;
}
public Integer getFuncModuleId() {
return funcModuleId;
}
public void setFuncModuleId(Integer funcModuleId) {
this.funcModuleId = funcModuleId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
}
测试代码
@Test
public void test() {
//调用jdbc获取所有数据
List<UserFuncDTO> dtos = jdbcUtil();
//通过流进行操作
List<UserFuncDTO> list = dtos.stream()
//过滤出一级菜单 父ID为0的
.filter(dto -> {return dto.getParentId() == 0; })
//过滤执行完毕 流中只剩下 一级分类
//给一级分类的集合属性中封装二级
. map(dto -> {
// 放入二级分类的数据
// 根据当前分类对象和所有分类数据
// 获取当前分类对象的下一级
dto.setList(getCategoryList(dto,dtos));
return dto;
})
.collect(Collectors.toList());
}
// 获取当前分类对象的下一级
private List<UserFuncDTO> getCategoryList(UserFuncDTO dto, List<UserFuncDTO> dtos) {
List<UserFuncDTO> list = dtos.stream().filter(item -> {
//返回父ID等于上个分类的 主ID
return item.getParentId() == dto.getFuncModuleId();
}).
map(item -> {
//二级对象也有下一级
item.setList(getCategoryList(item, dtos));
return item;
}).collect(Collectors.toList());
return list;
}
private List<UserFuncDTO> jdbcUtil(){
//返回数据集合
List<UserFuncDTO> dtos = new ArrayList<>();
String JDBC_DRIVER = "com.mysql.jdbc.Driver"; //org.postgresql.Driver
String DB_URL = "数据库地址";
String USER = "用户名";
String PASS = "密码";
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 执行查询
stmt = conn.createStatement();
//查询sql
String sql = "SELECT * FROM 表名";
ResultSet rs = stmt.executeQuery(sql);
// 展开结果集数据库
while (rs.next()) {
//处理查询结果
UserFuncDTO dto=new UserFuncDTO();
dto.setFuncModuleId(rs.getInt("func_module_id"));
dto.setName(rs.getString("name"));
dto.setParentId(rs.getInt("parent_id"));
dtos.add(dto);
}
// 完成后关闭
rs.close();
stmt.close();
conn.close();
} catch (SQLException se) {
// 处理 JDBC 错误
se.printStackTrace();
} catch (Exception e) {
// 处理 Class.forName 错误
e.printStackTrace();
} finally {
try {
if (stmt != null) stmt.close();
} catch (SQLException se2) {
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
}
return dtos;
}