resultMap递归查询(目录树)

简言:

Mybatis在处理简单的一对多时,在“一”的实体类中添加“多”的List集合,此时使用resultType的话会暴露出两个问题
1.查询出的结果,“一”实体中其他属性还好对应,就算是属性和字段名不同还可以使用别名,但是List属性的每一项又是个实体,不好对应
2.注意到List是个集合,也就是需要<select>标签多次执行查询,resultType显然不支持,resultMap中的<collection>标签就可以实现多次查询


解释<collection>标签的五个属性:

<collection column="" property="" javaType="" ofType="" select="">

column:有承上启下的作用,接收“父查询”对应字段的查询结果,向“子级查询”传递此结果
property:对应实体类中的List字段
JavaType:一般为java.util.ArrayList
ofType:子查询的输出类型
select:标记子查询,对应子查询的id,----注意只有select属性还不行,Mapper接口中还必须要声明----

前面说了这么多都是铺垫,现在开始来到目录树

步骤一:

建立目录树表:id是主键唯一编号,classify是目录名,father_catalog_id为上一级目录的id编号,或许你可能会问为什么不指向它的下一级目录,因为父目录不一定只有一个子目录啊,那这个字段你可能要放个数组,问题就复杂了 (O_O)


catalogs
步骤二:

建立实体类(省略了get,set方法):前两个属性没有什么好说的,至于为什么不添加father_catalog_id字段对应的属性是因为Mapper接口中方法返回的数据中我不想看到这个查询结果,就这么任性 : ) 重点是next属性,List<Catalog>修饰,父目录可以对应多个子目录用List没有争议吧,Catalog是因为子目录和父目录一样都是Catalog类实例

public class Catalog {
    private int id;
    private String classify;
    private List<Catalog> next;
}
步骤三:

建立Mapper接口:这里我将兴建两个方法,第一个方法是查询所有的目录树,第二个方法是根据id查询对应的目录树

public interface CatalogMapper {
//    查询所有目录树
    List<Catalog> listCatalog();
//    根基id查询对应的目录树
    Catalog getCatalog(int id);
}
步骤四:

建立Maper.xml文件:上面的铺垫说了那么多到这儿应该知道要使用resultMapper了吧,首先添加<resultMapper>标签

<resultMapper id="treeResultMapper" type="com.hgc.entity.CatalogMapper">
  <id property="id" column="id">
  <result property="classify" column="classify">
  <!--collection标签的属性可以去百度一下-->
  <collection property="next" ofType="com.hgc.entity.CatalogMapper" select="listNextCatalog" column="id" javaType="java.util.ArrayList">
</resultMapepr>

接下来编写<select>查询
先实现查询所有目录

<!--sql语句根据具体的数据库修改,查询的条件是father_catalog_id=0,也就是查询的是根目录-->
<select id="listCatalog" resultMap="treeResultMapper">
  select * from public."catalog" where father_catalog_id=0
</select>
<!--collection标签中的子查询,同样的select标签中的id也要在Mapper接口中声明-->
<select id="listNextCatalog" resultMap="treeResultMapper">
  select * from public."catalog" where father_catalog_id=#{id}
</select>

修改Mapper接口

public interface CatalogMapper {
//    查询所有目录树
    List<Catalog> listCatalog();
//    根基id查询对应的目录树
    Catalog getCatalog(int id);
//    递归查询子目录
    List<Catalog> listNextCatalog();
}
接下来实现根据id查询出目录树

在Mapper.xml中添加方法的映射

<select id="getCatalog" resultMap="treeResultMap">
  select * from public."catalog" where id=#{id}
</select>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容