springboot+mybatis plus实现树形结构查询

网友投稿 1061 2022-12-26

springboot+mybatis plus实现树形结构查询

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 List childNode;

}

mybatis

mapper

public interface TreeTableMapper extends BaseMapper {

/**

* 获取树形结构数据

*

* @return 树形结构

*/

public List noteTree();

}

xml

extends="BaseResultMap">

javaType="java.util.ArrayList" select="nextNoteTree">

extends="BaseResultMap">

javaType="java.util.ArrayList" select="nextNoteTree">

javaType="java.util.ArrayList" select="nextNoteTree">

id,

code,

`name`,

parent_code

select

from tree_table

where parent_code=#[code]

select

from tree_table

where parent_code='0'

noteTree :获取所有父级节点数据;

nextNoteTree:循环获取子节点数据,知道叶子节点结束;

column:关联表的列名;

ofType:返回类型

启动类

@Slf4j

@Component

public class TreeTableCommandLineRunner implements CommandLineRunner {

@Resource

private TreeTableMapper treeTableMapper;

@Override

public 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

总结

使用递归方式是比较常见的方式,优点是实现简单,直观的体现层级关系,但是数据量大的情况下效率会略低;欢迎使用其他方式的小伙伴分享自己的实现思路。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:flutter访问原生(flutter调用原生代码)
下一篇:微信小程序和手机app的比较(微信小程序与手机APP的区别)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~