Mybatis+Mysql 实现树形结构查询

2023-11-17


Mybatis <collection 实现树形结构>该实现使用的是SpringBoot 其实用Spring也是差不多的只要知道Mapper怎么写就可以


直接贴代码:
1.MySql创建数据库表
CREATE TABLE `node` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(32) NOT NULL,
 `parent_id` int(11) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='节点表'
简单的节点父子关系设计,下面插入几条数据:


INSERT INTO node (name, parent_id) VALUES ('一级节点A', 0);
INSERT INTO node (name, parent_id) VALUES ('一级节点B', 0);
INSERT INTO node (name, parent_id) VALUES ('一级节点C', 0);
INSERT INTO node (name, parent_id) VALUES ('二级节点AA', 1);
INSERT INTO node (name, parent_id) VALUES ('二级节点aa', 1);
INSERT INTO node (name, parent_id) VALUES ('二级节点BB', 2);
INSERT INTO node (name, parent_id) VALUES ('三级级节点AAA', 4);
INSERT INTO node (name, parent_id) VALUES ('三级级节点aaa', 4);
INSERT INTO node (name, parent_id) VALUES ('三级级节点BBB', 6);

2.Bean:
/**
* 节点实体类
*
* Created by bysocket on 24/01/2018.
*/
public class Node {


    /**
     * 编号
     */
    private Long id;


    /**
     * 名称
     */
    private String name;


    /**
     * 下一个节点
     */
    private List<Node> next;


    public Long getId() {
        return id;
    }


    public void setId(Long id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public List<Node> getNext() {
        return next;
    }


    public void setNext(List<Node> next) {
        this.next = next;
    }
}




3.service:
/**
* 节点业务逻辑接口类
*
* Created by bysocket on 24/01/2018.
*/
public interface NodeService {


    /**
     * 获取节点树
     */
    List<Node> getNodeTree();
}


4.service实现类:
/**
* 节点业务逻辑实现类
*
* Created by bysocket on 24/01/2018.
*/
@Service
public class CityServiceImpl implements NodeService {


    @Autowired
    private NodeDao nodeDao;


    @Override
    public List<Node> getNodeTree() {
        return nodeDao.getNodeTree();
    }
}


5.Dao层:
/**
* 节点 DAO 接口类
*
* Created by bysocket on 24/01/2018.
*/
public interface NodeDao {


    /**
     * 获取节点树
     */
    List<Node> getNodeTree();
}


6.Mapper:
<?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="org.mybatis.dao.NodeDao">
 <resultMap id="BaseTreeResultMap" type="org.mybatis.domain.Node">
<result column="id" property="id"/>
<result column="name" property="name"/>
<collection column="id" property="next" javaType="java.util.ArrayList"
ofType="org.mybatis.domain.Node" select="getNextNodeTree"/>
 </resultMap>


 <resultMap id="NextTreeResultMap" type="org.mybatis.domain.Node">
<result column="id" property="id"/>
<result column="name" property="name"/>
<collection column="id" property="next" javaType="java.util.ArrayList"
ofType="org.mybatis.domain.Node" select="getNextNodeTree"/>
 </resultMap>


 <sql id="Base_Column_List">
id, name
</sql>


 <select id="getNextNodeTree" resultMap="NextTreeResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM node
WHERE parent_id = #{id}
 </select>


 <select id="getNodeTree" resultMap="BaseTreeResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM node
WHERE parent_id = 0
 </select>


</mapper>


7.controller:

/**
* 节点业务控制成类
*
* Created by bysocket on 24/01/2018.
*/
@RestController
public class NodeRestController {


    @Autowired
    private NodeService nodeService;


    @GetMapping(value = "/node/tree")
    public List<Node> getNodeTree() {
        return nodeService.getNodeTree();
    }

    //附加一个递归的获取树节点

    

    public List<Node> getTree(){
//        int i = 0;
        List<Node> list = nodeService.getNodeTree();
//        首次循环获取母节点
        for(Node node: list){
            System.out.println("start"+node.getName());
            getList(node.getNext());
        }

        return list;
    }
    public void getList(List<Node> list){

        Node nd = new Node();
        if(list != null){
            if(list.size()>0){
                for(Node node : list){
//                    i++;
                    System.out.println(node.getName());
                    nd.setId(node.getId());
                    nd.setName(node.getName());
                    //递归获取下一个子节点
                    getList(node.getNext());
                }
            } else{
//                i = 0;
//                System.out.println("枝干结束"+i);
            }
        } else{
//            i = 0;
        }
    }


}




试起来吧!
文本摘自:https://www.bysocket.com/?p=2008
工程代码:https://github.com/JeffLi1993/myabtis-learning-example



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis+Mysql 实现树形结构查询 的相关文章

  • Errno 121,写入或更新时出现重复密钥?

    SET OLD UNIQUE CHECKS UNIQUE CHECKS UNIQUE CHECKS 0 SET OLD FOREIGN KEY CHECKS FOREIGN KEY CHECKS FOREIGN KEY CHECKS 0 S
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 数据读取过程中遇到致命错误

    我正在进行定期更新表扫描 Using connect1 As New MySqlConnection ConnectLocalhost serverString connect1 Open Dim cmd New MySqlCommand
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • 如何使用 SQL 对项目进行排序,然后按另一个条件再次排序

    我正在使用 MySQL 我想对记录进行排序 或者我想对记录进行分组 然后按另一个条件再次对其进行排序 例如我有 6 个项目 Names Group Jack G1 Dian G2 Emily G2 Dean G1 Teddy G2 Gabe
  • 性能:cakephp-mysql 中的 UUID 与自动递增

    我正在搜索 cakePHP 生成的 UUID 32 个字符长 是否比自动增量在性能上更快 插入和选择操作的比较 我应该使用 cakePHP 生成的 UUID 还是使用 MySQL 的简单自动增量生成的 UUID 这是我发现的一个案例研究 但
  • PDO获取最后插入的ID

    我有一个查询 我想获取插入的最后一个 ID 字段ID是主键并且自动递增 我知道我必须使用这个声明 LAST INSERT ID 该语句适用于如下查询 query INSERT INTO cell place ID VALUES LAST I
  • 如何使用Python3.4在tornado中进行异步mysql操作?

    我现在使用Python3 4 我想在Tornado中使用异步mysql客户端 我已经发现torndb https github com bdarnell torndb但在阅读其源代码后 我认为它无法进行异步mysql操作 因为它只是封装了M
  • 在 SQL 中如何获得整数的最大值?

    我试图从 MySQL 数据库中找出整数 有符号或无符号 的最大值 有没有办法从数据库本身提取这些信息 是否有我可以使用的内置常量或函数 标准 SQL 或 MySQL 特定的 At http dev mysql com doc refman
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • PHP-MySQLi 连接随机失败并显示“无法分配请求的地址”

    大约两周以来 我一直在处理 LAMP 堆栈中最奇怪的问题之一 长话短说 与 MySQL 服务器的随机连接失败并显示错误消息 Warning mysqli real connect HY000 2002 Cannot assign reque
  • mysql时间比较

    我有 job start 和 job end 时间 timediff 会给我时间差 现在我想看看这项工作是否花费了超过 2 小时 30 分钟 我如何比较它 如果我这样做 我会收到错误 timediff job start job end g
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • 如何删除MySQL中的所有事件

    如果我想删除某个事件 我需要查询类似的内容 DROP EVENT IF EXISTS eventname 但我找不到一次性删除所有事件的命令 必须一项一项地删除 有没有一次性删除所有事件的SQL DROP EVENT IF EXISTS S
  • 批处理文件并与数据库比较

    目前我正在开发一个 Spring Boot 应用程序 该应用程序定期尝试处理包含用户数据的文件 其中每行都包含userId and departamentId隔开 例如123534 13 该文件将包含数百万条记录 我的要求是以这样的方式将此
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • 错误 1305 (42000):保存点...不存在

    我的 MYSQL 数据库中有这个 SQL 存储过程为空 所以我猜没有隐式提交 DROP PROCEDURE IF EXISTS doOrder DELIMITER CREATE PROCEDURE doOrder IN orderUUID
  • mysql 查询选择当月的所有行?

    我有一个名为 startdate 的日期时间类型的列 我必须获取当前月份的开始日期和结束日期之间的所有行 即从 1 11 2014 到 30 11 2014 select from your table where year curdate

随机推荐

  • python实现新闻网站_如何利用 Python 爬虫实现给微信群发新闻早报?(详细)

    1 场景 经常有小伙伴在交流群问我 每天的早报新闻是怎么获取的 其实 早期使用的方案 是利用爬虫获取到一些新闻网站的标题 然后做了一些简单的数据清洗 最后利用 itchat 发送到指定的社群中 由于爬虫面对 网站改版的不稳定性及 itcha
  • 全额限定名

    全额限定名说白了就是路径名 全额限定名 java lang String class文件中就是 java lang String pathname2classname classname2pathname
  • java 异常 理解_java异常理解(1)

    JAVA异常处理机制 1引子 try catch finally恐怕是大家再熟悉不过的语句了 而且感觉用起来也是很简单 逻辑上似乎也是很容易理解 不过 我亲自体验的 教训 告诉我 这个东西可不是想象中的那么简单 听话 不信 那你看看下面的代
  • 光流估计(对视频处理+python实现+原理+实验报告)

    资源 光流估计 对视频处理 python实现 原理 实验报告 实现效果 相关原理 光流是空间运动物体在观测成像平面上的像素运动的 瞬时速度 根据各个像素点的速度矢量特征 可以对图像进行动态分析 例如目标跟踪 亮度恒定 同一点随苕时间的变化
  • 植被物候参数遥感研究进展(好文分享)

    在气候变化背景下 植被物候作为生态系统对环境变化响应的直接体现方式 日益受到学界关注 获取长期 连续 多尺度的植被物候数据是物候研究的基础 而利用卫星遥感手段获取的物候参数已经成为陆地生态系统变化研究的重要指标 遥感物候参数在农业生产管理
  • 530 Please login with USER and PASS.

    安装 npm install save hexo deployer ftpsync 配置 deploy type ftpsync host xx xx xx xx user bxu123123 pass xx11123 remote htd
  • C++ RSA加解密

    原文链接 https blog csdn net u011029517 article details 79392522 之前需要用到RSA加解密的时候花费了我不少的时间 网上有很多RSA加解密的文章 但大多数都是从文件读取公钥或者私钥的
  • 字节跳动五面都过了,结果被刷了,问了hr原因竟说是...

    摘要 说在前面 面试时最好不要虚报工资 本来字节跳动是很想去的 几轮面试也通过了 最后没offer 自己只想到几个原因 1 虚报工资 比实际高30 2 有更好的人选 这个可能性不大 我看还在招聘 我是面试Android开发的 3年经验 下面
  • linux clamav 免费查毒工具

    linux下需要杀毒工具吗 我一直认为是不要的 基于linux的病毒很少 linux 安全防护也做的很好 一般很难功破 我想那些 们更喜欢 写windows下的病毒 用的人多啊 传播也容易 下面的操作 都是以管理员的身份来进行的 一 安装c
  • Java各种系统架构图及其简介

    1 spring架构图 Spring是一个开源框架 是为了解决企业应用程序开发复杂性而创建的 框架的主要优势之一就是其分层架构 分层架构允许您选择使用哪一个组件 同时为J2EE应用程序开发提供集成的框架 Spring框架的功能可以用在任何J
  • 使用Xshell7控制多台服务同时安装ZK最新版集群服务

    一 环境准备 主机名称 主机IP 节点 集群内通讯端口 选举leader clinet端提供服务 端口 docker0 192 168 1 100 node 0 2888 3888 2181 docker1 192 168 1 101 no
  • 61.(前端)权限管理实现——从数据库中获取数据展示在前端,使用插槽和Tag标签美化数据展示

    1 概述 本次内容 主要是对用户权限列表进行展示 2 基本流程 在component文件夹下创建power文件夹 并在power文件夹下创建Menu vue 在Menu vue任意编写显示内容 用于测试 去router index js挂载
  • 解决Scrapy使用pipline保存到数据库后返回None

    这也不算报错哈 解决方法 在process item处理完成后返回item即可 return item 案例分析 比如下面的pipeline class MyPipeline object def init self host 127 0
  • Flask 实现文件上传和下载(简单但实用)

    目录结构和代码 root master w upload ll total 4 0K drwxr xr x 3 root root 21 Jul 2 17 32 static drwxr xr x 2 root root 25 Jul 5
  • Android在EditText中只能输入中文或者指定类型的内容

    之前做过一个需求 在EditText中只能输入中文或者英文字符不能输入特殊字符和数字等一些其他内容 查阅了一些资料 需要重写一下EditText中的相关方法就可以完成该功能 总结一下 方便之后使用 看一下效果图 可以看到在EditText中
  • Redis系列之二:Redis基础知识

    引言 正所谓万丈高楼平地起 学习一项技术都需要从其基础知识开始 上一篇介绍了Redis在Linux环境下的安装步骤 本文主要介绍了Redis的基础知识 包括数据结构以及常用命令等 废话不多说 我们直接开始吧 Redis基础数据结构 Redi
  • GPT-4 的创造力全方位持平或碾压人类

    文章目录 一 前言 二 主要内容 三 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 最近 一项有关 GPT 4 的创造力思维测试火了 来自蒙大拿大学和 UM Western 大学的研究团队发现
  • 工作——自动化测试中用到的SQL server查询语句的格式调整

    SELECT CONVERT VARCHAR 100 GETDATE 0 05 16 2006 10 57AM SELECT CONVERT VARCHAR 100 GETDATE 1 05 16 06 SELECT CONVERT VAR
  • 深入理解sed模式空间——sed ‘n;p‘

    在进入正题之前我们先来了解一下sed的模式空间 如下 什么是sed的模式空间 答 仅供参考 就是从文件读取一行文本然后存入的缓冲区 然后命令操作模式空间的内容 在初始状态下模式空间是没有内容的 在每次循环读取数据的过程中 模式空间都会被清空
  • Mybatis+Mysql 实现树形结构查询

    Mybatis