今天将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中的新闻实体:

  1. package com.ykmimi.beans;
  2. /*
  3. * 新闻栏目:当前的新闻栏目被看作是一方,即父栏目
  4. */
  5.  
  6. import java.util.Set;
  7.  
  8. public class NewsLabel {
  9. private Integer id;
  10. private String name;//栏目名称
  11.  
  12. //子栏目
  13. private Set<NewsLabel> children;
  14. public Integer getId() {
  15. return id;
  16. }
  17. public void setId(Integer id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public Set<NewsLabel> getChildren() {
  27. return children;
  28. }
  29. public void setChildren(Set<NewsLabel> children) {
  30. this.children = children;
  31. }
  32. @Override
  33. public String toString() {
  34. return "NewsLabel>> id:"+id+",name:"+name+",children:"+children;
  35. }
  36. }

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

  1. package com.ykmimi.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import com.ykmimi.beans.NewsLabel;
  6.  
  7. public interface INewsLabelDao {
  8. List<NewsLabel> selectChildrenByParent(int pid);
  9. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.ykmimi.dao.INewsLabelDao">
  4. <!--
  5. <select id="" resultMap="NewsLabelMapper">
  6. select id,name from newslabel where pid = #{ news_id }
  7. </select>
  8. -->
  9. <resultMap type="NewsLabel" id="NewsLabelMapper">
  10. <id column="id" property="id"/>
  11. <result column="name" property="name"/>
  12. <collection property="children"
  13. ofType="NewsLabel"
  14. select="selectChildrenByParent"
  15. column="id"/>
  16. </resultMap>
  17.  
  18. <select id="selectChildrenByParent" resultMap="NewsLabelMapper">
  19. select id,name from newslabel where pid = #{ news_id }
  20. </select>
  21.  
  22. </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:[]]

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

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

  1. package com.ykmimi.beans;
  2. /*
  3. * 新闻栏目:当前的新闻栏目被看作是一方,即父栏目
  4. */
  5.  
  6. public class NewsLabel {
  7. private Integer id;
  8. private String name;//栏目名称
  9.  
  10. //父栏目
  11. private NewsLabel parent;
  12.  
  13. public Integer getId() {
  14. return id;
  15. }
  16. public void setId(Integer id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public NewsLabel getParent() {
  26. return parent;
  27. }
  28. public void setParent(NewsLabel parent) {
  29. this.parent = parent;
  30. }
  31.  
  32. @Override
  33. public String toString() {
  34.  
  35. return "newslabel->:"+id+","+name+","+">>"+"parent:"+parent;
  36. }
  37.  
  38. }

dao接口的方法:

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.ykmimi.dao.INewsLabelDao">
  4.  
  5. <!-- ↓查询所有的内容包括父栏目 TotalNewsLabelMapper-->
  6.  
  7. <resultMap type="NewsLabel" id="TotalNewsLabelMapper">
  8. <id column="id" property="id"/>
  9. <result column="name" property="name"/>
  10. <association property="parent"
  11. javaType="NewsLabel"
  12. select="selectNewsLabelById"
  13. column="pid"/>
  14.  
  15. </resultMap>
  16.  
  17. <select id="selectNewsLabelById" resultMap="TotalNewsLabelMapper">
  18. select id,name,pid from newslabel where id = #{ get_id }
  19. </select>
  20.  
  21. </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

待更 自查询 多对一

Today's harvest !!!的更多相关文章

  1. hdu多校第4场 B Harvest of Apples(莫队)

    Problem B. Harvest of Apples Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Su ...

  2. HDU 6333 Harvest of Apples (分块、数论)

    题目连接:Harvest of Apples 题意:给出一个n和m,求C(0,n)+C(1,n)+.....+C(m,n).(样例组数为1e5) 题解:首先先把阶乘和逆元预处理出来,这样就可O(1)将 ...

  3. 2018 Multi-University Training Contest 4 Problem B. Harvest of Apples 【莫队+排列组合+逆元预处理技巧】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6333 Problem B. Harvest of Apples Time Limit: 4000/200 ...

  4. HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))

    2018 Multi-University Training Contest 4 6333.Problem B. Harvest of Apples 题意很好懂,就是组合数求和. 官方题解: 我来叨叨 ...

  5. Harvest of Apples

    问题 B: Harvest of Apples 时间限制: 1 Sec  内存限制: 128 MB提交: 18  解决: 11[提交] [状态] [讨论版] [命题人:admin] 题目描述 Ther ...

  6. hdu6333 Harvest of Apples 离线+分块+组合数学(求组合数模板)

    Problem B. Harvest of Apples Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  7. hdu6333 Problem B. Harvest of Apples(组合数+莫队)

    hdu6333 Problem B. Harvest of Apples 题目传送门 题意: 求(0,n)~(m,n)组合数之和 题解: C(n,m)=C(n-1,m-1)+C(n-1,m)    设 ...

  8. 2018年多校第四场第二题 B. Harvest of Apples hdu6333

    题意:给定10^5以内的n,m求∑组合数(n,i),共10^5组数据. 题解: 定义 S(n, m) = \sum_{i = 0} ^ {m} {n \choose i}S(n,m)=∑​i=0​m​ ...

  9. HDU6333 Harvest of Apples (杭电多校4B)

    这莫队太强啦 先推公式S(n,m)表示从C(n, 0) 到 C(n, m)的总和 1.S(n, m)   = S(n, m-1) + C(n, m) 这个直接可以转移得到 2.S(n, m)   = ...

  10. Problem B. Harvest of Apples HDU - 6333(莫队)

    Problem Description There are n apples on a tree, numbered from 1 to n.Count the number of ways to p ...

随机推荐

  1. CSSOM视图模式(CSSOM View Module)

    一.Window视图属性(window对象) 这些属性可以获取住整个浏览器窗体大小.微软则将这些API称为“Screenview 接口” innerWidth 属性和 innerHeight 属性pa ...

  2. 【office2010】office2010安装问题的解决方案。

    今天想在公司电脑上按上一个office2010,结果出现一个问题,导致研究了一下午才解决:现总结解决方案: 安装office 2010,提示需要安装MSXML版本6.10.1129.0组件.但是在网上 ...

  3. mybatis按姓名或手机号搜索

    1.AND ((USER_NAME LIKE '%'||#{searchKey}||'%') OR (MOBILE_PHONE LIKE '%'||#{searchKey}||'%'))2. < ...

  4. Linux 搭建Nginx并添加配置 SSL 证书

    1. 安装准备   1.1 gcc安装 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: [root@nginx ~]# yum -y i ...

  5. 通过nginx 访问thinkphp

    修改 nginx的配置文件: location / { root /var/www; index index.html index.htm index.php; if (!-e $request_fi ...

  6. 【node】---socket---网络通信---【巷子】

    1.什么是一个socket? 网络上两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称为socket 2.http与socket的区别 在以前我们实现数据交换已经有了HTTP协议,为什么还要 ...

  7. 3.html+.ashx(删除学生信息)

    C03ListStu.ashx 0:false(删除);1:true(正常). (数据库里定义个BOOL型,TRUE表示正常FALSE表示删除) <html> <head> & ...

  8. EF的使用(DbContext对象的共用问题)

    1.问题的引入 对于某一个数据库的EF操作对象,当执行某一次请求的时候,可能会多次操作数据库,也就是可能创建很多MyDbContext(继承自DbContext对象,EF上下文对象) 2.代码创建 当 ...

  9. 深入理解Docker容器执行引擎runC

    1 简介 根据官方的定义:runC是一个根据OCI标准创建并运行容器的CLI tool. Docker就是基于runC创建的,简单地说,runC就是docker中最为核心的部分,容器的创建,运行,销毁 ...

  10. docker网络部分源码分析

    daemon初始化network controller daemon的配置,网络部分的内容在cmd/dockerd/config_common_unix.go中指定,默认设置一般都为空 // daem ...