Mybatis的延遲加載

Mybatis的延遲加載

?一恰梢、什么是延遲加載

延遲加載:  就是在需要用到數(shù)據(jù)時(shí)才進(jìn)行加載佛南,不需要用到數(shù)據(jù)時(shí)就不加載數(shù)據(jù)。延遲加載也稱懶加載.好處:  先從單表查詢嵌言,需要時(shí)再?gòu)年P(guān)聯(lián)表去關(guān)聯(lián)查詢嗅回,大大提高數(shù)據(jù)庫(kù)性能,因?yàn)椴樵儐伪硪汝P(guān)聯(lián)查詢多張表速度要快摧茴。壞處:  因?yàn)橹挥挟?dāng)需要用到數(shù)據(jù)時(shí)绵载,才會(huì)進(jìn)行數(shù)據(jù)庫(kù)查詢,這樣在大批量數(shù)據(jù)查詢時(shí)蓬蝶,因?yàn)椴樵児ぷ饕惨臅r(shí)間尘分,所以可能造成用戶等待時(shí)間變長(zhǎng),造成用戶體驗(yàn)下降丸氛。

二培愁、實(shí)現(xiàn)需求

需求:  查詢賬戶(Account)信息并且關(guān)聯(lián)查詢用戶(User)信息。如果先查詢賬戶(Account)信息即可滿足要求缓窜,當(dāng)我們需要查詢用戶(User)信息時(shí)再查詢用戶(User)信息定续。把對(duì)用戶(User)信息的按需去查詢就是延遲加載『檀福  association私股、collection 具備延遲加載功能。

三恩掷、使用association實(shí)現(xiàn)延遲加載  

需求:

查詢賬戶信息同時(shí)查詢用戶信息倡鲸。

3.1 賬戶的持久層dao接口

package com.llb.dao;import com.llb.domain.Account;import java.util.List;/** * Ceate By llb on 2019/8/7

*/publicinterface AccountMapper {


? ? /**? ? * 查詢賬戶所對(duì)應(yīng)的的用戶

? ? */? ? List findAccountAndUser();

}

3.2 賬戶的持久層映射文件

<?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.llb.dao.AccountMapper">

????<!--定義封裝account和user的resultMap-->

????<resultMap id="accountMap" type="com.llb.domain.Account">

????????<id property="id" column="id"></id>

????????<result property="uid" column="uid"></result>

????????<result property="money" column="money"></result>

????????<!--一對(duì)一的關(guān)系映射 JavaType:對(duì)應(yīng)的是哪個(gè)類 select 指定的內(nèi)容:查詢用戶的唯一標(biāo)識(shí) -->

????????<association property="user" column="uid" javaType="com.llb.domain.User" select="com.llb.dao.UserMapper.findById" ></association> ????</resultMap>

????<select id="findAccountAndUser" resultMap="accountMap"> select * from account </select>

</mapper>

3.3 用戶的持久層接口

package com.llb.dao;import com.llb.domain.User;import java.util.List;/** * 用戶的持久層接口

* Ceate By llb on 2019/8/5

*/publicinterface UserMapper {


? ? /**? ? * 根據(jù)id查詢所有用戶

? ? * @return*/? ? User findById(Integer id);

? ? /**? ? * 查詢出所有用戶,包含賬戶信息

? ? * @return*/? ? List findAccountAndUser();

}

3.4 用戶的持久層映射文件

<?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.llb.dao.UserMapper">? ?

????<!--配置 查詢結(jié)果的列名和實(shí)體類的屬性名的對(duì)應(yīng)關(guān)系-->? ?

????<resultMap id="userMap" type="com.llb.domain.User">? ? ? ?

????????<id property="id" column="id"></id>? ? ? ?

????????<result property="username" column="username"></result>? ? ? ?

????????<result property="address" column="address"></result>? ? ? ?

????????<result property="sex" column="sex"></result>? ? ? ?

????????<result property="birthday" column="birthday"></result>? ? ? ?

????????<!--配置user對(duì)象中accounts集合的映射? ? ? ofType:表示集合的類型-->? ? ? ?

????????<collection property="accounts" ofType="com.llb.domain.Account">? ? ? ? ? ?

????????????<id property="id" column="aid"></id>? ? ? ? ? ?

????????????<result property="uid" column="uid"></result>? ? ? ? ? ?

????????????<result property="money" column="money"></result>? ? ? ?

????????????</collection>? ?????????

????</resultMap>? ? <!--查詢出用戶所對(duì)應(yīng)的賬戶-->? ?

<select id="findAccountAndUser" resultMap="userMap">? ? ? ? select * from user left outer join account on user.id = account.uid? ? </select>? ? <!--根據(jù)id查詢用戶-->? ? <select id="findById" resultType="user" parameterType="int">? ? ? ? select * from user where id = #{id}? ? </select></mapper>


3.5 開啟mybatis的延遲加載策略

進(jìn)入 Mybaits 的官方文檔黄娘,找到 settings 的說(shuō)明信息:


我們需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延遲加載的配置峭状。

? ? <!--配置參數(shù)克滴,延遲加載-->

? ? <settings>

? ? ? ? <!--開啟mybatis支持延遲加載-->

? ? ? ? <setting name="lazyLoadingEnabled" value="true"/>

? ? ? ? <!--不配置也可以:默認(rèn)為false;允許觸發(fā)方法進(jìn)行延遲加載,否則立即加載-->

? ? ? ? <setting name="aggressiveLazyLoading" value="false"></setting>

? ? </settings>

3.6 編寫測(cè)試只查賬戶信息不查用戶信息

*/publicclass AccountTest {

? ? InputStream in =null;

? ? AccountMapper mapper =null;

? ? SqlSession sqlSession =null;

? ? /**? ? * 在測(cè)試方法執(zhí)行前執(zhí)行

? ? * @throws IOException

? ? */? ? @Before

? ? publicvoidinit()throws IOException {

? ? ? ? //1.讀取配置文件优床,生成字節(jié)流in = Resources.getResourceAsStream("SqlMapConfig.xml");

? ? ? ? //2.獲取sqlSessionFactory對(duì)象SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(in);

? ? ? ? //3.獲取sqlSession對(duì)象sqlSession = factory.openSession();

? ? ? ? //4.獲取dao的代理對(duì)象mapper = sqlSession.getMapper(AccountMapper.class);

? ? }

? ? /**? ? * 測(cè)試方法執(zhí)行后執(zhí)行

? ? * @throws IOException

? ? */? ? @After

? ? publicvoiddestory()throws IOException {

? ? ? ? sqlSession.commit();

? ? ? ? //6.釋放資源? ? ? ? sqlSession.close();

? ? ? ? in.close();

? ? }

? ? /**? ? * 查詢出賬戶所對(duì)應(yīng)的user

? ? */? ? @Test

? ? publicvoid testFindAccountAndUser(){

? ? ? ? List accountUser = mapper.findAccountAndUser();//? ? ? ? for (Account account: accountUser) {//? ? ? ? ? ? System.out.println(account);//? ? ? ? }? ? }

}


3.7 測(cè)試結(jié)果

當(dāng)不進(jìn)行配置時(shí)劝赔,立即加載,查詢account所對(duì)應(yīng)的user胆敞,一起將user查詢出來(lái):

  配置后着帽,對(duì)account進(jìn)行查詢放入到list集合中,并沒(méi)有涉及到user對(duì)象移层,所以就沒(méi)有發(fā)出 SQL 語(yǔ)句查詢賬戶所關(guān)聯(lián)的 User 對(duì)象的查詢仍翰。:

四、使用collection實(shí)現(xiàn)緩存策略

同樣我們也可以在一對(duì)多關(guān)系配置的<collection>結(jié)點(diǎn)中配置延遲加載策略幽钢。

<collection>結(jié)點(diǎn)中也有 select 屬性歉备,column 屬性。

需求:

????完成加載用戶對(duì)象時(shí)匪燕,查詢?cè)撚脩羲鶕碛械馁~戶信息蕾羊。

4.1 在User實(shí)體類中加入List<Account>屬性

package com.llb.domain;import java.io.Serializable;

import java.util.Date;import java.util.List;/** * Ceate By llb on 2019/8/5

*/publicclassUserimplements Serializable{

? ? private Integer id;

? ? private String username;

? ? private String address;

? ? private String sex;

? ? private Date birthday;

? ? //一對(duì)多關(guān)系。一的方包含多的一方所有對(duì)象privateList accounts;

? ? @Override

? ? public String toString() {

? ? ? ? return"User{" +? ? ? ? ? ? ? ? "id=" + id +? ? ? ? ? ? ? ? ", username='" + username + '\'' +? ? ? ? ? ? ? ? ", address='" + address + '\'' +? ? ? ? ? ? ? ? ", sex='" + sex + '\'' +? ? ? ? ? ? ? ? ", birthday=" + birthday +? ? ? ? ? ? ? ? ", accounts=" + accounts +? ? ? ? ? ? ? ? '}';

? ? }

? ? publicList getAccounts() {

? ? ? ? return accounts;

? ? }

? ? publicvoidsetAccounts(List accounts) {

? ? ? ? this.accounts = accounts;

? ? }

? ? public Integer getId() {

? ? ? ? return id;

? ? }

? ? publicvoid setId(Integer id) {

? ? ? ? this.id = id;

? ? }

? ? public String getUsername() {

? ? ? ? return username;

? ? }

? ? publicvoid setUsername(String username) {

? ? ? ? this.username = username;

? ? }

? ? public String getAddress() {

? ? ? ? return address;

? ? }

? ? publicvoid setAddress(String address) {

? ? ? ? this.address = address;

? ? }

? ? public String getSex() {

? ? ? ? return sex;

? ? }

? ? publicvoid setSex(String sex) {

? ? ? ? this.sex = sex;

? ? }

? ? public Date getBirthday() {

? ? ? ? return birthday;

? ? }

? ? publicvoid setBirthday(Date birthday) {

? ? ? ? this.birthday = birthday;

? ? }

}

4.2 編寫用戶接口和配置文件

UserMapper.class:

package com.llb.dao;import com.llb.domain.User;import java.util.List;/** * 用戶的持久層接口

* Ceate By llb on 2019/8/5

*/publicinterface UserMapper {

? ? /**? ? * 根據(jù)id查詢所有用戶

? ? * @return*/? ? User findById(Integer id);

? ? /**? ? * 查詢出所有用戶帽驯,包含賬戶信息

? ? * @return*/? ? List findAccountAndUser();

}

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="com.llb.dao.UserMapper">

<!--配置 查詢結(jié)果的列名和實(shí)體類的屬性名的對(duì)應(yīng)關(guān)系-->

<resultMap id="userMap" type="com.llb.domain.User">

<id property="id" column="id"></id>

<result property="username" column="username">

????</result> <result property="address" column="address">

????</result> <result property="sex" column="sex">

????</result> <result property="birthday" column="birthday">

</result>

<!--配置user對(duì)象中accounts集合的映射 ofType:表示集合的類型-->

????<collection property="accounts" ofType="com.llb.domain.Account" select="com.llb.dao.AccountMapper.findAccountById" column="id"> </collection>

</resultMap> <!--查詢出用戶所對(duì)應(yīng)的賬戶-->

????<select id="findAccountAndUser" resultMap="userMap">

????????select * from user

????</select>

????<!--根據(jù)id查詢用戶-->

????<select id="findById" resultType="user" parameterType="int">

????????select * from user where id = #{id}

????</select>

</mapper>

4.3 使用測(cè)試方法進(jìn)行測(cè)試

publicclass UserTest {

? ? InputStream in =null;

? ? UserMapper mapper =null;

? ? SqlSession sqlSession =null;

? ? /**? ? * 在測(cè)試方法執(zhí)行前執(zhí)行

? ? * @throws IOException

? ? */? ? @Before

? ? publicvoidinit()throws IOException {

? ? ? ? //1.讀取配置文件龟再,生成字節(jié)流in = Resources.getResourceAsStream("SqlMapConfig.xml");

? ? ? ? //2.獲取sqlSessionFactory對(duì)象SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(in);

? ? ? ? //3.獲取sqlSession對(duì)象sqlSession = factory.openSession();

? ? ? ? //4.獲取dao的代理對(duì)象mapper = sqlSession.getMapper(UserMapper.class);

? ? }

? ? /**? ? * 測(cè)試方法執(zhí)行后執(zhí)行

? ? * @throws IOException

? ? */? ? @After

? ? publicvoiddestory()throws IOException {

? ? ? ? sqlSession.commit();

? ? ? ? //6.釋放資源? ? ? ? sqlSession.close();

? ? ? ? in.close();

? ? }

? ? /**? ? * 查詢出所有用戶所對(duì)應(yīng)的賬戶

? ? */? ? @Test

? ? publicvoid findUserAndAccount(){

? ? ? ? List users = mapper.findAccountAndUser();

? ? ? ? }

}

測(cè)試結(jié)果:

  我們沒(méi)有使用Accout,也只對(duì)User進(jìn)行了查詢尼变。

Mybatis緩存

待更新利凑。。嫌术。

源碼:https://github.com/PopsiCola/SSM-mybatis/tree/association_lazy

歡迎star

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哀澈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子度气,更是在濱河造成了極大的恐慌割按,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磷籍,死亡現(xiàn)場(chǎng)離奇詭異适荣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)院领,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門弛矛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人比然,你說(shuō)我怎么就攤上這事丈氓。” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵万俗,是天一觀的道長(zhǎng)鱼鼓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)该编,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任硕淑,我火速辦了婚禮课竣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘置媳。我一直安慰自己于樟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布拇囊。 她就那樣靜靜地躺著迂曲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寥袭。 梳的紋絲不亂的頭發(fā)上路捧,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音传黄,去河邊找鬼杰扫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膘掰,可吹牛的內(nèi)容都是我干的章姓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼识埋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凡伊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起窒舟,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤系忙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辜纲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笨觅,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年耕腾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了见剩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扫俺,死狀恐怖苍苞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤羹呵,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布骂际,位于F島的核電站,受9級(jí)特大地震影響冈欢,放射性物質(zhì)發(fā)生泄漏歉铝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一凑耻、第九天 我趴在偏房一處隱蔽的房頂上張望太示。 院中可真熱鬧,春花似錦香浩、人聲如沸类缤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)餐弱。三九已至,卻和暖如春囱晴,著一層夾襖步出監(jiān)牢的瞬間膏蚓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工速缆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留降允,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓艺糜,卻偏偏與公主長(zhǎng)得像剧董,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子破停,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Mybatis介紹 MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache...
    day_Sunny閱讀 2,650評(píng)論 0 6
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 翅楼? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,451評(píng)論 0 4
  • mybatis的延遲加載策略 延遲加載:在需要用到數(shù)據(jù)時(shí)才進(jìn)行加載真慢,不需要用到數(shù)據(jù)時(shí)就不加載數(shù)據(jù)毅臊。延遲加載也稱懶加...
    哈哈大圣閱讀 472評(píng)論 0 8
  • MyBatis 理論篇 [TOC] 什么是MyBatis ?MyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射...
    有_味閱讀 2,887評(píng)論 0 26
  • 要事優(yōu)先 這是關(guān)于工作優(yōu)先級(jí)的討論,我其實(shí)認(rèn)為這是時(shí)間管理的一部分黑界。其實(shí)我在把工作劃分成主動(dòng)工作和被動(dòng)工作后管嬉,主動(dòng)...
    張瑞Jerrysher閱讀 205評(píng)論 0 1