mybatis查询返回一个三级目录


职场小白,边学边记
做项目遇到一个返回二层嵌套的三级目录的问题,第一次用框架,好多地方不懂,查了许多资料终于解决了这个问题

解决办法

写了三个Bean

  1. 第一个:嵌套二级目录的一级目录
  2. 第二个:嵌套三级目录的二级目录
  3. 第三个:三级目录

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版权协议,转载请附上原文出处链接和本声明。