Mybatis用SQL做自連表查詢


1 需求

現在有一個菜單表,菜單里同時保存有一級菜單和二級菜單,一級菜單的父菜單id字段是null,二級菜單的父菜單id字段保存了它的父菜單的id。在Java中,一個菜單對象里有一個List類型的屬性保存它的子菜單。現在需要將數據庫中的數據轉為Java中菜單兌現的結構。

2 方法

本文采用Mybatis,編寫SQL語句做自連表查詢。

3 數據庫表

類型
id int
description varchar
path varchar
parent_menu_id int

4 POJO

package com.lpc.labbackend.entity;

import java.util.List;

public class Menu {
    private Integer id;
    private String description;
    private String path;
    private List<Menu> childMenus;
	
    //省略構造函數、getter、setter
}

5 Mybatis的mapper.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.lpc.labbackend.dao.MenuMapper">
    <resultMap id="BaseResultMap" type="com.lpc.labbackend.entity.Menu">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="description" property="description" jdbcType="VARCHAR"/>
        <result column="path" property="path" jdbcType="VARCHAR"/>
        <collection property="childMenus" ofType="com.lpc.labbackend.entity.Menu" column="id" select="getChildMenus">
        </collection>
    </resultMap>
    <sql id="Base_Column_List">
        id, description, path
    </sql>

    <select id="getMenu" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from menu
        where parent_menu_id is null
    </select>

    <select id="getChildMenus" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from menu
        where menu.parent_menu_id = #{id}
    </select>
</mapper>

resultMap標簽中用一個collection標簽表示Java里的List,ofType屬性表示這個集合的類型。這個List是通過select屬性使用了一個查詢語句獲取數據,column屬性是這個查詢語句的查詢條件。

6 前台接收到的數據

0: {id: 1, icon: "el-icon-user-solid", description: "賬戶設置", path: null,…}
    id: 1
    icon: "el-icon-user-solid"
    description: "賬戶設置"
    path: null
    childMenus: [{id: 5, icon: null, description: "所有賬戶", path: "users", childMenus: null}]
        0: {id: 5, icon: null, description: "所有賬戶", path: "users", childMenus: null}
        id: 5
        icon: null
        description: "所有賬戶"
        path: "users"
        childMenus: null
1: {id: 2, icon: "el-icon-s-data", description: "信息統計", path: null,…}
2: {id: 3, icon: "el-icon-s-check", description: "申請批准", path: null,…}

7 參考資料

mybatis 單表自關聯 實現樹結構的幾種方式

本文由博客群發一文多發等運營工具平台 OpenWrite 發布


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM