职场小白,边学边记
做项目遇到一个返回二层嵌套的三级目录的问题,第一次用框架,好多地方不懂,查了许多资料终于解决了这个问题
解决办法
写了三个Bean
- 第一个:嵌套二级目录的一级目录
- 第二个:嵌套三级目录的二级目录
- 第三个:三级目录
ResultMap可以嵌套,这里不做赘述,代码里可以直观看见
(个人认为实际上写两个ResultMap就可以满足,二三层写到一起)
关键点
写SQL时根据关系写出一条查询语句,直接映射为一对多对多的关系 我的是三个层级的目录通过一个parent字段存在一个表里,不同情况不同讨论,但是实现目标是一致的,即形成一对多对多的关系映射(其实就是两个一对多连在了一块)
Bean的设计
最外层整体目录
public class WholeCatalogEntity {
//一级目录Id
private BigInteger title;
// 一级目录名称
private String key;
// 二级目录
private List<SecondCatalogEntity> children;
}
中间层目录
public class SecondCatalogEntity {
//二级目录Id
private BigInteger title;
//二级目录名称
private String key;
//三级目录
private List<ThirdCatalogEntity> children;
}
最底层目录
public class ThirdCatalogEntity {
//三级目录Id
private BigInteger title;
//三级目录名称
private String key;
}
mybatis写法
<select id="getCatalog" resultMap="GetCatalog">
select a.id as aid, a.catalog_name as acatalogName, b.id as bid, b.catalog_name as bcatalogName, c.id as cid, c.catalog_name as ccatalogName
from catalog as a LEFT join catalog as b on a.id = b.parent LEFT join catalog as c on b.id = c.parent
where a.catalog_level = 1
</select>
<resultMap id="GetThirdCatalog" type="ThirdCatalogEntity">
<id property="title" column="cid"/>
<result property="key" column="ccatalogName"/>
</resultMap>
<resultMap id="GetSecondCatalog" type="SecondCatalogEntity">
<id property="title" column="bid"/>
<result property="key" column="bcatalogName"/>
<collection property="children" ofType="ThirdCatalogEntity" resultMap="GetThirdCatalog"/>
</resultMap>
<resultMap id="GetCatalog" type="WholeCatalogEntity">
<id column="aid" property="title"/>
<result property="key" column="acatalogName"/>
<collection property="children" ofType="SecondCatalogEntity" resultMap="GetSecondCatalog"/>
</resultMap>
可以很直观的从代码里看出嵌套关系
具体实现情况
"code": "0",
"message": "查询成功!",
"result": [
{
"title": "1",
"key": "test1",
"children": [
{
"title": "11",
"key": "test11",
"children": [
{
"title": "111",
"key": "ceshi2"
},
{
"title": "112",
"key": "test112"
},
{
"title": "113",
"key": "test113"
},
{
"title": "861939",
"key": "三级目录"
}
]
}
]
}
总结:一开始我以为要分别查出各级目录,然后在service层里去逐个装配,实施过程中发现非常麻烦而且难以实现,后来查到ResultMap尝试成功。新手缘故,我个人觉得整个代码还能更简洁,希望有大佬能够给出意见。
版权声明:本文为qq_42401782原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。