今天将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
待更 自查询 多对一
将编程看作是一门艺术,而不单单是个技术。 敲打的英文字符是我的黑白琴键, 思维图纸画出的是我编写的五线谱。 当美妙的华章响起,现实通往二进制的大门即将被打开。