溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis嵌套查詢和嵌套結果的區(qū)別是什么

發(fā)布時間:2023-03-15 14:28:43 來源:億速云 閱讀:114 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“mybatis嵌套查詢和嵌套結果的區(qū)別是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    mybatis嵌套查詢和嵌套結果有啥區(qū)別

    嵌套查詢的弊端:即嵌套查詢的N+1問題

    盡管嵌套查詢大量的簡化了存在關聯關系的查詢,但它的弊端也比較明顯:即所謂的N+1問題。關聯的嵌套查詢顯示得到一個結果集,然后根據這個結果集的每一條記錄進行關聯查詢。

    現在假設嵌套查詢就一個(即resultMap內部就一個association標簽),現查詢的結果集返回條數為N,那么關聯查詢語句將會被執(zhí)行N次,加上自身返回結果集查詢1次,共需要訪問數據庫N+1次。

    如果N比較大的話,這樣的數據庫訪問消耗是非常大的!所以使用這種嵌套語句查詢的使用者一定要考慮慎重考慮,確保N值不會很大。

    嵌套結果查詢

    嵌套語句的查詢會導致數據庫訪問次數不定,進而有可能影響到性能。

    Mybatis還支持一種嵌套結果的查詢:即對于一對多,多對多,多對一的情況的查詢,Mybatis通過聯合查詢,將結果從數據庫內一次性查出來,然后根據其一對多,多對一,多對多的關系和ResultMap中的配置,進行結果的轉換,構建需要的對象。

    探索嵌套查詢和嵌套結果這對孿生子的秘密?。?!

    MyBatis在映射文件中加載關聯關系對象主要通過兩種方式:嵌套查詢和嵌套結果。

    嵌套查詢是指通過執(zhí)行另外一條SQL映射語句來返回預期的復雜類型;

    嵌套結果是使用嵌套結果映射來處理重復的聯合結果的子集。開發(fā)人員可以使用上述任意一種方式實現對關聯關系的加載。

    這兩者之間有什么聯系?

    mybatis嵌套查詢和嵌套結果的區(qū)別是什么

    如何理解這些區(qū)別呢?????

    咱們直接代碼來說話。

    <?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.zsj.mapper.PersonMapper">
    	<!-- 嵌套查詢:通過執(zhí)行另外一條SQL映射語句來返回預期的特殊類型 -->
    	<select id="findPersonById" parameterType="Integer" 
                                          resultMap="IdCardWithPersonResult">
    		SELECT * from tb_person where id=#{id}
    	</select>
    	<resultMap type="Person" id="IdCardWithPersonResult">
    		<id property="id" column="id" />
    		<result property="name" column="name" />
    		<result property="age" column="age" />
    		<result property="sex" column="sex" />
    		<!-- 一對一:association使用select屬性引入另外一條SQL語句 -->
    		<association property="card" column="card_id" javaType="IdCard"
    			select="com.zsj.mapper.IdCardMapper.findCodeById" />
    	</resultMap>
    	
    	<!-- 嵌套結果:使用嵌套結果映射來處理重復的聯合結果的子集 -->
    	<select id="findPersonById2" parameterType="Integer" 
    	                                   resultMap="IdCardWithPersonResult2">
    	    SELECT p.*,idcard.code
    	    from tb_person p,tb_idcard idcard
    	    where p.card_id=idcard.id 
    	    and p.id= #{id}
    	</select>
    	<resultMap type="Person" id="IdCardWithPersonResult2">
    	    <id property="id" column="id" />
    	    <result property="name" column="name" />
    	    <result property="age" column="age" />
    	    <result property="sex" column="sex" />
    	    <association property="card" javaType="IdCard">
    	        <id property="id" column="card_id" />
    	        <result property="code" column="code" />
    	    </association>
    	</resultMap>	
    </mapper>

    輸出結果:

    嵌套查詢:

    mybatis嵌套查詢和嵌套結果的區(qū)別是什么

    嵌套結果:

    mybatis嵌套查詢和嵌套結果的區(qū)別是什么

    從上面的調試日志可以看出,兩者不同方式的查詢SQL語句的難易程度和語句數。并且從代碼中不難看出兩者在編寫SQL語句代碼方面不同,嵌套查詢相較于嵌套結果來說,編寫較簡單!

    “mybatis嵌套查詢和嵌套結果的區(qū)別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI