Today's harvest !!!

简介: 今天将Mybatis的视频看到了第60集,其之前讲解了自表的主外键查询.例如一个新闻表中,有一级栏目,二级栏目,三级栏目,其中二级栏目的pid为一级栏目的id,如此种种.而今天做的小项目中使用了 easyui 这个前端框架来做后端数据的解析.

 今天将Mybatis的视频看到了第60集,其之前讲解了自表的主外键查询.
例如一个新闻表中,有一级栏目,二级栏目,三级栏目,其中二级栏目的pid为一级栏目的id,如此种种.

而今天做的小项目中使用了 easyui 这个前端框架来做后端数据的解析.

看了下SpringBoot入门以及IDEA创建SpringBoot项目.

SpringBoot又把SSM框架简化了.

MyBatis的自表分层查询很简单.

如上表, 在id 1 上是name: 娱乐新闻, 其pid为0. 表示这是第一级栏目.

之后看看pid为1的 港台明星和内地影视, 这是二级栏目. 同样 pid 为 2 的NBA和CBA是二级栏目,

三级栏目的话是它的上级还有上级,例如火箭,湖人,它们pid为3,而 id 为 3 的是NBA, NBA的pid为 2. 而2已经是最上层栏目.

(将这种分层栏目利用继承去理解更好理解,而一般网站构建中适度分层,三层就可以了.)

基本测试用的分层结构

beans中的新闻实体:

package com.ykmimi.beans;
/*
 * 新闻栏目:当前的新闻栏目被看作是一方,即父栏目
 */

import java.util.Set;

public class NewsLabel {
    private Integer id;
    private String name;//栏目名称
    
    //子栏目
    private Set<NewsLabel> children;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<NewsLabel> getChildren() {
        return children;
    }
    public void setChildren(Set<NewsLabel> children) {
        this.children = children;
    }
    @Override
    public String toString() {
        return "NewsLabel>> id:"+id+",name:"+name+",children:"+children;
    }
}

之后分别是dao的接口和mapper.xml

package com.ykmimi.dao;

import java.util.List;

import com.ykmimi.beans.NewsLabel;

public interface INewsLabelDao {
    List<NewsLabel> selectChildrenByParent(int pid);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ykmimi.dao.INewsLabelDao">
    <!-- 
    <select id="" resultMap="NewsLabelMapper">
        select id,name from newslabel where pid = #{ news_id }
    </select>
     -->
    <resultMap type="NewsLabel" id="NewsLabelMapper">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="children" 
                    ofType="NewsLabel"
                    select="selectChildrenByParent"
                    column="id"/>
    </resultMap>

    <select id="selectChildrenByParent" resultMap="NewsLabelMapper">
        select id,name from newslabel where pid = #{ news_id }
    </select>
    
    
    
    
</mapper>

最重要的就是mapper中的设置,其resultMap中的collection的column="id"其实是调用了自身的查询到的id.并一直递归查询直到查询到null

当传入参数2. 其查询pid为2的两个数据库元组,查询到后,继续执行该select语句,此时获取到的id又成为了参数进行了查询.

最终获得:

NewsLabel>> id:3,name:NBA,children:[NewsLabel>> id:6,name:湖人,children:[], NewsLabel>> id:5,name:火箭,children:[]]
NewsLabel>> id:4,name:CBA,children:[NewsLabel>> id:7,name:北京金隅,children:[], NewsLabel>> id:8,name:浙江广厦,children:[], NewsLabel>> id:9,name:青岛双星,children:[]]

 

-----------------------------------------下面是返回一个对象,该对象封装了多个表数据的自查询形式

同样的项目构建,实体类做了变更:

package com.ykmimi.beans;
/*
 * 新闻栏目:当前的新闻栏目被看作是一方,即父栏目
 */

public class NewsLabel {
    private Integer id;
    private String name;//栏目名称
    
    //父栏目
    private NewsLabel parent;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public NewsLabel getParent() {
        return parent;
    }
    public void setParent(NewsLabel parent) {
        this.parent = parent;
    }
    
    @Override
    public String toString() {
        
        return "newslabel->:"+id+","+name+","+">>"+"parent:"+parent;
    }
    
}

dao接口的方法:

//查询指定栏目及其所有子孙栏目
NewsLabel selectNewsLabelById(int id);

并且mapper.xml的方法更改了:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ykmimi.dao.INewsLabelDao">
    

    
    <!-- ↓查询所有的内容包括父栏目  TotalNewsLabelMapper-->
    
    
    <resultMap type="NewsLabel" id="TotalNewsLabelMapper">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <association property="parent" 
                     javaType="NewsLabel"
                     select="selectNewsLabelById"
                     column="pid"/>
        
    </resultMap>
    
    <select id="selectNewsLabelById" resultMap="TotalNewsLabelMapper">
        select id,name,pid from newslabel where id = #{ get_id }
    </select>
    
    
    
</mapper>

@Test
    public void test02() {
         NewsLabel newslabel = dao.selectNewsLabelById(7);
         System.out.println(newslabel);
    }

结果为:自身及父栏目实例

newslabel->:7,北京金隅,>>parent:newslabel->:4,CBA,>>parent:newslabel->:2,体育新闻,>>parent:null

 

待更 自查询 多对一

将编程看作是一门艺术,而不单单是个技术。 敲打的英文字符是我的黑白琴键, 思维图纸画出的是我编写的五线谱。 当美妙的华章响起,现实通往二进制的大门即将被打开。
相关文章
|
编译器 C++ 开发者
【Conan 入门教程 】使用Conan 2.X和Autotools高效构建C/C++项目
【Conan 入门教程 】使用Conan 2.X和Autotools高效构建C/C++项目
661 1
|
7月前
|
存储 人工智能 监控
一键部署 Dify + MCP Server,高效开发 AI 智能体应用
本文将着重介绍如何通过 SAE 快速搭建 Dify AI 研发平台,依托 Serverless 架构提供全托管、免运维的解决方案,高效开发 AI 智能体应用。
6180 64
|
消息中间件 Cloud Native Kafka
一文搞懂 Kafka consumer 与 broker 交互机制与原理
AutoMQ致力于打造下一代云原生Kafka系统,解决Kafka痛点。本文深入解析Kafka Consumer与Broker的交互机制,涉及消费者角色、核心组件及常用接口。消费者以group形式工作,包括leader和follower。交互流程涵盖FindCoordinator、JoinGroup、SyncGroup、拉取消息和退出过程。文章还探讨了broker的consumer group状态管理和rebalance原理。AutoMQ团队分享Kafka技术,感兴趣的话可以关注他们。
1221 3
一文搞懂 Kafka consumer 与 broker 交互机制与原理
|
前端开发 架构师 算法
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
不论你是职场新人还是35岁的职场“老人”,成长是每个职场人都绕不开的话题,同时也是贯穿每个人职业生涯的痛点。本文主要帮助读者建立起对个人成长的认知,然后在此认知的基础上让大家理解成长的本质,最终通过文章的引导,来帮助读者完成个人成长路线图的确定以及落地实践。
13917 3
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
|
数据处理 开发者 C++
Kotlin协程与RxJava:谁将称雄现代应用开发?揭秘背后的技术博弈与选择之道!
【9月更文挑战第13天】本文对比了现代应用开发中备受欢迎的两种并发编程方案:Kotlin协程与RxJava。Kotlin协程以轻量级线程和挂起函数简化异步编程,尤其适合I/O密集型任务;RxJava基于观察者模式,擅长处理复杂异步数据流。文中还提供了示例代码,帮助开发者根据项目需求和偏好做出合适的选择。
275 1
|
数据采集 分布式计算 Kubernetes
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
287 4
|
Dubbo Java 应用服务中间件
DUBBO--基础篇(一)--简介(示意Demo)
DUBBO--基础篇(一)--简介(示意Demo)
588 0
|
人工智能 算法 开发者
一元线性回归-预测电影票房|学习笔记
快速学习一元线性回归-预测电影票房
1122 0
一元线性回归-预测电影票房|学习笔记
|
物联网 API 数据安全/隐私保护
NB-oT 移动 OneNet 云平台接入流程 | 学习笔记
快速学习 NB-oT 移动 OneNet 云平台接入流程
NB-oT 移动 OneNet 云平台接入流程 | 学习笔记