Mybatis分步查詢的實現(xiàn)示例
我們需要查詢的數(shù)據(jù)分布在多個表中時,我們可以采用聯(lián)表,但有時候聯(lián)表語句比較復(fù)雜,或者聯(lián)表后的數(shù)據(jù)集太大,不但性能上可能會有問題,維護(hù)起來也很麻煩。
Mybatis提供了分步查詢的功能。分步查詢可以將復(fù)雜的聯(lián)表查詢分解成多個單表(或多個簡單的聯(lián)表)查詢,維護(hù)起來更容易,還可以實現(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分步查詢的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Mybatis分步查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java的MyBatis框架中實現(xiàn)多表連接查詢和查詢結(jié)果分頁
- 結(jié)合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢
- Mybatis中使用in()查詢的方式詳解
- 詳解MyBatis模糊查詢LIKE的三種方式
- Mybatis查不到數(shù)據(jù)查詢返回Null問題
- Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?
- mybatis-plus QueryWrapper自定義查詢條件的實現(xiàn)
- MyBatis-Plus多表聯(lián)查的實現(xiàn)方法(動態(tài)查詢和靜態(tài)查詢)
- MyBatis查詢返回Map示例代碼
- Mybatis查詢多條記錄并返回List集合的方法
- Mybatis Plus select 實現(xiàn)只查詢部分字段
相關(guān)文章
Java中redisTemplate注入失敗NullPointerException異常問題解決
這篇文章主要介紹了Java中redisTemplate注入失敗NullPointerException異常問題解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2023-08-08Struts 2 數(shù)據(jù)校驗功能及校驗問題的解決方案
這篇文章主要介紹了Struts 2 數(shù)據(jù)校驗功能及校驗問題的解決方案的相關(guān)資料,需要的朋友可以參考下2016-09-09SpringBoot實現(xiàn)圖片識別文字的四種方式小結(jié)
本文主要介紹了SpringBoot實現(xiàn)圖片識別文字的四種方式,包括Tess4J,百度智能云,阿里云,騰訊云這四種,具有一定的參考價值,感興趣的可以了解一下2024-02-02Springboot輕量級的監(jiān)控組件SpringbootAdmin
這篇文章主要為大家介紹了Springboot輕量級的監(jiān)控組件SpringbootAdmin使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java8并發(fā)新特性CompletableFuture
這篇文章主要介紹了Java8并發(fā)新特性CompletableFuture,CompletableFuture針對Future接口做了改進(jìn),相比Callable/Runnable接口它支持多任務(wù)進(jìn)行鏈?zhǔn)秸{(diào)用、組合、多任務(wù)并發(fā)處理,下面文章更多相關(guān)內(nèi)容得介紹,需要的小伙伴可以參考一下2022-06-06