Mybatis通过colliection属性递归获取菜单树
1、现有商品分类数据表category结构如下,三个字段都为varchar类型
2、创建商品分类对应的数据Bean
/** * */ package com.xdw.dao; import java.util.List; import com.xdw.model.Category; /** * @author xiadewang *2018年4月16日 */ public interface CategoryDao { List<Category> getCategoryList(); }
3、创建CategoryDao.xml
<?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="com.xdw.dao.CategoryDao"> <!-- 初始化菜单树 --> <!-- 这里的id的值作为下面的查询返回结果resultMap的值 --> <!-- collection中的column属性可以为多个值,这里只有一个,它作为下面递归查询传递进去的参数 --> <!-- ofType和javaType属性正好联合构成了数据Bean类Category中的childrenList属性的数据类型 --> <!-- select的值为下面递归查询的select标签的id值 --> <resultMap type="Category" id="categoryTree"> <result column="cid" property="cid" javaType="java.lang.String" /> <result column="cname" property="cname" javaType="java.lang.String" /> <result column="pid" property="pid" javaType="java.lang.String" /> <collection column="cid" property="childrenList" ofType="Category" javaType="java.util.ArrayList" select="selectCategoryChildrenByCid"/> </resultMap> <!-- 先查询菜单根级目录 --> <!-- 这里的返回结果必须为resultMap,并且值为上面构建的resultMap的id的值 --> <select id="getCategoryList" resultMap="categoryTree"> select * from category where pid = 'root' </select> <!-- 再利用上次查询结果colliection中column的值cid做递归查询,查出所有子菜单 --> <!-- 这里的返回结果必须为resultMap,并且值为上面构建的resultMap的id的值 --> <select id="selectCategoryChildrenByCid" resultMap="categoryTree" parameterType="String"> select * from category where pid = #{cid} </select> </mapper>
4、service层
/** * */ package com.xdw.service; import java.util.List; import com.xdw.model.Category; /** * @author xiadewang *2018年4月16日 */ public interface CategoryService { List<Category> getCategoryList(); } /** * */ package com.xdw.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.xdw.dao.CategoryDao; import com.xdw.model.Category; import com.xdw.service.CategoryService; /** * @author xiadewang *2018年4月16日 */ @Service public class CategoryServiceImpl implements CategoryService { @Autowired private CategoryDao categoryDao; /* (non-Javadoc) * @see com.xdw.service.CategoryService#getCategoryList() */ @Override public List<Category> getCategoryList() { // TODO Auto-generated method stub return categoryDao.getCategoryList(); } }
4、controller层
@RequestMapping("/getCategoryTree") @ResponseBody public List<Category> getCategoryTree() { return categoryService.getCategoryList(); }
此时基于SSM的操作已经完毕,核心就是在写mybatis的xml,可以在浏览器中查看运行结果,返回的是json数据。运行结果如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?