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

Mybatis中的延遲加載,以及原理分析

 更新時(shí)間:2024年04月17日 11:20:38   作者:程序員JavaWind  
這篇文章主要介紹了Mybatis中的延遲加載以及原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mybatis延遲加載原理

Mybatis 僅支持 association 關(guān)聯(lián)對(duì)象和 collection 關(guān)聯(lián)集合對(duì)象的延遲加載,association 指的就是一對(duì)一,collection 指的就是一對(duì)多查詢。

在 Mybatis配置文件中,可以配置是否啟用延遲加載 lazyLoadingEnabled=true|false。

它的原理是:使用 CGLIB 創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,當(dāng)調(diào)用目標(biāo)方法時(shí),進(jìn)入攔截器方法,比如調(diào)用 a.getB().getName(),攔截器 invoke()方法發(fā)現(xiàn) a.getB()是null 值,那么就會(huì)單獨(dú)發(fā)送事先保存好的查詢關(guān)聯(lián) B 對(duì)象的 sql,把 B 查詢上來,然后調(diào)用 a.setB(b),于是 a 的對(duì)象 b 屬性就有值了,接著完成 a.getB().getName()方法的調(diào)用。這就是延遲加載的基本原理。

當(dāng)然了,不光是 Mybatis,幾乎所有的包括 Hibernate,支持延遲加載的原理都是一樣的。

MyBatis延遲加載(以及可能會(huì)碰到的一些問題)

剛好學(xué)了延遲加載就來做個(gè)記錄

延遲加載(懶加載) 首先需要配置Mybaits-config文件 

<!-- 延遲加載設(shè)置-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>

1.單端關(guān)聯(lián)查詢t添加select  需要在RoleDao中添加findRoleById方法,可無參數(shù)

Role findRoleById(int roleId); //RoleDao中添加
<!--    延遲加載(懶加載)-->
<resultMap id="lazyMap" type="com.demo.entity.User">
    <id column="id" property="id"/>
    <result column="username" property="username"/>
    <result column="password" property="password"/>
    <association property="role" column="role_id" select="com.demo.dao.RoleDao.findRoleById"> 需要在RoleDao里面添加findRoleById方法
    </association>
</resultMap>

<select id="findList" resultMap="lazyMap" >
    select id,
           username,
           password,
           role_id 對(duì)應(yīng)association.column 
    from tb_users
</select>

對(duì)應(yīng)的resultMap配置

<resultMap id="roleMap2" type="com.demo.entity.Role">
    <id column="id" property="id"/>
    <result column="role_name" property="roleName"/>
    <result column="role_state" property="roleState"/>
</resultMap>

<select id="findRoleById" resultMap="roleMap2">
    select id, role_name, role_state
    from tb_role
    where id = #{role_id}
</select>

測(cè)試 正常 輸出關(guān)聯(lián)對(duì)象會(huì)出現(xiàn)多條SQL

List<User> list = mapper.findList();
for (User user : list) {
    System.out.println(user.getId() + ", " + user.getUsername() + ", " + user.getPassword() );
    System.out.println(user.getRole().getId() + ", "+ user.getRole().getRoleName());
}

心得

使用MyBatis3.4.6版本會(huì)出現(xiàn) lazy proxy.這是MyBatis版本問題,之后我把他換成3.5.1之后可以正常運(yùn)行。

如:出現(xiàn)一些其他異常對(duì)應(yīng)的column值寫錯(cuò)了,要一一對(duì)應(yīng) 初學(xué)者設(shè)置column和property最好使用復(fù)制粘貼的方式以免出現(xiàn)其他錯(cuò)誤

優(yōu)點(diǎn):使用延遲加載能夠在不需要關(guān)聯(lián)數(shù)據(jù)的時(shí)候,僅執(zhí)行一條sql 提高執(zhí)行速度(我的理解,如有不對(duì)請(qǐng)多指點(diǎn))

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java順時(shí)針打印矩陣

    Java順時(shí)針打印矩陣

    這篇文章主要為大家詳細(xì)介紹了Java順時(shí)針打印矩陣,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Java深入講解AWT實(shí)現(xiàn)事件處理流程

    Java深入講解AWT實(shí)現(xiàn)事件處理流程

    AWT的事件處理是一種委派式事件處理方式:普通組件(事件源)將整個(gè)事件處理委托給特定的對(duì)象(事件監(jiān)聽器);當(dāng)該事件源發(fā)生指定的事件時(shí),就通知所委托的事件監(jiān)聽器,由事件監(jiān)聽器來處理這個(gè)事件
    2022-04-04
  • springMVC中HttpMessageConverter的具體使用

    springMVC中HttpMessageConverter的具體使用

    HttpMessageConverter,報(bào)文信息轉(zhuǎn)換器,將請(qǐng)求報(bào)文轉(zhuǎn)換為Java對(duì)象,本文主要介紹了springMVC中HttpMessageConverter的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 基于Java的MathML轉(zhuǎn)圖片的方法(示例代碼)

    基于Java的MathML轉(zhuǎn)圖片的方法(示例代碼)

    最近接到一個(gè)新需求mathML轉(zhuǎn)圖片怎么實(shí)現(xiàn)呢?剛開始還真是蒙圈了,不知道怎么實(shí)現(xiàn),今天小編記錄一種基于Java的MathML轉(zhuǎn)圖片的方法,感興趣的朋友一起看看吧
    2021-06-06
  • Springboot靜態(tài)資源的訪問方法介紹

    Springboot靜態(tài)資源的訪問方法介紹

    最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁”問題,通過查資料對(duì)SpringBoot訪問靜態(tài)資源做了總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Spring Boot console log 格式自定義方式

    Spring Boot console log 格式自定義方式

    這篇文章主要介紹了Spring Boot console log 格式自定義方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 詳解Java虛擬機(jī)(JVM)運(yùn)行時(shí)

    詳解Java虛擬機(jī)(JVM)運(yùn)行時(shí)

    JVM(Java虛擬機(jī))是一個(gè)抽象的計(jì)算模型。這篇文章主要介紹了Java虛擬機(jī)(JVM)運(yùn)行時(shí)的相關(guān)知識(shí),需要的朋友可以參考下
    2018-10-10
  • 微信小程序獲取手機(jī)號(hào),后端JAVA解密流程代碼

    微信小程序獲取手機(jī)號(hào),后端JAVA解密流程代碼

    這篇文章主要介紹了微信小程序獲取手機(jī)號(hào),后端JAVA解密流程的代碼,幫助大家更好的利用Java開發(fā),感興趣的朋友可以了解下
    2020-09-09
  • java交換排序之奇偶排序?qū)崿F(xiàn)方法

    java交換排序之奇偶排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了java交換排序之奇偶排序?qū)崿F(xiàn)方法,實(shí)例分析了奇偶排序的原理與具體實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • MyBatis?和?jeesite多表查詢示例詳解

    MyBatis?和?jeesite多表查詢示例詳解

    這篇文章主要介紹了MyBatis?和?jeesite多表查詢,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

莎车县| 当雄县| 石渠县| 苏尼特左旗| 临武县| 兴宁市| 开平市| 嘉峪关市| 溆浦县| 岢岚县| 哈尔滨市| 天等县| 密山市| 徐水县| 永清县| 阳新县| 九龙坡区| 噶尔县| 清徐县| 三河市| 千阳县| 疏附县| 电白县| 大丰市| 阿克苏市| 融水| 申扎县| 建宁县| 永顺县| 枞阳县| 道真| 泰顺县| 茶陵县| 中山市| 鹤岗市| 济宁市| 菏泽市| 海口市| 都匀市| 邵东县| 博爱县|