最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

當Mybatis遇上目錄樹超全完美解決方案

 更新時間:2021年04月27日 09:20:06   作者:磚業(yè)洋__  
這篇文章主要介紹了當Mybatis遇上目錄樹有哪些解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

相信你也遇到過這種場景,判斷二級目錄屬于哪個一級目錄,一個員工屬于哪個上級員工領導…

Mybatis遇上目錄樹,有哪些解決方法?

一般來說,有xml直接實現(xiàn)和java代碼遞歸賦值實現(xiàn)。

方式一:xml直接實現(xiàn)

這里列出category數(shù)據(jù)表數(shù)據(jù)

表結構如下

type表示分類類型,也就是目錄級別,1表示一級目錄,3表示三級目錄

大家就不要關注數(shù)據(jù)類型規(guī)范了,比如這里id應該biginttype明明可以tinyint之類的,我抓我看到的例子直接講解。

  目錄為甜點/蛋糕的id為1,而蛋糕和點心的father_id為1,目錄為餅干/膨化的id為2,餅干、薯片、蝦條的father_id就是2,一級目錄id對應二級子目錄的father_id,這就是所屬對應關系,可以理解為父子關系。

實體類是mybatis-generator插件自動生成的

public class Category {
    private Integer id;
    private String name;
    private Integer type;
    private Integer fatherId;
    private String logo;
    private String slogan;
    private String catImage;
    private String bgColor;
    //=====篇幅原因,省掉Getter和Setter方法======
	......
}

一般我們看到的商城,鼠標放到一級分類目錄就會展示出二級分類目錄。我們的需求是當鼠標移動到一級分類,我們需要提供二級分類和三級分類。

這里貼出需要返回給前端的聚合模型view object數(shù)據(jù)

/**
 * 二級分類VO
 */
public class CategoryVO {
    private Integer id;
    private String name;
    private String type;
    private Integer fatherId;
    // 三級分類vo list
    private List<SubCategoryVO> subCatList;
	//=====篇幅原因,省掉Getter和Setter方法======
	......
}
public class SubCategoryVO {
    private Integer subId;
    private String subName;
    private String subType;
    private Integer subFatherId;
    //=====篇幅原因,省掉Getter和Setter方法======
	......
}

這就涉及到自連接查詢子目錄的技巧了,我們試試查找father_id1的子分類數(shù)據(jù),也就是查詢甜點/蛋糕分類下面的二級和三級分類,執(zhí)行如下語句

SELECT
	f.id AS id,
	f.`name` AS `name`,
	f.type AS type,
	f.father_id AS fatherId,
	c.id AS subId,
	c.`name` AS subName,
	c.type AS subType,
	c.father_id AS subFatherId 
FROM
	category f
	LEFT JOIN category c ON f.id = c.father_id 
WHERE
	f.father_id = 1

結果如下

可以看到二級分類為蛋糕、點心時,有哪些對應的三級分類可以提供給前端,便于展示。

  我這里分為CategoryVO、SubCategoryVO ,而不是把所有屬性放在一個VO,是為了便于理解。如果不用List集合,而把所有屬性放在一個VO,前端收到的數(shù)據(jù)形式和你此時在數(shù)據(jù)庫查詢出來的一樣,有多條蛋糕記錄,底下對應著不同具體食品,這讓前端不好處理也不符合邏輯,正常邏輯應該是只有一個蛋糕分類,然后這個分類里面有數(shù)組去裝著蛋糕對應子分類才對。

  這里其實只用一個CategoryVO里面也可以處理,在后面第二種方式用java代碼處理多級目錄時,你會看到我只用了一個CategoryVO就能處理。

注意,二級分類的實體類CategoryVO有個

private List<SubCategoryVO> subCatList;

這個subCatList是為了存放三級分類的vo list,在xml中三級分類用了collection對應這個list

<?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.me.mapper.CategoryMapperCustom" >
  <resultMap id="myCategoryVO" type="com.me.pojo.vo.CategoryVO">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="type" property="type"/>
      <!--
       column一定要在sql語句中找到,property一定要在對應實體類中找到
       因為sql用as寫了別名,所以column才能用fatherId,如果不用別名,還是得寫father_id
       -->
    <result column="fatherId" property="fatherId"/>

    <!--
      collection 標簽:用于定義關聯(lián)的list集合類型的封裝規(guī)則
      property:對應三級分類的list屬性名
      ofType:集合的類型,三級分類的vo
    -->
    <collection property="subCatList" ofType="com.me.pojo.vo.SubCategoryVO">
      <id column="subId" property="subId"/>
      <result column="subName" property="subName"/>
      <result column="subType" property="subType"/>
      <result column="subFatherId" property="subFatherId"/>
    </collection>
  </resultMap>

  <select id="getSubCatList" resultMap="myCategoryVO" parameterType="int">
    SELECT
        f.id as id,
        f.`name` as `name`,
        f.type as type,
        f.father_id as fatherId,
        c.id as subId,
        c.`name` as subName,
        c.type as subType,
        c.father_id as subFatherId
    FROM
        category f
    LEFT JOIN
        category c
    on
        f.id = c.father_id
    WHERE
        f.father_id = #{rootCatId}
  </select>
</mapper>

首先讓前端展示在首頁的一級分類,前端調用一級分類接口,我們只需要查詢type1的數(shù)據(jù)返回給前端,鼠標移動到一級分類,就調用獲取子分類的接口,前端傳入對應一級分類的id給后端,后端將這個id作為father_id去查詢子分類。最后我們可以調用getSubCatList來得到所有目錄。

  @Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public List<CategoryVO> getSubCatList(Integer rootCatId) {
        return categoryMapperCustom.getSubCatList(rootCatId);
    }

最后數(shù)據(jù)就是這樣,如下

{
	"status": 200,
	"msg": "OK",
	"data": [{
		"id": 11,
		"name": "蛋糕",
		"type": "2", <==================type=2表示二級目錄
		"fatherId": 1,
		"subCatList": [{
			"subId": 37,
			"subName": "蒸蛋糕",
			"subType": "3", <================subType=3表示3級目錄
			"subFatherId": 11
		}, {
			"subId": 38,
			"subName": "軟面包",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 39,
			"subName": "脫水蛋糕",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 40,
			"subName": "馬卡龍",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 41,
			"subName": "甜甜圈",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 42,
			"subName": "三明治",
			"subType": "3",
			"subFatherId": 11
		}, {
			"subId": 43,
			"subName": "銅鑼燒",
			"subType": "3",
			"subFatherId": 11
		}]
	}, {
		"id": 12,
		"name": "點心",
		"type": "2",
		"fatherId": 1,
		"subCatList": [{
			"subId": 44,
			"subName": "肉松餅",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 45,
			"subName": "華夫餅",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 46,
			"subName": "沙琪瑪",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 47,
			"subName": "雞蛋卷",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 48,
			"subName": "蛋餅",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 49,
			"subName": "鳳梨酥",
			"subType": "3",
			"subFatherId": 12
		}, {
			"subId": 50,
			"subName": "手撕面包",
			"subType": "3",
			"subFatherId": 12
		}]
	}]
}

方式二:java代碼遞歸處理二級三級目錄

此刻我換一個數(shù)據(jù)庫例子,但是還是和上面一個處理一級二級三級分類的例子一樣
數(shù)據(jù)表如下

表結構如下

和上一個例子大同小異,type依然表示目錄級別

此刻需要返回給前端的VO如下,此刻我只寫了一個CategoryVO,沒有寫子VO,可以對比前一種方式看看,道理都是一樣的。

public class CategoryVO {
    private Integer id;
    private String name;
    private Integer type;
    private Integer parentId;
    private Integer orderNum;
    private Date createTime;
    private Date updateTime;
    private List<CategoryVO> childCategory = new ArrayList<>();
    //=====篇幅原因,省掉Getter和Setter方法======
	......
}
  @Override
    public List<CategoryVO> listCategoryForCustomer(Integer parentId) {
        ArrayList<CategoryVO> categoryVOList = new ArrayList<>();
        recursivelyFindCategories(categoryVOList, parentId);
        return categoryVOList;
    }
	// 以該parentId對應的目錄為根節(jié)點,查詢下面所有子目錄信息,categoryVOList是要返回給前端展示的聚合模型數(shù)據(jù)
    private void recursivelyFindCategories(List<CategoryVO> categoryVOList, Integer parentId) {
        // 遞歸獲取所有子類別,并組合成為一個"目錄樹"
        List<Category> list= categoryMapper.selectCategoriesByParentId(parentId); // 通過父id查詢子分類
        if (!CollectionUtils.isEmpty(list)) {
            for (int i = 0; i < list.size(); ++i) {
                Category category = list.get(i);
                CategoryVO categoryVO = new CategoryVO();
                BeanUtils.copyProperties(category, categoryVO);
                categoryVOList.add(categoryVO);
                // 這里當前目錄id作為下一次的父id,查詢有沒有對應的子目錄,getChildCategory()方法是返回定義的List<CategoryVO> childCategory
                recursivelyFindCategories(categoryVO.getChildCategory(), categoryVO.getId());
            }
        }
    }

XML文件如下:

......
  <resultMap id="BaseResultMap" type="com.me.mall.model.pojo.Category">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="type" jdbcType="INTEGER" property="type" />
    <result column="parent_id" jdbcType="INTEGER" property="parentId" />
    <result column="order_num" jdbcType="INTEGER" property="orderNum" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
  </resultMap>
  <sql id="Base_Column_List">
    id, `name`, `type`, parent_id, order_num, create_time, update_time
  </sql>
  <select id="selectCategoriesByParentId" parameterType="int" resultMap="BaseResultMap">
    select <include refid="Base_Column_List"/>
    from category
    where parent_id = #{parentId}
  </select>
  ......

我們手動查詢模擬一下遞歸的過程,首先查詢parent_id3的二級分類

select *
from category
where parent_id = 3

在這里插入圖片描述

結果遞歸查詢的時候,又會發(fā)現(xiàn)parent_id=4時還有數(shù)據(jù),即還有三級分類,我們手動查詢試試

select *
from category
where parent_id = 4

在這里插入圖片描述

示例數(shù)據(jù)如下:

{
    "status": 10000,
    "msg": "SUCCESS",
    "data": [
        {
            "id": 4,
            "name": "橘子橙子",
            "type": 2, <=================代表二級目錄
            "parentId": 3,
            "orderNum": 1,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:10.000+0000",
            "childCategory": [ <===============代表還有三級目錄
                {
                    "id": 19,
                    "name": "果凍橙",
                    "type": 3,
                    "parentId": 4,
                    "orderNum": 1,
                    "createTime": "2019-12-17T17:17:00.000+0000",
                    "updateTime": "2020-02-10T16:37:02.000+0000",
                    "childCategory": []
                }
            ]
        },
        {
            "id": 11,
            "name": "草莓",
            "type": 2,
            "parentId": 3,
            "orderNum": 2,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T07:44:42.000+0000",
            "childCategory": []
        },
        {
            "id": 12,
            "name": "奇異果",
            "type": 2,
            "parentId": 3,
            "orderNum": 3,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:12.000+0000",
            "childCategory": []
        },
        {
            "id": 14,
            "name": "車厘子",
            "type": 2,
            "parentId": 3,
            "orderNum": 4,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:12.000+0000",
            "childCategory": []
        },
        {
            "id": 28,
            "name": "其他水果",
            "type": 2,
            "parentId": 3,
            "orderNum": 4,
            "createTime": "2019-12-17T17:17:00.000+0000",
            "updateTime": "2019-12-28T08:25:12.000+0000",
            "childCategory": []
        }
    ]
}

到此這篇關于當Mybatis遇上目錄樹有哪些解決方法的文章就介紹到這了,更多相關Mybatis目錄樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)將圖片上傳到webapp路徑下 路徑獲取方式

    Java實現(xiàn)將圖片上傳到webapp路徑下 路徑獲取方式

    這篇文章主要介紹了Java實現(xiàn)將圖片上傳到webapp路徑下 路徑獲取方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java利用TreeUtils工具類實現(xiàn)列表轉樹

    Java利用TreeUtils工具類實現(xiàn)列表轉樹

    在開發(fā)過程中,總有列表轉樹的需求,幾乎是項目的標配,有沒有一種通用且跨項目的解決方式呢?本文將基于Java8的Lambda?表達式和Stream等知識,使用TreeUtils工具類實現(xiàn)一行代碼完成列表轉樹這一通用型需求,需要的可以參考一下
    2022-11-11
  • Java利用Request請求如何獲取IP地址對應的省份、城市詳解

    Java利用Request請求如何獲取IP地址對應的省份、城市詳解

    之前已經(jīng)給大家介紹了關于Java用Request請求獲取IP地址的相關內(nèi)容,那么下面這篇文章將給大家進入深入的介紹,關于Java利用Request請求如何獲取IP地址對應省份、城市的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • Java Eureka探究細枝末節(jié)

    Java Eureka探究細枝末節(jié)

    Eureka是Netflix開發(fā)的服務發(fā)現(xiàn)框架,本身是一個基于REST的服務,主要用于定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的
    2022-09-09
  • Java中幾種常用數(shù)據(jù)庫連接池的使用

    Java中幾種常用數(shù)據(jù)庫連接池的使用

    數(shù)據(jù)庫連接池在編寫應用服務是經(jīng)常需要用到的模塊,太過頻繁的連接數(shù)據(jù)庫對服務性能來講是一個瓶頸,使用緩沖池技術可以來消除這個瓶頸,本文就來介紹Java常見的幾種,感興趣的可以了解一下
    2021-05-05
  • MyBatis動態(tài)SQL特性詳解

    MyBatis動態(tài)SQL特性詳解

    動態(tài)SQL可以省略很多拼接SQL的步驟,使用類似于JSTL方式,下面這篇文章主要給大家介紹了關于Mybatis動態(tài)SQL特性的相關資料,文字通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • SpringBoot搭建全局異常攔截

    SpringBoot搭建全局異常攔截

    這篇文章主要介紹了SpringBoot搭建全局異常攔截,本文通過詳細的介紹與代碼的展示,詳細的說明了如何搭建該項目,包括創(chuàng)建,啟動和測試步驟,需要的朋友可以參考下
    2021-06-06
  • java double類型相加精度問題的解決

    java double類型相加精度問題的解決

    這篇文章主要介紹了java double類型相加精度問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java?byte數(shù)組轉String的幾種常用方法

    java?byte數(shù)組轉String的幾種常用方法

    在Java中數(shù)組是一種非常常見的數(shù)據(jù)結構,它可以用來存儲多個相同類型的數(shù)據(jù),有時候,我們需要將數(shù)組轉換為字符串,以便于輸出或者傳遞給其他方法,這篇文章主要給大家介紹了關于java?byte數(shù)組轉String的幾種常用方法,需要的朋友可以參考下
    2024-09-09
  • Java中流的有關知識點詳解

    Java中流的有關知識點詳解

    今天小編就為大家分享一篇關于Java中流的有關知識點詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論

石林| 安义县| 阿城市| 措美县| 会昌县| 分宜县| 永仁县| 新丰县| 顺义区| 巩义市| 丹巴县| 报价| 易门县| 来凤县| 济宁市| 封丘县| 镇原县| 偏关县| 吉隆县| 峨眉山市| 三河市| 深泽县| 科技| 汉川市| 盐池县| 泸水县| 呼伦贝尔市| 竹山县| 正镶白旗| 吴江市| 花莲市| 镇安县| 綦江县| 确山县| 临澧县| 定州市| 南安市| 拜城县| 菏泽市| 晋中市| 宜城市|