(十七)Mybatis自关联查询一对多查询

注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-13-oneself-one2many,需要自取,需要配置maven环境以及mysql环境(sql语句在resource下的test.sql中),觉得有用可以点个小星星,小菜鸟在此Thanks~

所谓自关联查询,是指自己既然充当一方,又充当多方。比如新闻栏目的数据表,自己可以是父栏目,也可以是多方,子栏目。在数据表里面实现就是一张表,有一个外键pid,用来表示该栏目的父栏目,一级栏目没有父栏目的,可以将其外键设置为0.
DB表如下:



查询指定栏目的所有子孙栏目

查询指定目录的所有子孙目录,我们需要使用递归的思想,查出当前栏目之后,需要将当前栏目的id作为下一级栏目的pid。

实体类NewsLabel.java,使用一对多的关系:

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;}@Overridepublic String toString() {return "NewsLabel [id=" + id + ", name=" + name + ", children="+ children + "]";}}

定义sql接口:

public interface INewsLabelDao {List<NewsLabel> selectChildByParentId(int pid);
}

mapper.xml文件,在递归里面使用本身sql:

<?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="dao.INewsLabelDao"><resultMap type="beans.NewsLabel" id="newsLabelMapper"><id column="id" property="id"/><result column="name" property="name"/><collection property="children" ofType="NewsLabel"select="selectChildByParentId"column="id"/></resultMap><select id="selectChildByParentId" resultMap="newsLabelMapper">select id,name from newslabel where pid=#{xxx}</select>
</mapper>

测试类MyTest.java:

public class MyTest {private INewsLabelDao dao;private SqlSession sqlSession;@Beforepublic void Before(){sqlSession=MyBatisUtils.getSqlSession();dao=sqlSession.getMapper(INewsLabelDao.class);}@Testpublic void TestselectMinisterById(){List<NewsLabel>children=dao.selectChildByParentId(2);for(NewsLabel newsLabel:children){System.out.println(newsLabel);}}@Afterpublic void after(){if(sqlSession!=null){sqlSession.close();}}}

结果:

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

这样的写法只能选出子孙栏目,不能将自己的信息输出。

查询指定目录以及指定子孙目录

添加一个sql的接口:

  List<NewsLabel> selectSelfAndChildByParentId(int pid);

mapper文件里面实现,在resultMap里面递归调用另一个sql,最外层的sql只执行一次,这样就可以实现查询自身一次,递归查询子孙栏目的功能:

    <!--  筛选出自己以及子孙栏目--><select id="selectChildByParentId2" resultMap="newsLabelMapper2">select id,name from newslabel where pid=#{ooo}</select><resultMap type="beans.NewsLabel" id="newsLabelMapper2"><id column="id" property="id"/><result column="name" property="name"/><collection property="children"ofType="NewsLabel"select="selectChildByParentId2"column="id"/></resultMap><select id="selectSelfAndChildByParentId" resultMap="newsLabelMapper2">select id,name from newslabel where id=#{xxx}</select>

单元测试:

  @Testpublic void TestselectSelfAndChildrenLabelById(){List<NewsLabel> children = dao.selectSelfAndChildByParentId(2);for (NewsLabel newsLabel : children) {System.out.println(newsLabel);}}

结果:

[service] 2018-07-16 11:17:16,667 - org.apache.ibatis.transaction.jdbc.JdbcTransaction -450  [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction  - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@5bb21b69]
[service] 2018-07-16 11:17:16,669 - dao.INewsLabelDao.selectSelfAndChildByParentId -452  [main] DEBUG dao.INewsLabelDao.selectSelfAndChildByParentId  - ==>  Preparing: select id,name from newslabel where id=? 
[service] 2018-07-16 11:17:16,704 - dao.INewsLabelDao.selectSelfAndChildByParentId -487  [main] DEBUG dao.INewsLabelDao.selectSelfAndChildByParentId  - ==> Parameters: 2(Integer)
[service] 2018-07-16 11:17:16,722 - dao.INewsLabelDao.selectChildByParentId2 -505  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ====>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,723 - dao.INewsLabelDao.selectChildByParentId2 -506  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ====> Parameters: 2(Integer)
[service] 2018-07-16 11:17:16,726 - dao.INewsLabelDao.selectChildByParentId2 -509  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,726 - dao.INewsLabelDao.selectChildByParentId2 -509  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======> Parameters: 3(Integer)
[service] 2018-07-16 11:17:16,727 - dao.INewsLabelDao.selectChildByParentId2 -510  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,728 - dao.INewsLabelDao.selectChildByParentId2 -511  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 5(Integer)
[service] 2018-07-16 11:17:16,729 - dao.INewsLabelDao.selectChildByParentId2 -512  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,732 - dao.INewsLabelDao.selectChildByParentId2 -515  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,732 - dao.INewsLabelDao.selectChildByParentId2 -515  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 6(Integer)
[service] 2018-07-16 11:17:16,733 - dao.INewsLabelDao.selectChildByParentId2 -516  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,734 - dao.INewsLabelDao.selectChildByParentId2 -517  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <======      Total: 2
[service] 2018-07-16 11:17:16,734 - dao.INewsLabelDao.selectChildByParentId2 -517  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,734 - dao.INewsLabelDao.selectChildByParentId2 -517  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ======> Parameters: 4(Integer)
[service] 2018-07-16 11:17:16,736 - dao.INewsLabelDao.selectChildByParentId2 -519  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,736 - dao.INewsLabelDao.selectChildByParentId2 -519  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 7(Integer)
[service] 2018-07-16 11:17:16,738 - dao.INewsLabelDao.selectChildByParentId2 -521  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,738 - dao.INewsLabelDao.selectChildByParentId2 -521  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,739 - dao.INewsLabelDao.selectChildByParentId2 -522  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 8(Integer)
[service] 2018-07-16 11:17:16,741 - dao.INewsLabelDao.selectChildByParentId2 -524  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,742 - dao.INewsLabelDao.selectChildByParentId2 -525  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========>  Preparing: select id,name from newslabel where pid=? 
[service] 2018-07-16 11:17:16,742 - dao.INewsLabelDao.selectChildByParentId2 -525  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - ========> Parameters: 9(Integer)
[service] 2018-07-16 11:17:16,743 - dao.INewsLabelDao.selectChildByParentId2 -526  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <========      Total: 0
[service] 2018-07-16 11:17:16,744 - dao.INewsLabelDao.selectChildByParentId2 -527  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <======      Total: 3
[service] 2018-07-16 11:17:16,744 - dao.INewsLabelDao.selectChildByParentId2 -527  [main] DEBUG dao.INewsLabelDao.selectChildByParentId2  - <====      Total: 2
[service] 2018-07-16 11:17:16,745 - dao.INewsLabelDao.selectSelfAndChildByParentId -528  [main] DEBUG dao.INewsLabelDao.selectSelfAndChildByParentId  - <==      Total: 1
NewsLabel [id=2, name=体育新闻, children=[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=[]]]]]]

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使缓慢,驰而不息。

公众号:秦怀杂货店

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64180.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机森林-科比生涯数据集分析与预测

前言 最近想学习一下随机森林,从网上找了一些例子,由于sk-learn版本变更,做了些修改才正常跑起来。本文利用随机森林算法训练出一个预测科比投篮模型。主要用了python的numpy,pandas,matplotlib和sklearn库。 二、设计思路 先来看看这份科比生涯的数据集: 这个表格记录…

python爬取NBA湖人队球星的数据,并且用Excel保存

前言 本文章教你如何爬取NBA湖人球队的球员信息 一、使用步骤 1.1引入库 import xlwt import requests import re from bs4 import BeautifulSoup import time1.2引入代码 def main():url https://nba.hupu.com/players/lakers#解析数据datalist get_data(url)saveData(…

基于HTML的静态网页的课程设计(NBA湖人队的网页设计)

网页展现&#xff1a; 1.首页&#xff1a; 2.播放视频页面(可播放视频): 3.球队页面(有轮播图)&#xff1a; 4.球员页面&#xff1a; 5.图集页面 6.球迷留言页面 下载链接&#xff1a;https://download.csdn.net/download/m0_47325996/47543693

雷神笔记本FN功能快捷键大全

雷神笔记本FN功能快捷键大全&#xff0c;关闭触摸板快捷键&#xff0c;灯光快捷键&#xff0c;散热风扇快捷键 贴出来&#xff0c;懒得有需要还要去翻说明书

雷神笔记本关闭广告

都怪我自己没钱&#xff0c;2019年以6000大洋入手雷神 Air系列。后来老给我弹广告。上网查了好久&#xff0c;发现别人弹广告都是因为安装了搜狗输入法、flash等垃圾软件。我自己电脑并没有装这些&#xff08;我电脑东西还是蛮多的&#xff0c;比如matlab pycharm ps anaconda …

雷神G150TH 拆机清理风扇

来这里灌个水&#xff0c;毕竟自己没有别的空间可以写文章了&#xff01; 首先我们来看看这款花了我一年积蓄的 雷神G150TH -----噢&#xff0c;还是不看了&#xff0c;自行百度吧&#xff01; 这天气热了&#xff0c;就想玩游戏&#xff0c;问题是这电脑视乎越来越热了&…

达人评测 雷神911mr怎么样

雷神911 MR游戏本外观采用全新的ID设计&#xff0c;搭配新生发光LOGO与利刃灯带&#xff0c;光动效果不错&#xff0c;使用航空铝合金属外观材质&#xff0c;CNC工艺加工&#xff0c;质感很足&#xff0c;手感不错。雷神911mr怎么样值得入手吗这些点很重要 http://editor.csdn.…

雷神911air 装黑苹果

在大三时候偶然看到网络上有装黑苹果的视频&#xff0c;想到自己的笔记本也可以装黑苹果&#xff0c;心情还是非常激动的&#xff0c;作为一个工科生&#xff0c;我想这对于我们这一类技术宅还是非常有吸引力的。第一次装在网络上找各种资源&#xff0c;各种教程&#xff0c;走…

springboot尚硅谷雷神学习笔记

学习要求 熟悉Spring基础熟悉Maven使用 环境要求 Java8及以上Maven 3.3及以上&#xff1a;https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started-system-requirements 学习资料 文档地址&#xff1a; https://www.yuque.…

怎样加速微软商店服务器,windows10系统如何加快应用商店打开速度【图文教程】...

我们在使用Win10系统电脑过程中&#xff0c;经常都需要通过应用商店来下载一些应用程序。不过&#xff0c;最近有不少用户反馈每次打开应用商店都很慢&#xff0c;该怎么办呢&#xff1f;其实&#xff0c;该问题是由于DNS不给力导致的。下面&#xff0c;统城小编给大家分享wind…

怎么给雷神笔记本安装系统?

雷神911是一款游戏影音笔记本电脑&#xff0c;功能全面&#xff0c;能够满足学生党和上班族日常娱乐的使用需求&#xff0c;那么我们要怎么给雷神911安装系统呢&#xff1f;下面小编就给大家带来U盘装Win10系统的详细操作。 U盘启动盘制作教程 注意&#xff1a;制作期间&#x…

雷神台式计算机配置,雷神新用户手册:拿到新电脑时如何简易设置参数!

原标题:雷神新用户手册:拿到新电脑时如何简易设置参数! 小雷一直在向大家传递“游戏本三分看配置,七分看保养”的理念。一般来说,游戏本都没有想象中的那么娇贵,但依然需要我们用心去使用,这样才能迸发更好的性能,拥有更长的寿命。 就像汽车一样,再结实的车也需要按时…

雷神台式计算机型号,【雷神台式机】雷神911黑武士III台式机评测,雷神台式机装机教程_什么值得买...

前言 雷神这次新推出的黑武士III主机(下文简称雷神黑武士)&#xff0c;是酷睿i7-10700KiGame RTX2060的一套游戏电脑&#xff0c;它的存储配置是512GB2TB&#xff0c;可以在满足绝大多数玩家的使用需求&#xff0c;又能提供充分的生产力。 那这一台配备有最新款10代酷睿的电脑&…

雷神之锤源码linux,雷神之锤3 的源代码查看

Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。该系列的游戏不但画面和内容不错&#xff0c;而且即使计算机配置低&#xff0c;也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代&#xff0c;只要能在PC上搞个小动画…

有关浏览器教程:开启加速模式

很多朋友都在使用谷歌浏览器吧&#xff0c;我也在使用谷歌浏览器&#xff0c;最近发现了一个加速模式很好用&#xff0c;怎么找到呢&#xff0c;来看看下面的教程吧&#xff01; 1.打开Google Chrome 软件。 2.进入谷歌浏览器页面后&#xff0c;点击右上角「三个点」&#xff…

steam加速_玩转steam的新姿势:必备加速器推荐!

众所周知作为一款国外的软件,想要玩转steam,必备一款加速器,如果没开加速器,你可能连游戏都进不去,也无法使用社区功能。 然而市面上有那么多加速器,到底哪一款才是玩家们最心水的呢?不要着急,本期就让饭饭为大家盘点几款最受steam玩家喜爱的加速器。 奇游加速器 首先 …

雷神电脑装linux双系统,雷神911Target(双显卡)双系统Ubuntu安装显卡驱动和CUDA

因为想要使用笔记本学习kaldi,需要使用Ubuntu搭建环境。 1. 笔记本参数 当前使用的笔记本型号是雷神911Target曜蓝版的电脑,但本人鉴于该笔记本独显GTX1050Ti显卡性能不弱,想用于kaldi神经网络训练,笔记本具体参数如下图: 2. 系统和工具版本 系统:Ubuntu 18.04 (新电脑用…

java 网游加速器源码_Java/C++算法与数据结构系列视频教程【源码+课件打包】

课程目录 第一章&#xff1a;当我们在讨论算法的时候&#xff0c;我们在讨论什么&#xff1f; 1-1 我们究竟为什么要学习算法 1-2 课程介绍 第二章&#xff1a;排序基础 2-1 选择排序法 2-2 使用模板(泛型)编写算法 2-3 随机生成算法测试用例 2-4 测试算法的性能 2-5 插入排序法…

记录一次使用python来实现雷神加速器自动恢复时间和暂停时间的脚本

本博客仅供交流学习使用 最近因为经常打黎明杀机&#xff0c;需要用加速器的次数也变多了&#xff0c;但是总是需要去手动的恢复时间和暂停时间&#xff0c;非常的麻烦&#xff0c;在网上搜了一下发现之前有人写过类似的项目&#xff0c;但是用来下载的链接炸掉了&#xff0c;…

2022.12.28雷神加速器更新问题

一直不开始更新&#xff0c;等了十多分钟。 解决方法&#xff1a;打开任务管理器&#xff0c;关闭雷神加速器后台&#xff0c;然后立马开始更新&#xff0c;几秒后进入。 昨天晚上才用了雷神加速器&#xff0c;结果今天的更新搞的我等了半天&#xff0c;期间重开了几次都这样&…