Mybatis分步查詢的實(shí)現(xiàn)示例
我們需要查詢的數(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)文章希望大家以后多多支持腳本之家!
- Java的MyBatis框架中實(shí)現(xiàn)多表連接查詢和查詢結(jié)果分頁
- 結(jié)合mybatis-plus實(shí)現(xià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)方法(動態(tài)查詢和靜態(tài)查詢)
- MyBatis查詢返回Map示例代碼
- Mybatis查詢多條記錄并返回List集合的方法
- Mybatis Plus select 實(shí)現(xiàn)只查詢部分字段
相關(guān)文章
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ò)框架(詳解)
下面小編就為大家?guī)硪黄贜IO的Netty網(wǎng)絡(luò)框架(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
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ù)覽功能的全過程
我們開發(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詳解,在logback-classic中存在一個全局過濾器TurboFilter,TurboFilter是與LoggerContext綁定,會在會在其它過濾器之前執(zhí)行,需要的朋友可以參考下2023-11-11

