mybatis查询树状结构数据

本文详细解析了菜单实体类的设计,包括属性及其作用,以及如何使用MyBatis进行数据映射,实现菜单树的构建。通过具体代码示例,展示了实体类、Mapper配置及DAO接口的实现细节。

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

1、 实体类

@Getter
@Setter
public class Menu extends DataEntity<Menu> {

	private static final long serialVersionUID = 1L;
	private Menu parent;	// 父级菜单
	private String parentIds; // 所有父级编号
	private List<Menu> children;	// 子菜单
	private String name; 	// 名称
	private String href; 	// 链接
	private String target; 	// 目标( mainFrame、_blank、_self、_parent、_top)
	private String icon; 	// 图标
	private Integer sort; 	// 排序
	private String isShow; 	// 是否在菜单中显示(1:显示;0:不显示)
	private String permission; // 权限标识
	private String userId; //用户id
	private String type; //权限类型

}

 2、mapper

<resultMap type="Menu" id="MenuTree">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="children" column="id" ofType="com.jxlx.entity.Menu"
                    javaType="java.util.ArrayList" select="selectChildren" />
    </resultMap>
<select id="selectChildren" resultMap="MenuTree">
        SELECT
          A.ID,
          A.NAME
        FROM SYS_MENU A
        WHERE A.PARENT_ID = #{ID}
    </select>

    <select id="getAllList" resultMap="MenuTree">
        SELECT
          A.ID,
          A.NAME
        FROM SYS_MENU A
        WHERE A.PARENT_ID = '1'AND A.DEL_FLAG = '0'
    </select>

3、dao

public List<T> getAllList();

在使用 Spring Boot 和 MyBatis 进行连表查询时,可以通过递归的方式将查询结果转换成树状结构数据。 假设有两张表:部门表和员工表,部门表中有一个 parent_id 字段表示该部门的上级部门,员工表中有一个 dept_id 字段表示该员工所在的部门。现在需要查询出所有部门以及下属员工,并将其转换成树状结构数据。 首先,需要定义一个部门实体类和一个员工实体类,代码如下: ```java public class Department { private Long id; private String name; private Long parentId; private List<Employee> employees; // getter 和 setter 略 } public class Employee { private Long id; private String name; private Long deptId; // getter 和 setter 略 } ``` 接下来,可以使用 MyBatis 进行连表查询,代码如下: ```xml <select id="getDepartments" resultMap="departmentResultMap"> select d.id, d.name, d.parent_id, e.id as employee_id, e.name as employee_name, e.dept_id as employee_dept_id from department d left join employee e on d.id = e.dept_id order by d.id, e.id </select> <resultMap id="departmentResultMap" type="Department"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="parentId" column="parent_id"/> <collection property="employees" ofType="Employee" resultMap="employeeResultMap" columnPrefix="employee_"/> </resultMap> <resultMap id="employeeResultMap" type="Employee"> <id property="id" column="employee_id"/> <result property="name" column="employee_name"/> <result property="deptId" column="employee_dept_id"/> </resultMap> ``` 注意,这里使用了 MyBatis 的 resultMap 来映射查询结果到实体类中。 接下来,可以编写一个递归方法,将查询结果转换成树状结构数据,代码如下: ```java private List<Department> buildTree(List<Department> departments) { Map<Long, Department> map = new HashMap<>(); for (Department department : departments) { map.put(department.getId(), department); } List<Department> roots = new ArrayList<>(); for (Department department : departments) { Long parentId = department.getParentId(); if (parentId == null || parentId == 0) { roots.add(department); } else { Department parent = map.get(parentId); if (parent != null) { parent.getEmployees().add(department.getEmployees().get(0)); } } } for (Department root : roots) { buildChildren(map, root); } return roots; } private void buildChildren(Map<Long, Department> map, Department department) { List<Department> children = new ArrayList<>(); for (Employee employee : department.getEmployees()) { Department child = map.get(employee.getDeptId()); if (child != null) { children.add(child); buildChildren(map, child); } } department.setChildren(children); } ``` 最后,在控制器中调用这个递归方法即可,代码如下: ```java @GetMapping("/departments") public List<Department> getDepartments() { List<Department> departments = departmentMapper.getDepartments(); return buildTree(departments); } ``` 这样就可以返回树状结构数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值