springboot+mybatis|springboot+mybatis plus实现树形结构查询
目录
- 背景
- 使用场景
- 设计思路
- 递归模型
- 实现代码
- 注意事项
- 总结
背景
实际开发过程中经常需要查询节点树,根据指定节点获取子节点列表,以下记录了获取节点树的操作,以备不时之需。
使用场景
可以用于系统部门组织机构、商品分类、城市关系等带有层级关系的数据结构;
设计思路
递归模型
即根节点、枝干节点、叶子节点,数据模型如下:
id | code | name | parent_code |
---|---|---|---|
1 | 10000 | 电脑 | 0 |
2 | 20000 | 手机 | 0 |
3 | 10001 | 联想笔记本 | 10000 |
4 | 10002 | 惠普笔记本 | 10000 |
5 | 1000101 | 联想拯救者 | 10001 |
6 | 1000102 | 联想小新系列 | 10001 |
实现代码
表结构
CREATE TABLE `tree_table` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',`code` varchar(10) NOT NULL COMMENT '编码',`name` varchar(20) NOT NULL COMMENT '名称',`parent_code` varchar(10)NOT NULL COMMENT '父级编码',PRIMARY KEY (`id`) USING BTREE) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='树形结构测试表';
表数据
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10000', '电脑', '0'); INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10001', '联想笔记本', '10000'); INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10002', '惠普笔记本', '10000'); INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000101', '联想拯救者', '10001'); INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000102', '联想小新系列', '10001');
实体
@Data@TableName("tree_table")@EqualsAndHashCode(callSuper = false)@Accessors(chain = true)public class TreeTable {?/*** 主键ID*/@TableId(type = IdType.AUTO)private Integer id; /*** 编码*/private String code; /*** 名称*/private String name; /*** 父级编码*/private String parentCode; ?/*** 子节点*/@TableField(exist = false)private ListchildNode; }
mybatis
mapper
public interface TreeTableMapper extends BaseMapper{/*** 获取树形结构数据** @return 树形结构*/public List noteTree(); }
xml
?id,code,`name`,parent_codeselect ? from tree_tablewhere parent_code=#[code]select from tree_tablewhere parent_code='0'
- noteTree :获取所有父级节点数据;
- nextNoteTree:循环获取子节点数据,知道叶子节点结束;
- column:关联表的列名;
- ofType:返回类型
@Slf4j@Componentpublic class TreeTableCommandLineRunner implements CommandLineRunner {@Resourceprivate TreeTableMapper treeTableMapper; ?@Overridepublic void run(String... args) throws Exception {log.info(JSONUtil.toJsonPrettyStr(treeTableMapper.noteTree())); }}
最终效果
[{"code": "10000","childNode": [{"code": "10001","childNode": [{"code": "1000101","childNode": [],"parentCode": "10001","name": "联想拯救者","id": 5},{"code": "1000102","childNode": [],"parentCode": "10001","name": "联想小新系列","id": 6}],"parentCode": "10000","name": "联想笔记本","id": 3},{"code": "10002","childNode": [],"parentCode": "10000","name": "惠普笔记本","id": 4}],"parentCode": "0","name": "电脑","id": 1}]
注意事项
使用mybatis时如加载不到mapper xml需在pom.xml添加以下配置:
src/main/resources true src/main/java **/*.xml
总结
使用递归方式是比较常见的方式,优点是实现简单,直观的体现层级关系,但是数据量大的情况下效率会略低;欢迎使用其他方式的小伙伴分享自己的实现思路。
到此这篇关于springboot+mybatis plus实现树形结构查询的文章就介绍到这了,更多相关springboot 树形结构查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树