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

mybatis?查詢方式與效率高低對比

 更新時間:2023年03月15日 14:17:25   作者:遇見的昨天  
這篇文章主要介紹了mybatis?查詢方式與效率高低對比,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

mybatis查詢方式與效率高低

<!--
? ? ?一對一關(guān)聯(lián)查詢
? ? ?select s.id,s.name,s.age,t.name tname ?from student s,teacher t where s.tid=t.id;
? ? ? -->

? ? <!--
? ? ? ? 關(guān)聯(lián)的嵌套 Select 查詢
? ? 問題:
? ? ? ? 這種方式雖然很簡單,但在大型數(shù)據(jù)集或大型數(shù)據(jù)表上表現(xiàn)不佳。這個問題被稱為“N+1 查詢問題”。 概括地講,N+1 查詢問題是這樣子的:
? ? ? ? ? ? 你執(zhí)行了一個單獨(dú)的 SQL 語句來獲取結(jié)果的一個列表(就是“+1”)。
? ? ? ? ? ? 對列表返回的每條記錄,你執(zhí)行一個 select 查詢語句來為每條記錄加載詳細(xì)信息(就是“N”)。
? ? 解決:
? ? ? ? MyBatis 能夠?qū)@樣的查詢進(jìn)行延遲加載,因此可以將大量語句同時運(yùn)行的開銷分散開來。
? ? ? ? (例如: 我需要teacher這個對象的時候就會進(jìn)行加載,如果不需要就不會立即加載(延遲加載))
? ? ? ? ?然而,如果你加載記錄列表之后立刻就遍歷列表以獲取嵌套的數(shù)據(jù),就會觸發(fā)所有的延遲加載查詢,性能可能會變得很糟糕。
? ? -->
? ? <!-- ?關(guān)聯(lián)的嵌套 Select 查詢 ?-->
? ? <resultMap id="studentMap" type="student">
? ? ? ? <id property="id" column="id"/>
? ? ? ? <result property="name" column="name"/>
? ? ? ? <result property="age" column="age"/>
? ? ? ? <association property="teacher" column="tid" javaType="teacher" select="selectTeacherById">
? ? ? ? </association>
? ? </resultMap>

? ? <select id="findAll" resultMap="studentMap">
? ? ? ? select * from student;
? ? </select>
? ? <select id="selectTeacherById" parameterType="int" resultType="teacher" ?>
? ? ? ? select * from ?teacher where id=#{id};
? ? </select>


? ? <!--
? ? ? ? 關(guān)聯(lián)的嵌套 ?結(jié)果映射
?? ??? ?將結(jié)果直接映射 到實(shí)體類中
? ? ? ? 第二種 方式效率比第一種 速度更高
? ? ?-->
? ? <resultMap id="studentMap1" type="student">
? ? ? ? <id property="id" column="id"/>
? ? ? ? <result property="name" column="name"/>
? ? ? ? <result property="age" column="age"/>
? ? ? ? <association property="teacher" javaType="teacher">
? ? ? ? ? ? <id property="id" column="tid"/>
? ? ? ? ? ? <result property="name" column="tname"/>
? ? ? ? </association>
? ? </resultMap>
? ? <select id="selectAll" resultMap="studentMap1">
? ? ? ? select s.id,s.name,s.age,t.name tname ,t.id tid from student s,teacher t where s.tid=t.id;
? ? </select>

------------------------------------------------------------------
<!-- ?一對多 ?關(guān)聯(lián)嵌套 ?結(jié)果映射 ? ?ofType 將數(shù)據(jù)封裝到指定的泛型 ?-->
? ? <resultMap id="teacherMap" type="teacher">
? ? ? ? <id property="id" column="id"/>
? ? ? ? <result property="name" column="name"/>
? ? ? ? <collection property="students" ofType="student" >
? ? ? ? ? ? <id property="id" column="sid"/>
? ? ? ? ? ? <result property="name" column="sname"/>
? ? ? ? ? ? <result property="age" column="sage"/>
? ? ? ? ? ? <result property="tid" column="stid"/>
? ? ? ? </collection>
? ? </resultMap>
? ? <select id="selectTeacherById" ?parameterType="int" ?resultMap="teacherMap">
? ? ? ? ?select t.id ,t.name,s.id sid,s.name sname,s.age sage,s.tid stid
? ? ? ? ?from student s ,teacher t
? ? ? ? ?where s.tid=t.id and t.id=1;
? ? </select>

mybatis提高查詢效率的方式

緩存機(jī)制

1 一級緩存:

當(dāng)mysql連續(xù)執(zhí)行兩次select * from table where id =1;第一次會執(zhí)行sql語句查詢數(shù)據(jù)庫,然后保存到sqlsession緩存,第二次查詢會先從緩存里查找,有的話直接返回不會執(zhí)行sql.

但是如果兩次sql中間增加一次commit操作(insert,delete,update),如:

select * from table where id =1
update table set name = zjw where id =1;
select * from table where id =1

這個時候第一次查詢依然會執(zhí)行sql查詢數(shù)據(jù)庫,但是在執(zhí)行完update后會清空sqlsession里的緩存,原因是避免臟讀,

所以第二次select在緩存里找不到數(shù)據(jù),又會執(zhí)行sql查詢數(shù)據(jù)庫。

2 二級緩存:

二級緩存是基于mapper文件的namaspace,對該mapper的所有sqlsession都共享一個二級緩存,如果兩個mapper的namespace一致,則兩個mapper的所有sqlsession共用一個二級緩存,

步驟:

在全局配置文件mybatis-configuration.xml加入

其次在mapper文件開啟緩存 type里面是緩存類。如果不寫是默認(rèn)的mabatis緩存類,自定義緩存類必須實(shí)現(xiàn)cache接口

需要緩存的pojo實(shí)體類要實(shí)現(xiàn)serializable接口,因?yàn)樵诰彺嬷腥〕鰯?shù)據(jù)映射到pojo類需要反序列化。

不同的兩個sqlsession查詢走二級緩存,但是如果其中有一個commit操作,為避免臟讀二級緩存還是會被清空。

在每個sql語句上使用useCache=true/false是否使用緩存,flushcache=true/false是否刷新緩存 ,在每次的commit后默認(rèn)刷新緩存。

懶加載

Mybatis中resultmap可以實(shí)現(xiàn)高級映射,association一對一,Collection一對多具有延遲加載功能

在collection或association中fetchtype=lazy,即為懶加載

在查詢主表時,不會把子集查出來,直到子集用到的情況才會查出子集。

總結(jié)

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

相關(guān)文章

  • Spring Boot 異步框架的使用詳解

    Spring Boot 異步框架的使用詳解

    這篇文章主要介紹了Spring Boot 異步框架的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java內(nèi)部類與匿名內(nèi)部類

    Java內(nèi)部類與匿名內(nèi)部類

    這篇文章主要介紹了Java內(nèi)部類與匿名內(nèi)部類,內(nèi)部類可以直接訪問外部類的成員,包括私有成員。外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對象,更多相關(guān)內(nèi)容可以參考下面文章內(nèi)容
    2022-06-06
  • Java ThreadLocal的使用場景總結(jié)

    Java ThreadLocal的使用場景總結(jié)

    ThreadLocal原本設(shè)計(jì)是為了解決并發(fā)時,線程共享變量的問題,但由于過度設(shè)計(jì),從而導(dǎo)致它的理解難度大和使用成本高等問題。即便如此,ThreadLocal依舊有適合自己的使用場景,比如本文要介紹了這兩種使用場景,除了ThreadLocal之外,還真沒有合適的替代方案。
    2021-05-05
  • springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時更新

    springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時更新

    這篇文章主要介紹了springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時更新,問題描述和解決思路給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-04-04
  • request.getParameter()方法的簡單理解與運(yùn)用方式

    request.getParameter()方法的簡單理解與運(yùn)用方式

    在JavaWeb開發(fā)中,request對象扮演著至關(guān)重要的角色,它是HTTP請求的封裝,request.getParameter()用于獲取客戶端通過GET或POST方式發(fā)送的參數(shù),與之相對,request.setAttribute()用于在服務(wù)器端設(shè)置屬性,這些屬性只在一次請求中有效
    2024-10-10
  • Struts中使用validate()輸入校驗(yàn)方法詳解

    Struts中使用validate()輸入校驗(yàn)方法詳解

    這篇文章主要介紹了Struts中使用validate()輸入校驗(yàn)方法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • SpringBoot多環(huán)境切換的配置實(shí)現(xiàn)

    SpringBoot多環(huán)境切換的配置實(shí)現(xiàn)

    在日常的開發(fā)中,一般都會分好幾種環(huán)境,本文就來介紹一下SpringBoot多環(huán)境切換的配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • springboot對接支付寶支付接口(詳細(xì)開發(fā)步驟總結(jié))

    springboot對接支付寶支付接口(詳細(xì)開發(fā)步驟總結(jié))

    這篇文章主要介紹了springboot對接支付寶支付接口(詳細(xì)開發(fā)步驟總結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SWT(JFace)體驗(yàn)之FillLayout布局

    SWT(JFace)體驗(yàn)之FillLayout布局

    FillLayout是非常簡單的一種布局方式,它會以同樣大小對父組件中的子組件進(jìn)行布局,這些子組件將以一行或一列的形式排列。
    2009-06-06
  • Java parseInt解釋加方法示例

    Java parseInt解釋加方法示例

    使用此方法得到的原始數(shù)據(jù)類型的一個特定的字符串。 parseXxx()是一個靜態(tài)方法,可以有一個參數(shù)或兩個
    2013-11-11

最新評論

调兵山市| 莱芜市| 昭平县| 临洮县| 遂宁市| 林芝县| 佛教| 云安县| 富裕县| 瑞丽市| 东乌珠穆沁旗| 黄骅市| 叶城县| 丽水市| 江西省| 龙岩市| 英德市| 唐河县| 永新县| 江孜县| 广德县| 临沧市| 和平县| 阳山县| 出国| 年辖:市辖区| 辽中县| 简阳市| 乌拉特后旗| 雷州市| 威海市| 大邑县| 抚远县| 大连市| 都江堰市| 乌海市| 高雄县| 聂拉木县| 杂多县| 田林县| 满洲里市|