我们在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