MyBatis3——的自关联

本文详细介绍在MyBatis中如何通过SQL递归查询和实体类定义实现自关联,包括实体类定义、mapper层接口定义及SQL配置,适用于构建树状菜单等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在hibernate中可以配置自关联,在mybatis中同样可以

方式一:

在代码中处理,逐层查询即可

方式二:

通过配置SQL的递归查询实现

1. 实体定义

package cn.bjc.entity;

import java.util.List;

public class Menu {
    private String menuid;

    private String menuname;

    private String icon;

    private String url;

    private List<Menu> menus;

    public List<Menu> getMenus() {
		return menus;
	}

	public void setMenus(List<Menu> menus) {
		this.menus = menus;
	}

	@Override
	public String toString() {
		return "Menu [menuid=" + menuid + ", menuname=" + menuname + ", icon=" + icon + ", url=" + url
				+ ", menus=" + menus + "]";
	}

	public String getMenuid() {
        return menuid;
    }

    public void setMenuid(String menuid) {
        this.menuid = menuid == null ? null : menuid.trim();
    }

    public String getMenuname() {
        return menuname;
    }

    public void setMenuname(String menuname) {
        this.menuname = menuname == null ? null : menuname.trim();
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon == null ? null : icon.trim();
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url == null ? null : url.trim();
    }

}

2. mapper层接口定义

public interface MenuMapper{
	
	public List<Menu> getMenus();
	
}

3. SQL配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bjc.mapper.MenuMapper">

	<!-- 定义resultMap 用于递归调用-->
	<resultMap type="cn.bjc.entity.Menu" id="menumap">
		<id property="menuid" column="menuid"/>
		<result property="menuname" column="menuname"/>
		<result property="icon" column="icon"/>
		<result property="url" column="url"/>

		<collection property="menus" 
					ofType="cn.bjc.entity.Menu"
					select="getChildren"  
					column="menuid"/>
	</resultMap>
	
	<select id="getChildren" resultMap="menumap">
		SELECT 	
			t.menuid,
			t.menuname,
			t.icon,
			t.url
		FROM menu t
		where t.pid = #{menuid}
	</select>
	
	<select id="getMenus" resultMap="menumap">
		SELECT 	
			t.menuid,
			t.menuname,
			t.icon,
			t.url
		FROM menu t
		where t.menuid = 0 
	</select>
	
</mapper>

配置分析;

1)resultMap的定义用于递归调用的结果集

2)collection表示一对多

       2.1 property:表示实体bean的属性

       2.2 ofType:表示该属性对应的pojo类型

       2.3 select="getChildren" 表示该结果集通过查询getChildren语句  

       2.4 column="menuid"  中的menuid就是getChildren中的#{menuid},同时也是 getMenus中的t.menuid

注意:getChildren中的这个#{menuid}中的menuid可以为任意值比方说#{xxx}

3)getMenus是我们程序外部调用的入口,t.menuid = 0  这里的menuid的值为顶级菜单id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值