- iadmin-common:常用基础依赖,引入常用的工具包
- iadmin-core:mybatisplus核心依赖,引代码生成器
<dependency>
<groupId>com.github.xs0529</groupId>
<artifactId>iadmin-core</artifactId>
<version>1.0.1</version>
</dependency>
tree父类:
@Data
public class Tree{
private Number id;
private Number pid;
private Collection childs;
}
生成树的工厂类
/**
* 树工厂类,用于生成树
* @author xieshuang
* @date 2019-08-08 10:43
*/
public class TreeFactory<T extends Tree>{
public Collection<T> createTree(Collection<T> treeNodes){
Collection<T> treeNodeList = new ArrayList<>();
for (T treeNode : treeNodes) {
if (treeNode.getPid()==null || treeNode.getPid().equals(0) || treeNode.getPid().equals(0L)){
treeNodeList.add(addChildNode(treeNode, treeNodes));
}
}
return treeNodeList;
}
private T addChildNode(T treeNode, Collection<T> treeNodes){
List<T> treeNodeList = new ArrayList<>();
for (T node : treeNodes) {
if (node.getPid()!=null && node.getPid().equals(treeNode.getId())){
treeNodeList.add(addChildNode(node, treeNodes));
}
}
treeNode.setChilds(treeNodeList);
return treeNode;
}
}
实际场景中用到的树对象
@Data
public class MyTree extends Tree {
private String name;
}
测试
public class test{
public static void main(String[] args) {
System.out.println("1111111111111111111111");
List<MyTree> trees = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
MyTree myTree = new MyTree();
myTree.setName("顶级"+i);
myTree.setId(i);
myTree.setPid(0);
trees.add(myTree);
for (int j = 11; j <100 ; j++) {
MyTree myTree1 = new MyTree();
myTree1.setName("子级"+j);
myTree1.setId(j);
myTree1.setPid(i);
trees.add(myTree1);
}
}
System.out.println(trees);
System.out.println("222222222222222222222");
Collection<MyTree> tree = new TreeFactory<MyTree>().createTree(trees);
System.out.println(JSONObject.toJSONString(tree));
System.out.println("3333333333333333333333333");
}
}
说明:
1.我们要生成的树的对象继承Tree对象即可。
2.需要排序的话在调用生成树方法之前对传入的集合进行排序即可。
3.生成树的数据量建议在1万条左右,否则会很慢,超级慢。经测试,1万数据量生成在1S左右,10万已经半天跑不出来了。大数据量请做懒加载,逐级获取数据。
说明:mybatisplus封装了良好的单表查询方法,但是在使用过程中还是要构造查询条件类,而且查询条件多的话会比较繁琐,所以单独写了一个wrapper生成工具,根据传入dto字段上的注解生成查询条件
工具类与注解位于 xyz.iotcode.iadmin.core.wrapper 包下,有兴趣的可以查看代码,实现方式比较简单。
使用方式:
dto 类字段上增加@QueryCondition注解,默认构造==条件,目前还支持like,in,大于,小于这几个常用条件注解
@ApiModelProperty(value = "菜单id")
@QueryCondition
private Long menuId;
service层使用方式
@Override
public IPage<Menu> ipage(MenuQuery query) {
return this.page(query.createPage(), new WrapperFactory<Menu>().create(query));
}
此wrapper工具比较简单,但是基本满足日常使用,后续增加更多条件。
基于mybatisplus的代码生成器,改写自己的生成模板,目前支持生成后端crud代码,生成的代码包含:==service层缓存注解(可配置)==,==entity 参数校验注解(JSR303,可配置)==
使用方式:复制 MybatisPlusGenerator 到项目里,保证与Application启动器同级目录,更改生成方法里的配置(数据库,生成选项等),即可生成代码