Mybatis分步查詢的實(shí)現(xiàn)示例
我們需要查詢的數(shù)據(jù)分布在多個(gè)表中時(shí),我們可以采用聯(lián)表,但有時(shí)候聯(lián)表語句比較復(fù)雜,或者聯(lián)表后的數(shù)據(jù)集太大,不但性能上可能會(huì)有問題,維護(hù)起來也很麻煩。
Mybatis提供了分步查詢的功能。分步查詢可以將復(fù)雜的聯(lián)表查詢分解成多個(gè)單表(或多個(gè)簡(jiǎn)單的聯(lián)表)查詢,維護(hù)起來更容易,還可以實(shí)現(xiàn)延遲加載,節(jié)省資源。
Mybatis的分步查詢的分步執(zhí)行流程是:執(zhí)行上層的查詢語句,如果有n條數(shù)據(jù)數(shù)據(jù),m個(gè)分步查詢,則分n次依次執(zhí)行這m個(gè)分步查詢語句,也就是總共執(zhí)行n × m個(gè)分步查詢語句;如果某個(gè)分步查詢語句也有自身的分步查詢,則先執(zhí)行完自身的分步查詢?cè)賵?zhí)行下一個(gè)分步查詢,也就是采用深度遞歸的方式執(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"/> ? ? ? ? <!-- 以上兩個(gè)分步查詢都可以添加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ù)時(shí),sql執(zhí)行順序和內(nèi)容如下(從org.apache.ibatis.mapping.MappedStatement.getBoundSql(Object parameterObject方法打斷點(diǎn),執(zhí)行boundSql.getSql()獲得執(zhí)行的sql內(nèi)容):
# 第1個(gè)sql:查詢最上層的數(shù)據(jù),查到2條數(shù)據(jù) SELECT `id`, `name` FROM `class_info` WHERE NAME LIKE CONCAT('%', ?, '%') LIMIT ?, ? # 第2個(gè)sql:第1條數(shù)據(jù),第1個(gè)子查詢 SELECT ? ? ? ? `id` as `id`, ? ? ? ? `class_id` as `classId`, ? ? ? ? `name` as `name`, ? ? ? ? `sex` as `sex` ? ? ? ? FROM `class_master_info` ? ? ? ? WHERE `class_id` = ? # 第3個(gè)sql:第1條數(shù)據(jù),第1個(gè)子查詢的第1個(gè)子查詢(只有一個(gè)) SELECT ? ? ? ? `id` as `id`, ? ? ? ? `class_id` as `classId`, ? ? ? ? `name` as `name`, ? ? ? ? `sex` as `sex` ? ? ? ? FROM `class_master_info` ? ? ? ? WHERE `id` = ? # 第4個(gè)sql:第1條數(shù)據(jù),第2個(gè)子查詢 SELECT ? ? ? ? `id` as `id`, ? ? ? ? `name` as `name`, ? ? ? ? `sex` as `sex`, ? ? ? ? `class_id` as `classId` ? ? ? ? FROM `student_info` ? ? ? ? WHERE `class_id` = ? # 第5個(gè)sql:第2條數(shù)據(jù),第1個(gè)子查詢 SELECT ? ? ? ? `id` as `id`, ? ? ? ? `class_id` as `classId`, ? ? ? ? `name` as `name`, ? ? ? ? `sex` as `sex` ? ? ? ? FROM `class_master_info` ? ? ? ? WHERE `class_id` = ? # 第6個(gè)sql:第2條數(shù)據(jù),第1個(gè)子查詢的第1個(gè)子查詢(只有一個(gè)) SELECT ? ? ? ? `id` as `id`, ? ? ? ? `class_id` as `classId`, ? ? ? ? `name` as `name`, ? ? ? ? `sex` as `sex` ? ? ? ? FROM `class_master_info` ? ? ? ? WHERE `id` = ? # 第7個(gè)sql:第2條數(shù)據(jù),第2個(gè)子查詢 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java的MyBatis框架中實(shí)現(xiàn)多表連接查詢和查詢結(jié)果分頁
- 結(jié)合mybatis-plus實(shí)現(xiàn)簡(jiǎn)單不需要寫sql的多表查詢
- Mybatis中使用in()查詢的方式詳解
- 詳解MyBatis模糊查詢LIKE的三種方式
- Mybatis查不到數(shù)據(jù)查詢返回Null問題
- Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?
- mybatis-plus QueryWrapper自定義查詢條件的實(shí)現(xiàn)
- MyBatis-Plus多表聯(lián)查的實(shí)現(xiàn)方法(動(dòng)態(tài)查詢和靜態(tài)查詢)
- MyBatis查詢返回Map示例代碼
- Mybatis查詢多條記錄并返回List集合的方法
- Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段
相關(guān)文章
Java中redisTemplate注入失敗NullPointerException異常問題解決
這篇文章主要介紹了Java中redisTemplate注入失敗NullPointerException異常問題解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-08-08Struts 2 數(shù)據(jù)校驗(yàn)功能及校驗(yàn)問題的解決方案
這篇文章主要介紹了Struts 2 數(shù)據(jù)校驗(yàn)功能及校驗(yàn)問題的解決方案的相關(guān)資料,需要的朋友可以參考下2016-09-09SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)
本文主要介紹了SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式,包括Tess4J,百度智能云,阿里云,騰訊云這四種,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Springboot輕量級(jí)的監(jiān)控組件SpringbootAdmin
這篇文章主要為大家介紹了Springboot輕量級(jí)的監(jiān)控組件SpringbootAdmin使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java8并發(fā)新特性CompletableFuture
這篇文章主要介紹了Java8并發(fā)新特性CompletableFuture,CompletableFuture針對(duì)Future接口做了改進(jìn),相比Callable/Runnable接口它支持多任務(wù)進(jìn)行鏈?zhǔn)秸{(diào)用、組合、多任務(wù)并發(fā)處理,下面文章更多相關(guān)內(nèi)容得介紹,需要的小伙伴可以參考一下2022-06-06Java之Spring簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象
這篇文章主要介紹了Spring的讀取和存儲(chǔ)對(duì)象,獲取 bean 對(duì)象也叫做對(duì)象裝配,是把對(duì)象取出來放到某個(gè)類中,有時(shí)候也叫對(duì)象注?,想進(jìn)一步了解的同學(xué)可以參考本文2023-04-04SpringBoot整合JPA框架實(shí)現(xiàn)過程講解
在開發(fā)中,我們通常會(huì)對(duì)數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行操作,Sprirng?Boot對(duì)關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的訪問操作都提供了非常好的整合支持2022-12-12