您好,登錄后才能下訂單哦!
本篇內容介紹了“mybatis嵌套查詢和嵌套結果的區別是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
盡管嵌套查詢大量的簡化了存在關聯關系的查詢,但它的弊端也比較明顯:即所謂的N+1問題。關聯的嵌套查詢顯示得到一個結果集,然后根據這個結果集的每一條記錄進行關聯查詢。
現在假設嵌套查詢就一個(即resultMap內部就一個association標簽),現查詢的結果集返回條數為N,那么關聯查詢語句將會被執行N次,加上自身返回結果集查詢1次,共需要訪問數據庫N+1次。
如果N比較大的話,這樣的數據庫訪問消耗是非常大的!所以使用這種嵌套語句查詢的使用者一定要考慮慎重考慮,確保N值不會很大。
嵌套語句的查詢會導致數據庫訪問次數不定,進而有可能影響到性能。
Mybatis還支持一種嵌套結果的查詢:即對于一對多,多對多,多對一的情況的查詢,Mybatis通過聯合查詢,將結果從數據庫內一次性查出來,然后根據其一對多,多對一,多對多的關系和ResultMap中的配置,進行結果的轉換,構建需要的對象。
MyBatis在映射文件中加載關聯關系對象主要通過兩種方式:嵌套查詢和嵌套結果。
嵌套查詢是指通過執行另外一條SQL映射語句來返回預期的復雜類型;
嵌套結果是使用嵌套結果映射來處理重復的聯合結果的子集。開發人員可以使用上述任意一種方式實現對關聯關系的加載。
這兩者之間有什么聯系?
如何理解這些區別呢?????
咱們直接代碼來說話。
<?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"> <!-- 嵌套查詢:通過執行另外一條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>
輸出結果:
嵌套查詢:
嵌套結果:
從上面的調試日志可以看出,兩者不同方式的查詢SQL語句的難易程度和語句數。并且從代碼中不難看出兩者在編寫SQL語句代碼方面不同,嵌套查詢相較于嵌套結果來說,編寫較簡單!
“mybatis嵌套查詢和嵌套結果的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。