最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot+mybatis plus實(shí)現(xiàn)樹形結(jié)構(gòu)查詢

 更新時(shí)間:2021年07月21日 16:18:55   作者:Leaf1993  
實(shí)際開發(fā)過程中經(jīng)常需要查詢節(jié)點(diǎn)樹,根據(jù)指定節(jié)點(diǎn)獲取子節(jié)點(diǎn)列表,本文主要介紹了springboot+mybatis plus實(shí)現(xiàn)樹形結(jié)構(gòu)查詢,感興趣的可以了解一下

背景

實(shí)際開發(fā)過程中經(jīng)常需要查詢節(jié)點(diǎn)樹,根據(jù)指定節(jié)點(diǎn)獲取子節(jié)點(diǎn)列表,以下記錄了獲取節(jié)點(diǎn)樹的操作,以備不時(shí)之需。

使用場景

可以用于系統(tǒng)部門組織機(jī)構(gòu)、商品分類、城市關(guān)系等帶有層級(jí)關(guān)系的數(shù)據(jù)結(jié)構(gòu);

設(shè)計(jì)思路

遞歸模型

即根節(jié)點(diǎn)、枝干節(jié)點(diǎn)、葉子節(jié)點(diǎn),數(shù)據(jù)模型如下:

id code name parent_code
1 10000 電腦 0
2 20000 手機(jī) 0
3 10001 聯(lián)想筆記本 10000
4 10002 惠普筆記本 10000
5 1000101 聯(lián)想拯救者 10001
6 1000102 聯(lián)想小新系列 10001

實(shí)現(xiàn)代碼

表結(jié)構(gòu)

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 '父級(jí)編碼',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='樹形結(jié)構(gòu)測試表';

表數(shù)據(jù)

INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10000', '電腦', '0');
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10001', '聯(lián)想筆記本', '10000');
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('10002', '惠普筆記本', '10000');
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000101', '聯(lián)想拯救者', '10001');
INSERT INTO `tree_table`(`code`, `name`, `parent_code`) VALUES ('1000102', '聯(lián)想小新系列', '10001');

實(shí)體

@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;
    /**
     * 父級(jí)編碼
     */
    private String parentCode;
​
    /**
     * 子節(jié)點(diǎn)
     */
    @TableField(exist = false)
    private List<TreeTable> childNode;
}

mybatis

mapper

public interface TreeTableMapper extends BaseMapper<TreeTable> {
    /**
     * 獲取樹形結(jié)構(gòu)數(shù)據(jù)
     *
     * @return 樹形結(jié)構(gòu)
     */
    public List<TreeTable> noteTree();
}

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>
  • noteTree :獲取所有父級(jí)節(jié)點(diǎn)數(shù)據(jù);
  • nextNoteTree:循環(huán)獲取子節(jié)點(diǎn)數(shù)據(jù),知道葉子節(jié)點(diǎn)結(jié)束;
  • column:關(guān)聯(lián)表的列名;
  • ofType:返回類型

啟動(dòng)類

@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": "聯(lián)想拯救者",
                        "id": 5
                    },
                    {
                        "code": "1000102",
                        "childNode": [
                        ],
                        "parentCode": "10001",
                        "name": "聯(lián)想小新系列",
                        "id": 6
                    }
                ],
                "parentCode": "10000",
                "name": "聯(lián)想筆記本",
                "id": 3
            },
            {
                "code": "10002",
                "childNode": [
                ],
                "parentCode": "10000",
                "name": "惠普筆記本",
                "id": 4
            }
        ],
        "parentCode": "0",
        "name": "電腦",
        "id": 1
    }
]

注意事項(xiàng)

使用mybatis時(shí)如加載不到mapper xml需在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>

總結(jié)

使用遞歸方式是比較常見的方式,優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,直觀的體現(xiàn)層級(jí)關(guān)系,但是數(shù)據(jù)量大的情況下效率會(huì)略低;歡迎使用其他方式的小伙伴分享自己的實(shí)現(xiàn)思路。

到此這篇關(guān)于springboot+mybatis plus實(shí)現(xiàn)樹形結(jié)構(gòu)查詢的文章就介紹到這了,更多相關(guān)springboot 樹形結(jié)構(gòu)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis?plus常用注解的具體使用

    mybatis?plus常用注解的具體使用

    本文主要介紹了mybatis?plus常用注解的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java背包問題動(dòng)態(tài)規(guī)劃算法分析

    java背包問題動(dòng)態(tài)規(guī)劃算法分析

    這篇文章主要介紹了java背包問題動(dòng)態(tài)規(guī)劃算法分析,想了解算法的同學(xué)一定要看一下
    2021-04-04
  • java線程之死鎖

    java線程之死鎖

    這篇文章主要介紹了Java線程之死鎖,死鎖是這樣一種情形-多個(gè)線程同時(shí)被阻塞,它們中的一個(gè)或者全部都在等待某個(gè)資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止
    2022-05-05
  • springboot訪問template下的html頁面的實(shí)現(xiàn)配置

    springboot訪問template下的html頁面的實(shí)現(xiàn)配置

    這篇文章主要介紹了springboot訪問template下的html頁面的實(shí)現(xiàn)配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java分頁查詢的幾種實(shí)現(xiàn)方法舉例

    Java分頁查詢的幾種實(shí)現(xiàn)方法舉例

    這篇文章主要給大家介紹了關(guān)于Java分頁查詢的幾種實(shí)現(xiàn)方法,分頁是系統(tǒng)中常用到的功能,只要涉及到查詢必定伴隨而來的就是分頁,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 一文詳解Java線程中的安全策略

    一文詳解Java線程中的安全策略

    Java中的線程到底有哪些安全策略呢?這篇文章將詳細(xì)為大家分析一下。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-05-05
  • JavaWeb簡單文件上傳流程的實(shí)戰(zhàn)記錄

    JavaWeb簡單文件上傳流程的實(shí)戰(zhàn)記錄

    在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳和下載功能是非常常用的功能,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實(shí)現(xiàn)簡單文件上傳流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Java代碼簡化工具Lombok的使用詳解

    Java代碼簡化工具Lombok的使用詳解

    這篇文章主要介紹了Java代碼簡化工具Lombok的使用,Lombok是一個(gè)Java庫,它通過注解的方式自動(dòng)插入編輯器和構(gòu)建工具中,從而簡化Java代碼的編寫,需要的朋友可以參考下
    2025-05-05
  • SpringValidation自定義注解及分組校驗(yàn)功能詳解

    SpringValidation自定義注解及分組校驗(yàn)功能詳解

    這篇文章主要介紹了SpringValidation自定義注解及分組校驗(yàn)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • SpringSecurity如何實(shí)現(xiàn)配置單個(gè)HttpSecurity

    SpringSecurity如何實(shí)現(xiàn)配置單個(gè)HttpSecurity

    這篇文章主要介紹了SpringSecurity如何實(shí)現(xiàn)配置單個(gè)HttpSecurity,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

绥棱县| 新密市| 孝义市| 高邑县| 广安市| 宣武区| 馆陶县| 菏泽市| 巴东县| 登封市| 拜泉县| 新河县| 永胜县| 怀化市| 平和县| 庆元县| 密云县| 嘉祥县| 岗巴县| 黄陵县| 绥宁县| 白玉县| 张家川| 五大连池市| 关岭| 信丰县| 和龙市| 西乌| 钟山县| 镇宁| 静安区| 怀远县| 海安县| 墨脱县| 全州县| 龙州县| 嘉禾县| 吉安市| 郎溪县| 民丰县| 泾源县|