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

Mybatis分步查詢的實(shí)現(xiàn)示例

 更新時間:2023年07月09日 16:26:03   作者:java_t_t  
本文主要介紹了Mybatis分步查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我們需要查詢的數(shù)據(jù)分布在多個表中時,我們可以采用聯(lián)表,但有時候聯(lián)表語句比較復(fù)雜,或者聯(lián)表后的數(shù)據(jù)集太大,不但性能上可能會有問題,維護(hù)起來也很麻煩。

Mybatis提供了分步查詢的功能。分步查詢可以將復(fù)雜的聯(lián)表查詢分解成多個單表(或多個簡單的聯(lián)表)查詢,維護(hù)起來更容易,還可以實(shí)現(xiàn)延遲加載,節(jié)省資源。

Mybatis的分步查詢的分步執(zhí)行流程是:執(zhí)行上層的查詢語句,如果有n條數(shù)據(jù)數(shù)據(jù),m個分步查詢,則分n次依次執(zhí)行這m個分步查詢語句,也就是總共執(zhí)行n × m個分步查詢語句;如果某個分步查詢語句也有自身的分步查詢,則先執(zhí)行完自身的分步查詢再執(zhí)行下一個分步查詢,也就是采用深度遞歸的方式執(zhí)行。

代碼:

分步查詢典型用法:

最上層的查詢:

? ? <select id="listClassInfos" resultMap="listClassInfosMap">
? ? ? ? SELECT `id`, `name` FROM `class_info` WHERE NAME LIKE CONCAT('%', #{name}, '%') LIMIT #{pageStart}, #{pageSize}
? ? </select>
? ? <resultMap id="listClassInfosMap" type="com.example.study.vo.ClassInfoVo">
? ? ? ? <id column="id" property="id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
? ? ? ? <result column="name" property="name" jdbcType="VARCHAR" javaType="java.lang.String"/>
? ? ? ? <!-- 分步查詢1:select可以引用其它Mapper已有的查詢語句,需要寫全路徑 -->
? ? ? ? <association property="master" column="{classId = id}"
? ? ? ? ? ? ? ? ? ? ?select="com.example.study.mapper.ClassMasterInfoMapper.getMasterByClassId"/>
? ? ? ? <!-- 分步查詢2:select也可以引用本Mapper的查詢語句,不需要寫全路徑 -->
? ? ? ? <collection property="students" column="{classId = id}" select="listStudentsByClassId"/>
? ? ? ? <!-- 以上兩個分步查詢都可以添加fetchType="lazy"配置,在該查詢中開啟延遲加載,否則為全局默認(rèn) -->
? ? </resultMap>
? ? <select id="listStudentsByClassId" resultType="com.example.study.entity.StudentInfoEntity">
? ? ? ? SELECT
? ? ? ? `id` as `id`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`,
? ? ? ? `class_id` as `classId`
? ? ? ? FROM `student_info`
? ? ? ? WHERE `class_id` = #{classId}
? ? </select>
ClassMasterInfoMapper.xml中的查詢:
? ? <select id="getMasterByClassId" resultMap="getMasterByClassIdMap">
? ? ? ? SELECT
? ? ? ? `id` as `id`,
? ? ? ? `class_id` as `classId`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`
? ? ? ? FROM `class_master_info`
? ? ? ? WHERE `class_id` = #{classId}
? ? </select>
? ? <resultMap id="getMasterByClassIdMap" type="com.example.study.entity.ClassMasterInfoEntity">
? ? ? ? <id column="id" property="id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
? ? ? ? <result column="name" property="name" jdbcType="VARCHAR" javaType="java.lang.String"/>
? ? ? ? <result column="sex" property="sex" jdbcType="VARCHAR" javaType="java.lang.String"/>
? ? ? ? <!-- 分步查詢1:select可以引用其它Mapper已有的查詢語句,需要寫全路徑 -->
? ? ? ? <association property="self" column="{selfId = id}" select="self"/>
? ? </resultMap>
? ? <select id="self" resultType="com.example.study.entity.ClassMasterInfoEntity">
? ? ? ? SELECT
? ? ? ? `id` as `id`,
? ? ? ? `class_id` as `classId`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`
? ? ? ? FROM `class_master_info`
? ? ? ? WHERE `id` = #{selfId}
? ? </select>

當(dāng)最上層查詢到2條數(shù)據(jù)時,sql執(zhí)行順序和內(nèi)容如下(從org.apache.ibatis.mapping.MappedStatement.getBoundSql(Object parameterObject方法打斷點(diǎn),執(zhí)行boundSql.getSql()獲得執(zhí)行的sql內(nèi)容):

# 第1個sql:查詢最上層的數(shù)據(jù),查到2條數(shù)據(jù)
SELECT `id`, `name` FROM `class_info` WHERE NAME LIKE CONCAT('%', ?, '%') LIMIT ?, ?
# 第2個sql:第1條數(shù)據(jù),第1個子查詢
SELECT
? ? ? ? `id` as `id`,
? ? ? ? `class_id` as `classId`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`
? ? ? ? FROM `class_master_info`
? ? ? ? WHERE `class_id` = ?
# 第3個sql:第1條數(shù)據(jù),第1個子查詢的第1個子查詢(只有一個)
SELECT
? ? ? ? `id` as `id`,
? ? ? ? `class_id` as `classId`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`
? ? ? ? FROM `class_master_info`
? ? ? ? WHERE `id` = ?
# 第4個sql:第1條數(shù)據(jù),第2個子查詢
SELECT
? ? ? ? `id` as `id`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`,
? ? ? ? `class_id` as `classId`
? ? ? ? FROM `student_info`
? ? ? ? WHERE `class_id` = ?
# 第5個sql:第2條數(shù)據(jù),第1個子查詢
SELECT
? ? ? ? `id` as `id`,
? ? ? ? `class_id` as `classId`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`
? ? ? ? FROM `class_master_info`
? ? ? ? WHERE `class_id` = ?
# 第6個sql:第2條數(shù)據(jù),第1個子查詢的第1個子查詢(只有一個)
SELECT
? ? ? ? `id` as `id`,
? ? ? ? `class_id` as `classId`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`
? ? ? ? FROM `class_master_info`
? ? ? ? WHERE `id` = ?
# 第7個sql:第2條數(shù)據(jù),第2個子查詢
SELECT
? ? ? ? `id` as `id`,
? ? ? ? `name` as `name`,
? ? ? ? `sex` as `sex`,
? ? ? ? `class_id` as `classId`
? ? ? ? FROM `student_info`
? ? ? ? WHERE `class_id` = ?

到此這篇關(guān)于Mybatis分步查詢的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Mybatis分步查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java中如何使用日志庫在代碼中添加日志

    詳解Java中如何使用日志庫在代碼中添加日志

    這篇文章主要為大家介紹了Java中如何使用日志庫在代碼中添加日志詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 百度Java面試題 前200頁精選(中)

    百度Java面試題 前200頁精選(中)

    這篇文章主要為大家分享了Java面試資源中篇,百度“Java面試題”前200頁都在這里了,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)

    java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄猨ava中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 基于NIO的Netty網(wǎng)絡(luò)框架(詳解)

    基于NIO的Netty網(wǎng)絡(luò)框架(詳解)

    下面小編就為大家?guī)硪黄贜IO的Netty網(wǎng)絡(luò)框架(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java實(shí)現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)

    Java實(shí)現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)

    本文主要介紹了Java實(shí)現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的全過程

    SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的全過程

    我們開發(fā)業(yè)務(wù)系統(tǒng)的時候,經(jīng)常有那種文檔文件在線預(yù)覽的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java中的logback標(biāo)記日志過濾器MarkerFilter詳解

    Java中的logback標(biāo)記日志過濾器MarkerFilter詳解

    這篇文章主要介紹了Java中的logback標(biāo)記日志過濾器MarkerFilter詳解,在logback-classic中存在一個全局過濾器TurboFilter,TurboFilter是與LoggerContext綁定,會在會在其它過濾器之前執(zhí)行,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)MD5加密的方法

    Java實(shí)現(xiàn)MD5加密的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)MD5加密的方法,實(shí)例分析了基于java實(shí)現(xiàn)md5加密的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • JavaCV 圖像邊緣檢測之Canny 算法詳解

    JavaCV 圖像邊緣檢測之Canny 算法詳解

    在圖像處理中,邊緣檢測是基礎(chǔ)且關(guān)鍵的一環(huán),其中Canny邊緣檢測算法以其高精度和可靠性著稱,本文詳細(xì)介紹了使用JavaCV庫實(shí)現(xiàn)Canny算法的原理和步驟,結(jié)合代碼示例和案例分析,展示了Canny算法在Java環(huán)境下的實(shí)現(xiàn)過程和邊緣檢測效果
    2024-11-11
  • 帶你粗略了解Java數(shù)組的使用

    帶你粗略了解Java數(shù)組的使用

    這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的定義和使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08

最新評論

聂拉木县| 青阳县| 亚东县| 平度市| 甘德县| 池州市| 象州县| 灵石县| 镇宁| 夏津县| 普定县| 五寨县| 云南省| 景东| 福海县| 岳西县| 井冈山市| 石河子市| 乐亭县| 灵丘县| 鄂托克旗| 伊宁县| 宁河县| 曲靖市| 韶山市| 大石桥市| 万源市| 津南区| 湘阴县| 江安县| 额敏县| 衡阳市| 铅山县| 鞍山市| 沾化县| 秭归县| 湖南省| 彭阳县| 靖西县| 旬邑县| 河北省|