首页 新闻 会员 周边 捐助

mybatis 用自连接显示层级关系 如何实现的

0
悬赏园豆:100 [待解决问题]

映射结果集:
<resultMap id="allMenus" type="com.javasm.entity.AdminMenu">
<id property="mid" column="mid"/>
<result property="menuname" column="menuname"/>
<collection property="subMenu" ofType="com.javasm.entity.AdminMenu">
<id property="mid" column="submid"/>
<result property="menuname" column="submenuname"/>

    </collection>
</resultMap>

sql语句:
<select id="MenuAll" resultMap="allMenus">
SELECT am2.mid,am2.menuname,am.mid as submid,am.menuname as submenuname
from admin_menu am
inner join admin_menu am2 on am.pid = am2.mid

</select>

问题::
这个如何实现层级显示的过程不太理解

langpo的主页 langpo | 初学一级 | 园豆:102
提问于:2024-12-11 15:40
< >
分享
所有回答(1)
0

要在 MyBatis 中实现自连接表的层级关系,您已经开始得很好。让我们深入理解这个过程,以帮助您更好地获取和展示菜单的层级关系。

实现步骤

  1. 数据表结构
    假设您的admin_menu表中有以下字段:

    • mid:菜单的唯一标识符
    • menuname:菜单的名称
    • pid:父菜单的ID,指向自身的mid,用于建立层级关系。

    例如:

    +-----+-----------+------+
    | mid | menuname  | pid  |
    +-----+-----------+------+
    |  1  | Menu 1   | NULL |
    |  2  | Menu 2   |  1   |
    |  3  | Menu 3   |  1   |
    |  4  | Menu 4   | NULL |
    |  5  | Menu 5   |  4   |
    +-----+-----------+------+
    
  2. SQL 查询
    您的 SQL 查询是通过自连接来获取每个菜单及其子菜单。使用 INNER JOIN 将父菜单与其子菜单连接起来。您的需求需要稍作调整,以便也能获取没有子菜单的菜单。

    可能的 SQL 语句如下:

    SELECT am.mid, am.menuname, am2.mid as submid, am2.menuname as submenuname
    FROM admin_menu am
    LEFT JOIN admin_menu am2 ON am.mid = am2.pid;
    

    在这里,我们使用了 LEFT JOIN 来确保即使某个菜单没有子菜单,它仍然会被返回。

  3. ResultMap 配置
    您的 resultMap 已经定义了如何将查询结果映射到 AdminMenu 实体,其中包括了子菜单的集合。这里是一个改进后的示例:

    <resultMap id="allMenus" type="com.javasm.entity.AdminMenu">
        <id property="mid" column="mid"/>
        <result property="menuname" column="menuname"/>
        <collection property="subMenu" ofType="com.javasm.entity.AdminMenu">
            <id property="mid" column="submid"/>
            <result property="menuname" column="submenuname"/>
        </collection>
    </resultMap>
    
  4. 实体类
    确保您的 AdminMenu 类具有 subMenu 属性并且是一个集合类型(如 List<AdminMenu>),以便能够存储其子菜单。

    public class AdminMenu {
        private Integer mid;
        private String menuname;
        private List<AdminMenu> subMenu;  // 子菜单
    
        // getters and setters
    }
    
  5. 使用查询
    您可以通过调用 MenuAll 方法来获取所有菜单及其层级关系,MyBatis 将自动将查询结果映射到 AdminMenu 对象中,并填充 subMenu 集合。

结果展示

当您调用这个查询时,您会得到一个包含所有菜单的列表,每个菜单都有其相应的子菜单。最终,您可以通过递归的方法来显示这个层级结构,例如:

public void printMenu(List<AdminMenu> menus) {
    for (AdminMenu menu : menus) {
        System.out.println(menu.getMenuname());
        if (menu.getSubMenu() != null) {
            printMenu(menu.getSubMenu()); // 递归调用打印子菜单
        }
    }
}

总结

通过这个过程,您可以利用 MyBatis 实现自连接显示层级关系。关键在于正确构造 SQL 查询,恰当映射结果集,并对实体类进行适当设计。 如果有其他具体问题或需要进一步的解释,请随时告知!

Technologyforgood | 园豆:7775 (大侠五级) | 2024-12-11 16:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册