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

MyBatis實(shí)現(xiàn)兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢)

 更新時(shí)間:2021年09月22日 11:09:46   作者:hangge  
樹(shù)形結(jié)構(gòu)數(shù)據(jù)在開(kāi)發(fā)中十分常見(jiàn),比如:菜單數(shù)、組織樹(shù), 利用 MyBatis 提供嵌套查詢功能可以很方便地實(shí)現(xiàn)這個(gè)功能需求。本文主要介紹了兩種方法,感興趣的可以了解一下

    樹(shù)形結(jié)構(gòu)數(shù)據(jù)在開(kāi)發(fā)中十分常見(jiàn),比如:菜單數(shù)、組織樹(shù), 利用 MyBatis 提供嵌套查詢功能可以很方便地實(shí)現(xiàn)這個(gè)功能需求。而其具體地實(shí)現(xiàn)方法又有兩種,下面分別通過(guò)樣例進(jìn)行演示。

方法一:使用嵌套結(jié)果集實(shí)現(xiàn)

1,準(zhǔn)備工作

(1)假設(shè)我們有如下一張菜單表 menu,其中子菜單通過(guò) parendId 與父菜單的 id 進(jìn)行關(guān)聯(lián):  

原文:MyBatis - 兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集、遞歸查詢)

(2)對(duì)應(yīng)的實(shí)體類如下:

@Setter
@Getter
public class Menu {
    private Integer id;
    private String name;
    private List<Menu> children;
}

2,實(shí)現(xiàn)代碼

(1)假設(shè)目前菜單只有兩級(jí),MyBatis 語(yǔ)句如下。其原理是通過(guò)關(guān)聯(lián)查詢,一次性將數(shù)據(jù)查詢出來(lái),然后根據(jù) resultMap 的配置進(jìn)行轉(zhuǎn)換,構(gòu)建目標(biāo)實(shí)體類。

優(yōu)點(diǎn):只由于該方法需要訪問(wèn)一次數(shù)據(jù)庫(kù)就可以了,不會(huì)造成嚴(yán)重的數(shù)據(jù)庫(kù)訪問(wèn)消耗。

<?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.example.demo.mapper.MenuMapper">
    <resultMap type="com.example.demo.bean.Menu" id="BaseResultMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="children" ofType="com.example.demo.bean.Menu">
            <id column="id2" property="id"/>
            <result column="name2" property="name"/>
        </collection>
    </resultMap>
    <select id="getAllMenus" resultMap="BaseResultMap">
        select
            m1.id as id,
            m1.name as name,
            m2.id as id2,
            m2.name as name2
        from menu m1,menu m2
        where m1.`id`=m2.`parentId`
    </select>
</mapper>

最終獲取到的結(jié)果如下:

原文:MyBatis - 兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集、遞歸查詢)

(2)如果菜單有三級(jí)的話,則 MyBatis 語(yǔ)句做如下修改,再增加一個(gè)嵌套結(jié)果級(jí)即可:

<?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.example.demo.mapper.MenuMapper">
    <resultMap type="com.example.demo.bean.Menu" id="BaseResultMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="children" ofType="com.example.demo.bean.Menu">
            <id column="id2" property="id"/>
            <result column="name2" property="name"/>
            <collection property="children" ofType="com.example.demo.bean.Menu">
                <id column="id3" property="id"/>
                <result column="name3" property="name"/>
            </collection>
        </collection>
    </resultMap>
    <select id="getAllMenus" resultMap="BaseResultMap">
        select
            m1.id as id,
            m1.name as name,
            m2.id as id2,
            m2.name as name2,
            m3.id as id3,
            m3.name as name3
        from menu m1,menu m2,menu m3
        where m1.`id`=m2.`parentId` and m2.`id`=m3.`parentId`
    </select>
</mapper>

原文:MyBatis - 兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集、遞歸查詢)

(3)如果菜單級(jí)別不確定,可能只有一級(jí)、或者有兩級(jí)、或者有三級(jí)(最多三級(jí)),可以對(duì) SQL 語(yǔ)句稍作修改,改成左連接即可:

<?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.example.demo.mapper.MenuMapper">
    <resultMap type="com.example.demo.bean.Menu" id="BaseResultMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="children" ofType="com.example.demo.bean.Menu">
            <id column="id2" property="id"/>
            <result column="name2" property="name"/>
            <collection property="children" ofType="com.example.demo.bean.Menu">
                <id column="id3" property="id"/>
                <result column="name3" property="name"/>
            </collection>
        </collection>
    </resultMap>
    <select id="getAllMenus" resultMap="BaseResultMap">
        select
            m1.id as id,
            m1.name as name,
            m2.id as id2,
            m2.name as name2,
            m3.id as id3,
            m3.name as name3
        from menu m1
            left join menu m2 on m1.id=m2.parentId
            left join menu m3 on m2.id=m3.parentId
        where m1.parentId=0
    </select>
</mapper>

原文:MyBatis - 兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集、遞歸查詢)

方法二:使用遞歸查詢實(shí)現(xiàn)

(1)下面代碼使用遞歸查詢出所有菜單(無(wú)論層級(jí)有多深):

    遞歸查詢好處在于簡(jiǎn)單易懂,通過(guò)簡(jiǎn)單的配置就可以達(dá)到目標(biāo)效果。不足之處在于由于需要多次查詢數(shù)據(jù)庫(kù),如果結(jié)果集記錄條數(shù)過(guò)大,會(huì)造成較大的數(shù)據(jù)庫(kù)訪問(wèn)消耗。

<?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.example.demo.mapper.MenuMapper">
    <resultMap type="com.example.demo.bean.Menu" id="BaseResultMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="children" select="findMenuByParentId" column="id"/>
    </resultMap>
 
    <!--級(jí)聯(lián)查詢父菜單-->
    <select id="getAllMenus" resultMap="BaseResultMap" >
         select * from menu where parentId = 0
    </select>
 
    <!--級(jí)聯(lián)查詢子菜單-->
    <select id="findMenuByParentId" resultMap="BaseResultMap" >
         select * from menu where parentId = #{id}
    </select>
</mapper>

原文:MyBatis - 兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集、遞歸查詢)

(2)關(guān)聯(lián)查詢還可以傳遞多個(gè)參數(shù),此時(shí)傳遞部分 column 的值為多個(gè)鍵值對(duì)(由于這里傳遞的 name 其實(shí)沒(méi)有用到,只是做個(gè)演示,下面的查詢結(jié)果同前面的是一樣的):

<?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.example.demo.mapper.MenuMapper">
    <resultMap type="com.example.demo.bean.Menu" id="BaseResultMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <collection property="children" select="findMenuByParentId" column="{id=id,name=name}"/>
    </resultMap>
 
    <!--級(jí)聯(lián)查詢父菜單-->
    <select id="getAllMenus" resultMap="BaseResultMap" >
         select * from menu where parentId = 0
    </select>
 
    <!--級(jí)聯(lián)查詢子菜單-->
    <select id="findMenuByParentId" resultMap="BaseResultMap" >
         select * from menu where parentId = #{id}
    </select>
</mapper>

到此這篇關(guān)于MyBatis實(shí)現(xiàn)兩種查詢樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢)的文章就介紹到這了,更多相關(guān)MyBatis 查詢樹(shù)形數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

宜宾市| 莲花县| 琼结县| 城固县| 维西| 普兰店市| 金溪县| 腾冲县| 花莲市| 安远县| 且末县| 托克逊县| 鹤峰县| 永昌县| 大方县| 昌吉市| 西乌| 澄迈县| 潼南县| 厦门市| 柳江县| 南漳县| 盖州市| 吉安市| 潜山县| 榆社县| 宝坻区| 堆龙德庆县| 泰顺县| 屯门区| 班玛县| 蕉岭县| 兴文县| 汤原县| 邵阳县| 思茅市| 齐齐哈尔市| 台中市| 东光县| 任丘市| 五大连池市|