Home > Java > javaTutorial > body text

How to use springboot+mybatis plus to implement tree structure query

WBOY
Release: 2023-05-21 17:01:06
forward
2510 people have browsed it

Background

In the actual development process, it is often necessary to query the node tree and obtain the child node list based on the specified node. The operation of obtaining the node tree is recorded below, in case of emergency.

Usage scenarios

Can be used for data structures with hierarchical relationships such as system department organizations, product classifications, city relationships, etc.;

Design ideas

Recursive model

That is, root node, branch node, leaf node, the data model is as follows:

##110000PC0220000手机0310001Lenovo Notebook10000410002HP Notebook1000056Implementation code
id code name parent_code
##1000101 Lenovo Savior 10001
1000102 Lenovo Xiaoxin Series 10001


Table structure

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="树形结构测试表";
Copy after login

Table data

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");
Copy after login

Entity

@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;
}
Copy after login

mybatis


mapper

public interface TreeTableMapper extends BaseMapper<TreeTable> {
    /**
     * 获取树形结构数据
     *
     * @return 树形结构
     */
    public List<TreeTable> noteTree();
}
Copy after login

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot.example.mysqltree.mapper.TreeTableMapper">
    <resultMap id="BaseResultMap" type="com.springboot.example.mysqltree.model.entity.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="com.springboot.example.mysqltree.model.entity.TreeTable"
               extends="BaseResultMap">
        <collection property="childNode" column="code" ofType="com.springboot.example.mysqltree.model.entity.TreeTable"
                    javaType="java.util.ArrayList" select="nextNoteTree">

        </collection>
    </resultMap>

    <sql id="Base_Column_List">
                id,
                code,
                `name`,
                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>
Copy after login

    noteTree: Get all parent node data;
  • nextNoteTree: loop to obtain child node data until the end of the leaf node;
  • column: the column name of the associated table;
  • ofType: Return type
  • Startup class

@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()));
    }
}
Copy after login

Final effect

[
    {
        "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
    }
]
Copy after login

Notes


If the mapper xml cannot be loaded when using mybatis, you need to add the following configuration to pom.xml:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
</resources>
Copy after login

The above is the detailed content of How to use springboot+mybatis plus to implement tree structure query. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:yisu.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template