springboot+mybatisplus+mysql树形结构查询springboot + mybatis plus + mysql 树形结构查询
背景
实际开发过程中经常需要查询节点树,根据指定节点获取⼦节点列表,以下记录了获取节点树的操作,以备不时之需。
使⽤场景
可以⽤于系统部门组织机构、商品分类、城市关系等带有层级关系的数据结构;
设计思路
递归模型
即根节点、枝⼲节点、叶⼦节点,数据模型如下:
id code name parent_code 110000电脑0 220000⼿机0 310001联想笔记本10000 410002惠普笔记本10000 51000101联想拯救者10001 61000102联想⼩新系列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=1DEFAULT 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<TreeTable> childNode;
}
mybatis
mapper
public interface TreeTableMapper extends BaseMapper<TreeTable>{ /**
* 获取树形结构数据
*
* @return 树形结构
*/
selective courses
public List<TreeTable>noteTree();
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sqltree.mapper.TreeTableMapper">
<resultMap id="BaseResultMap"type="ity.TreeTable">
<result column="id"property="id"/>
<result column="code"property="code"/>
<result column="name"property="name"/>
<result column="parent_code"property="parentCode"/>
</resultMap>
<resultMap id="NodeTreeResult"type="ity.TreeTable"
extends="BaseResultMap">
<collection property="childNode"column="code"ofType="ity.TreeTable"
javaType="java.util.ArrayList"select="nextNoteTree">
</collection>
</resultMap>
<sql id="Base_Column_List">
id,
code,
`name`,
smart原则计划模板parent_code
</sql>
<select id="nextNoteTree"resultMap="NodeTreeResult">
select
<include refid="Base_Column_List"/>
from tree_table
where parent_code=#{code}
</select>
<select id="noteTree"resultMap="NodeTreeResult">
select
<include refid="Base_Column_List"/>
from tree_table
where parent_code='0'
</select>
</mapper>
noteTree :获取所有⽗级节点数据;
nextNoteTree:循环获取⼦节点数据,知道叶⼦节点结束;
column:关联表的列名;
ofType:返回类型
启动类
@Slf4j
@Component
public class TreeTableCommandLineRunner implements CommandLineRunner {
@Resource
private TreeTableMapper treeTableMapper;
@Override
public void args)throws Exception {
log.Tree()));
}
数组做函数参数}
最终效果
[
{
"code":"10000",
手机mysql安装配置教程
"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需在l添加以下配置:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>学编程最低学历
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
总结
使⽤递归⽅式是⽐较常见的⽅式,优点是实现简单,直观的体现层级关系,但是数据量⼤的情况下效率会略低;欢迎使⽤其他⽅式的⼩伙伴分享⾃⼰的实现思路。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。