山東建設(shè)網(wǎng)站首頁(yè)建網(wǎng)站多少錢(qián)
文章目錄
- MyBatis中延遲加載,全局和局部的開(kāi)啟使用與關(guān)閉
- 1、問(wèn)題提出
- 2、延遲加載和立即加載
- 延遲加載
- 立即加載
- 3、三種對(duì)應(yīng)的表關(guān)系中的加載
- 4、打開(kāi)全局延遲加載(實(shí)現(xiàn)一對(duì)一的延遲加載)
- 5、實(shí)現(xiàn)一對(duì)多的延遲加載(將上面設(shè)置的全局延遲加載給注釋掉)
- 編寫(xiě)UserMapper.xml
- 在UserMapper.xml中添加select查詢語(yǔ)句
- 在UserMapper.java中添加屬性
- 編寫(xiě)測(cè)試類
- 延遲加載運(yùn)行結(jié)果如下:
- 6、測(cè)試一對(duì)多的延遲加載,對(duì)比觀察輸出結(jié)果
- 將測(cè)試類中的另一個(gè)想要獲得的信息給注釋掉,如下:
- 運(yùn)行結(jié)果如下:
- 結(jié)論:對(duì)比兩種運(yùn)行結(jié)果可以得到,延遲加載的使用意義:需要獲得什么信息再去執(zhí)行相應(yīng)的sql語(yǔ)句,如果不需要獲得的信息則不會(huì)進(jìn)行加載!
MyBatis中延遲加載,全局和局部的開(kāi)啟使用與關(guān)閉
1、問(wèn)題提出
在之前的文章一對(duì)多中,當(dāng)我們有一個(gè)用戶,他又一百個(gè)賬戶。
(1)在查詢用戶時(shí),要不要把關(guān)聯(lián)的賬戶信息查詢出來(lái)?
(2)在查詢賬戶時(shí),要不要把關(guān)聯(lián)的用戶信息查詢出來(lái)?
對(duì)于第一個(gè)問(wèn)題,我們應(yīng)該是什么時(shí)候需要查詢賬戶信息,才查詢。沒(méi)必要每次查詢用戶信息都把賬戶信息也查詢出來(lái)。因?yàn)槿绻看味疾樵兂鲑~戶信息,對(duì)我們的內(nèi)存開(kāi)銷是很大的,而且每次查詢也都不一定用到賬戶信息。
對(duì)于第二個(gè)問(wèn)題,我們就可以在查詢賬戶信息的時(shí)候查詢出關(guān)聯(lián)的用戶信息,因?yàn)槲覀內(nèi)绻皇菃渭兊馁~戶信息沒(méi)有說(shuō)明用戶是誰(shuí),這對(duì)于我們來(lái)說(shuō)是不友好的。也沒(méi)什么意義,所以在每次查詢賬戶信息的時(shí)候都要顯示出關(guān)聯(lián)的用戶信息。
2、延遲加載和立即加載
第一個(gè)問(wèn)題其實(shí)就是延遲加載。
第二個(gè)問(wèn)題就是立即加載。
延遲加載
在真正的使用數(shù)據(jù)時(shí)才發(fā)起查詢,不用的時(shí)候不查。按需加載(懶加載)。
立即加載
不管用不用,只要一調(diào)用方法,馬上發(fā)起查詢。
3、三種對(duì)應(yīng)的表關(guān)系中的加載
四種表 關(guān)系:一對(duì)一,一對(duì)多,多對(duì)多。
一對(duì)多、多對(duì)多:通常情況下,我們都是采用延遲加載。
多對(duì)一、一對(duì)一:通常情況下,我們都是采用立即加載。
4、打開(kāi)全局延遲加載(實(shí)現(xiàn)一對(duì)一的延遲加載)
這里的項(xiàng)目結(jié)構(gòu)和mybatis關(guān)聯(lián)查詢里面的大部分內(nèi)容是一樣的,我們只需要更改一些配置信息。
更改mybatis-config.xml中的信息
在這里添加兩條setting標(biāo)簽配置信息。根據(jù)mybatis的文檔
需要設(shè)置這兩個(gè)屬性。才能開(kāi)啟延遲加載。
<settings><!-- 打開(kāi)全局延遲加載的開(kāi)關(guān) --><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/> </settings>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置延遲加載策略 --><settings><!-- 打開(kāi)全局延遲加載的開(kāi)關(guān) --><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/></settings><typeAliases><package name="cn.fpl1116.pojo"/></typeAliases><!--使用dev環(huán)境--><environments default="dev"><environment id="dev"><!--事務(wù)--><transactionManager type="JDBC"></transactionManager><!--type="POOLED":連接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value=""/></dataSource></environment></environments><!--加載mapper映射文件--><mappers><package name="cn.fpl1116.mapper"/></mappers>
</configuration>
5、實(shí)現(xiàn)一對(duì)多的延遲加載(將上面設(shè)置的全局延遲加載給注釋掉)
編寫(xiě)UserMapper.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="cn.fpl1116.mapper.UserMapper"><resultMap id="getUserById2Result" type="cn.fpl1116.pojo.User"><id column="id" property="id"></id><result column="username" property="username"/><result column="address" property="address"/><result column="sex" property="sex"/><result column="birthday" property="birthday"/><!--延遲加載的一對(duì)多--><!--property="accountList":屬性名ofType="com.by.pojo.Account":集合的泛型,等價(jià)于resultTypeselect="com.by.mapper.AccountMapper.selectAccountByUid":要調(diào)用的select標(biāo)簽的idcolumn="id":傳遞給select查詢的參數(shù)fetchType="lazy":局部開(kāi)啟懶加載--><collection property="accountList"ofType="cn.fpl1116.pojo.Account"select="cn.fpl1116.mapper.AccountMapper.selectAccountByUid"column="id"fetchType="lazy"></collection></resultMap><select id="getUserById2" parameterType="int" resultMap="getUserById2Result"><!-- SELECT u.*, a.id aid, a.uid uid, a.money money FROM user u LEFT JOIN account a ON u.id=a.uid WHERE u.id=#{id}-->select * from user where id=#{id}</select>
</mapper>
在UserMapper.xml中添加select查詢語(yǔ)句
<select id="selectAccountByUid" parameterType="int" resultType="cn.fpl1116.pojo.Account">SELECT * FROM account WHERE uid=#{uid}</select>
在UserMapper.java中添加屬性
User getUserById2(Integer id);
編寫(xiě)測(cè)試類
@Testpublic void testGetUserById2(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.getUserById2(41);System.out.println(user.getUsername());List<Account> accountList = user.getAccountList();for (Account account : accountList) {System.out.println(account);}}
延遲加載運(yùn)行結(jié)果如下:
6、測(cè)試一對(duì)多的延遲加載,對(duì)比觀察輸出結(jié)果
將測(cè)試類中的另一個(gè)想要獲得的信息給注釋掉,如下:
@Testpublic void testGetUserById2(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.getUserById2(41);System.out.println(user.getUsername());//List<Account> accountList = user.getAccountList();//for (Account account : accountList) {// System.out.println(account);//}}