mybatis中的延遲加載類(lèi)型及設(shè)定詳解
概念
MyBatis中的延遲加載,也稱(chēng)為懶加載,是指在進(jìn)行關(guān)聯(lián)查詢(xún)時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún)。延遲加載可以有效的減少數(shù)據(jù)庫(kù)壓力。
延時(shí)加載類(lèi)型及設(shè)定
通過(guò)對(duì)全局參數(shù):lazyLoadingEnabled進(jìn)行設(shè)置,默認(rèn)就是false。 進(jìn)行設(shè)置修改延時(shí)加載狀態(tài)
直接加載: 執(zhí)行完對(duì)主加載對(duì)象的select語(yǔ)句,馬上執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún)。
<settings>
<!-- 延遲加載總開(kāi)關(guān) -->
<setting name="lazyLoadingEnabled" value="false"/>
</settings>
侵入式延遲:執(zhí)行對(duì)主加載對(duì)象的查詢(xún)時(shí),不會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的查詢(xún)。但當(dāng)要訪(fǎng)問(wèn)主加載對(duì)象的
某個(gè)屬性(該屬性不是關(guān)聯(lián)對(duì)象的屬性)時(shí),就會(huì)馬上執(zhí)行關(guān)聯(lián)對(duì)象的select查詢(xún)。
<settings>
<!-- 延遲加載總開(kāi)關(guān) -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延遲加載開(kāi)關(guān) -->
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
**深度延遲:**執(zhí)行對(duì)主加載對(duì)象的查詢(xún)時(shí),不會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的查詢(xún)。訪(fǎng)問(wèn)主加載對(duì)象的詳情時(shí)也不會(huì)執(zhí)行關(guān)聯(lián)對(duì)象的select查詢(xún)。只有當(dāng)真正訪(fǎng)問(wèn)關(guān)聯(lián)對(duì)象的詳情時(shí),才會(huì)執(zhí)行對(duì)關(guān)聯(lián)對(duì)象的select查詢(xún)。
<settings>
<!-- 延遲加載總開(kāi)關(guān) -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延遲加載開(kāi)關(guān) -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
優(yōu)缺點(diǎn)
- 深度延遲加載的使用會(huì)提升性能。
- 如果延遲加載的表數(shù)據(jù)太多,此時(shí)會(huì)產(chǎn)生N+1問(wèn)題,主信息加載一次算1次,而從信息是會(huì)根據(jù)主信息傳遞過(guò)來(lái)的條件,去查詢(xún)從表多次。
延時(shí)加載實(shí)例
需要校驗(yàn)的是 深度延遲的時(shí)候直接調(diào)用bankCardList是否有問(wèn)題
? 首先我們先思考一個(gè)問(wèn)題,假設(shè):在一對(duì)多中,我們有一個(gè)用戶(hù),他有10張銀行卡。
問(wèn)題1:在查詢(xún)用戶(hù)的時(shí)候,要不要把關(guān)聯(lián)的銀行卡查出來(lái)?
問(wèn)題2:在查詢(xún)銀行卡的時(shí)候,要不要把關(guān)聯(lián)的用戶(hù)查出來(lái)?
用戶(hù)類(lèi)及銀行卡類(lèi)
public class User implements Serializable{
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
private List<BankCard> cardList;
get和set方法省略.....
}
public class BankCard implements Serializable{
private Integer id;
private Integer uid;
private String cardNo;
get和set方法省略.....
}
dao層接口
/**
* 查詢(xún)所有的用戶(hù)
*
* @return
*/
List<User> findAll();
xml配置
<resultMap id="userAccountMap" type="com.example.domain.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
<result property="address" column="address"/>
<collection property="bankCardList" ofType="com.example.domain.BankCard" column="id"
select="com.example.dao.BankCardDao.findAllByUid"/>
</resultMap>
<select id="findAll" resultMap="userAccountMap">
SELECT * FROM USER;
</select>
**注意:**主要的功能實(shí)現(xiàn)位于中,對(duì)于銀行卡列表的信息通過(guò)collection集合來(lái)映射,通過(guò)select指定集合中的每個(gè)元素如何查詢(xún),在本例中select的屬性值為BankCardDao.xml文件的namespace com.example.dao.AccountDao路徑以及指定該映射文件下的findAllByUid方法,通過(guò)這個(gè)唯一標(biāo)識(shí)指定集合中元素的查找方式。因?yàn)樵谶@里需要用到根據(jù)用戶(hù)ID查找賬戶(hù),所以需要同時(shí)配置一下findAllByUid方法的實(shí)現(xiàn)。
BankCardDao的實(shí)現(xiàn)
/**
* 根據(jù)用戶(hù)ID查詢(xún)賬戶(hù)信息
* @return
*/
List<BankCard> findAllByUid(Integer uid);
BankCardDao.xml
<select id="findAllByUid" resultType="com.example.domain.BankCard">
SELECT * FROM bank_card WHERE uid = #{uid};
</select>
mybatis開(kāi)啟全局延遲加載配置
configuration>
<settings>
<!--開(kāi)啟全局的懶加載-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--關(guān)閉立即加載,其實(shí)不用配置,默認(rèn)為false-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--開(kāi)啟Mybatis的sql執(zhí)行相關(guān)信息打印-->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<typeAliases>
<typeAlias type="com.example.domain.Account" alias="account"/>
<typeAlias type="com.example.domain.User" alias="user"/>
<package name="com.example.domain"/>
</typeAliases>
<environments default="test">
<environment id="test">
<!--配置事務(wù)-->
<transactionManager type="jdbc"></transactionManager>
<!--配置連接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test1"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--配置映射文件的路徑-->
<mappers>
<mapper resource="com/example/dao/UserDao.xml"/>
<mapper resource="com/example/dao/AccountDao.xml"/>
</mappers>
</configuration>
到此這篇關(guān)于mybatis中的延遲加載類(lèi)型及設(shè)定詳解的文章就介紹到這了,更多相關(guān)mybatis中的延遲加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總
這篇文章主要介紹了Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
MyBatis實(shí)現(xiàn)兩種查詢(xún)樹(shù)形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢(xún))
樹(shù)形結(jié)構(gòu)數(shù)據(jù)在開(kāi)發(fā)中十分常見(jiàn),比如:菜單數(shù)、組織樹(shù), 利用 MyBatis 提供嵌套查詢(xún)功能可以很方便地實(shí)現(xiàn)這個(gè)功能需求。本文主要介紹了兩種方法,感興趣的可以了解一下2021-09-09
Java利用endorsed如何覆蓋jdk提供的類(lèi)詳解
這篇文章主要給大家介紹了關(guān)于Java利用endorsed如何覆蓋jdk提供的類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
使用Swagger2實(shí)現(xiàn)自動(dòng)生成RESTful?API文檔
在開(kāi)發(fā)?RESTful?API?的過(guò)程中,文檔是非常重要的一部分,可以幫助開(kāi)發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實(shí)現(xiàn)自動(dòng)生成?RESTful?API?文檔,需要的可以參考一下2023-06-06
elasticsearch聚合查詢(xún)實(shí)踐示例
這篇文章主要為大家介紹了elasticsearch聚合查詢(xún)實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
JAVA實(shí)現(xiàn)異步調(diào)用實(shí)例代碼
在java平臺(tái),實(shí)現(xiàn)異步調(diào)用的角色主要三種角色:調(diào)用者、取貨憑證、真實(shí)數(shù)據(jù)。本篇文章給大家介紹java實(shí)現(xiàn)異步調(diào)用實(shí)例代碼,需要的朋友可以參考下2015-09-09

