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

Mybatis分解式查詢使用方法

 更新時(shí)間:2023年04月12日 10:42:56   作者:會(huì)洗碗的CV工程師  
這篇文章主要介紹了Mybatis分解式查詢使用方法,分解式查詢就是將一條Sql語(yǔ)句拆分成多條。在 MyBatis 多表查詢中,使用連接查詢時(shí)一個(gè) Sql 語(yǔ)句就可以查詢出所有的數(shù)據(jù)

一、Mybatis一對(duì)多分解式查詢

分解式查詢就是將一條Sql語(yǔ)句拆分成多條

在MyBatis多表查詢中,使用連接查詢時(shí)一個(gè)Sql語(yǔ)句就可以查詢出所有的數(shù)據(jù)。如:

# 查詢班級(jí)時(shí)關(guān)聯(lián)查詢出學(xué)生

select *

from classes

left join student

on student.classId = classes.cid

也可以使用分解式查詢,即將一個(gè)連接Sql語(yǔ)句分解為多條Sql語(yǔ)句,如:

# 查詢班級(jí)時(shí)關(guān)聯(lián)查詢出學(xué)生

select * from classes;

select * from student where classId = 1;

select * from student where classId = 2;

這種寫法也叫N+1查詢。

連接查詢:

優(yōu)點(diǎn):降低查詢次數(shù),從而提高查詢效率。

缺點(diǎn):如果查詢返回的結(jié)果集較多會(huì)消耗內(nèi)存空間。

N+1查詢:

優(yōu)點(diǎn):結(jié)果集分步獲取,節(jié)省內(nèi)存空間。

缺點(diǎn):由于需要執(zhí)行多次查詢,相比連接查詢效率低。

我們以查詢班級(jí)時(shí)關(guān)聯(lián)查詢出學(xué)生為例,使用N+1查詢:

1. 新增持久層接口方法

新增ClassesMapper2.java接口

package com.example.mapper;
import com.example.pojo.Classes;
import java.util.List;
public interface ClassesMapper2 {
    List<Classes> findAll();
}

新增StudentMapper.java接口

package com.example.mapper;
import com.example.pojo.Student;
import java.util.List;
public interface StudentMapper2 {
    List<Student> findByClassId(int classId);
}

2. 新增映射文件對(duì)應(yīng)的標(biāo)簽

新增ClassesMapper.xml映射文件

<?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.mapper.ClassesMapper2">
    <!-- 自定義映射關(guān)系 -->
    <resultMap id="myClassesMapper" type="com.example.pojo.Classes">
        <id property="cid" column="cid"/>
        <result property="className" column="className"/>
        <!-- select: 從表查詢調(diào)用的方法 column:調(diào)用方法時(shí)傳入的參數(shù)字段 -->
        <collection property="studentList" column="cid"
                    ofType="com.example.pojo.Student"
                    select="com.example.mapper.StudentMapper2.findByClassId"/>
    </resultMap>
    <select id="findAll" resultMap="myClassesMapper">
        select * from classes
    </select>
</mapper>

新增StudentMapper.xml映射文件

<?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.mapper.StudentMapper2">
    <select id="findByClassId"
            parameterType="int"
            resultType="com.example.pojo.Student">
        select * from student where classId = ${classId}
    </select>
</mapper>

3. 新增測(cè)試方法

// 分解式查詢一對(duì)多
    @Test
    public void testFindAllClasses2(){
        ClassesMapper2 classesMapper2 = session.getMapper(ClassesMapper2.class);
        List<Classes> all = classesMapper2.findAll();
        all.forEach(System.out::println);
    }

4. 運(yùn)行效果

在這里我們可以看到確實(shí)是分開了了兩條查詢語(yǔ)句

二、Mybatis一對(duì)一分解式查詢

查詢學(xué)生時(shí)關(guān)聯(lián)查詢出班級(jí)也可以使用分解式查詢,首先將查詢語(yǔ)句分開:

select * from student;

select * from classes where cid = ?

1. 新增持久層接口方法

新增StudentMapper3.java接口

package com.example.mapper;
import com.example.pojo.Student;
import java.util.List;
public interface StudentMapper3 {
    // 查詢所有學(xué)生
    List<Student> findAll();
}

新增ClassesMapper3.java接口

package com.example.mapper;
import com.example.pojo.Classes;
import java.util.List;
public interface ClassesMapper3 {
    // 根據(jù)ID查詢班級(jí)
    Classes findById(int cid);
}

2. 新增映射文件對(duì)應(yīng)的標(biāo)簽

新增ClassesMapper.xml映射文件

<?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.mapper.ClassesMapper3">
    <select id="findByCid"
            resultType="com.example.pojo.Classes"
            parameterType="int">
        select * from classes where cid = ${cid}
    </select>
</mapper>

新增StudentMapper.xml映射文件

<?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.mapper.StudentMapper3">
    <!-- 自定義映射關(guān)系 -->
    <resultMap id="MyClassesMapper" type="com.example.pojo.Student">
        <id property="sid" column="sid"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <!-- select: 從表查詢調(diào)用的方法 column:調(diào)用方法時(shí)傳入的參數(shù)字段 -->
        <association property="classes" column="classId"
                     javaType="com.example.pojo.Classes"
                     select="com.example.mapper.ClassesMapper3.findByCid"/>
    </resultMap>
    <select id="findAll" resultMap="MyClassesMapper">
        select * from student
    </select>
</mapper>

3. 新增測(cè)試方法

// 分解式查詢一對(duì)一
    @Test
    public void testFindAllStudent2(){
        StudentMapper3 studentMapper3 = session.getMapper(StudentMapper3.class);
        List<Student> all = studentMapper3.findAll();
        all.forEach(System.out::println);
    }

4. 運(yùn)行效果

OK,確實(shí)是查詢出來(lái)了。

三、Mybatis延遲加載

分解式查詢又分為兩種加載方式:

立即加載:在查詢主表時(shí)就執(zhí)行所有的Sql語(yǔ)句。

延遲加載:又叫懶加載,首先執(zhí)行主表的查詢語(yǔ)句,使用從表數(shù)據(jù)時(shí)才觸發(fā)從表的查詢語(yǔ)句。

延遲加載在獲取關(guān)聯(lián)數(shù)據(jù)時(shí)速度較慢,但可以節(jié)約資源,即用即取。

1. 開啟延遲加載

設(shè)置所有的N+1查詢都為延遲加載,在Mybatis配置文件中添加以下設(shè)置:

    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="lazyLoadTriggerMethods" value=""/>
    </settings>

設(shè)置某個(gè)方法為延遲加載:

在 <association> 、 <collection> 中添加fetchType屬性設(shè)置加載方式。

lazy:延遲加載;eager:立即加載。

2. 測(cè)試延遲加載

由于打印對(duì)象時(shí)會(huì)調(diào)用對(duì)象的 toString 方法, toString 方法默認(rèn)會(huì)觸發(fā)延遲加載的查詢,所以我們無(wú)法測(cè)試出延遲加載的效果。

我們?cè)谂渲梦募O(shè)置lazyLoadTriggerMethods屬性,該屬性指定對(duì)象的什么方法觸發(fā)延遲加載,設(shè)置為空字符串即可。

測(cè)試方法:

    @Test
    public void testFindAllClasses2(){
        ClassesMapper2 classesMapper2 = session.getMapper(ClassesMapper2.class);
        List<Classes> all = classesMapper2.findAll();
        all.forEach(System.out::println);
        System.out.println("---------------------");
        System.out.println(all.get(0).getStudentList());
    }

運(yùn)行結(jié)果:

OK,這個(gè)很明顯了,就是第一次查詢的時(shí)候沒有將學(xué)生列表查詢出來(lái),等到后續(xù)需要查詢的時(shí)候載查詢。

一般情況下,一對(duì)多查詢使用延遲加載,一對(duì)一查詢使用立即加載。

到此這篇關(guān)于Mybatis分解式查詢使用方法的文章就介紹到這了,更多相關(guān)Mybatis分解式查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis打印的sql日志不寫入到log文件的問(wèn)題及解決

    mybatis打印的sql日志不寫入到log文件的問(wèn)題及解決

    這篇文章主要介紹了mybatis打印的sql日志不寫入到log文件的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用JMeter從JSON響應(yīng)的URL參數(shù)中提取特定值

    使用JMeter從JSON響應(yīng)的URL參數(shù)中提取特定值

    在使用Apache JMeter進(jìn)行API測(cè)試時(shí),我們經(jīng)常需要從JSON格式的響應(yīng)中提取特定字段的值,這可以通過(guò)使用JMeter內(nèi)置的JSON提取器和正則表達(dá)式提取器來(lái)完成,本文介紹JMeter JSON提取特定值的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 教你如何正確了解java三大特性!!!!

    教你如何正確了解java三大特性!!!!

    所有的面向?qū)ο缶幊陶Z(yǔ)言的思路都是差不多的,而這三大特性,則是思路中的支柱點(diǎn),接下來(lái)我就重點(diǎn)講解了一下java三大特性,感興趣的朋友跟隨腳本之家小編一起看看吧
    2021-07-07
  • Java向上取整的幾種常見實(shí)現(xiàn)方法

    Java向上取整的幾種常見實(shí)現(xiàn)方法

    這篇文章主要介紹了Java向上取整的幾種常見實(shí)現(xiàn)方法,包括整數(shù)除法技巧、Math.ceil()函數(shù)、手動(dòng)檢查余數(shù)、位運(yùn)算和使用BigDecimal的setScale方法,每種方法都有其適用場(chǎng)景,選擇合適的方法可以提高代碼的性能和可讀性,需要的朋友可以參考下
    2024-12-12
  • Spring自動(dòng)注入失敗的解決方法

    Spring自動(dòng)注入失敗的解決方法

    這篇文章主要介紹了Spring自動(dòng)注入失敗的解決方法,幫助大家更好的理解和學(xué)習(xí)使用Spring框架,感興趣的朋友可以了解下
    2021-05-05
  • Springboot實(shí)現(xiàn)視頻上傳及壓縮功能

    Springboot實(shí)現(xiàn)視頻上傳及壓縮功能

    這篇文章主要介紹了Springboot實(shí)現(xiàn)視頻上傳及壓縮功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • SpringBoot解決@Component無(wú)法注入其他Bean的問(wèn)題

    SpringBoot解決@Component無(wú)法注入其他Bean的問(wèn)題

    這篇文章主要介紹了SpringBoot解決@Component無(wú)法注入其他Bean的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 淺談SpringBoot @Autowired的兩種注入方式

    淺談SpringBoot @Autowired的兩種注入方式

    本文主要介紹了兩種SpringBoot @Autowired注入方式,具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • 從0到1學(xué)SpringCloud之SpringCloud?gateway網(wǎng)關(guān)路由配置示例詳解

    從0到1學(xué)SpringCloud之SpringCloud?gateway網(wǎng)關(guān)路由配置示例詳解

    Spring?Cloud?Gateway的目標(biāo)提供統(tǒng)一的路由方式且基于Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,?例如:安全、監(jiān)控、指標(biāo)和限流?,這篇文章主要介紹了從0到1學(xué)SpringCloud之SpringCloud?gateway網(wǎng)關(guān)路由配置示例詳解,需要的朋友可以參考下
    2023-04-04
  • SpringBoot 中的異步處理機(jī)制詳解

    SpringBoot 中的異步處理機(jī)制詳解

    本文介紹了異步處理的基礎(chǔ)配置、線程池的自定義以及常見應(yīng)用場(chǎng)景,在實(shí)際應(yīng)用中,異步處理可以有效提升應(yīng)用的性能,改善用戶體驗(yàn),但同時(shí)也需要我們合理管理線程池,確保系統(tǒng)資源的高效利用,感興趣的朋友跟隨小編一起看看吧
    2025-01-01

最新評(píng)論

龙胜| 波密县| 广安市| 桑日县| 安远县| 司法| 丹巴县| 贵南县| 交口县| 乌拉特中旗| 黎平县| 仁化县| 尉犁县| 德化县| 都安| 安龙县| 乌拉特后旗| SHOW| 平陆县| 尼勒克县| 江西省| 葵青区| 安溪县| 新竹市| 西华县| 南部县| 乌恰县| 紫阳县| 龙里县| 合肥市| 蕲春县| 达拉特旗| 桑植县| 菏泽市| 花垣县| 青州市| 蛟河市| 鲁甸县| 治多县| 诸城市| 东兰县|