溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mybatis查詢(xún)方式與效率高低源碼對(duì)比分析

發(fā)布時(shí)間:2023-03-15 16:34:12 來(lái)源:億速云 閱讀:196 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“mybatis查詢(xún)方式與效率高低源碼對(duì)比分析”,在日常操作中,相信很多人在mybatis查詢(xún)方式與效率高低源碼對(duì)比分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”mybatis查詢(xún)方式與效率高低源碼對(duì)比分析”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

mybatis查詢(xún)方式與效率高低

<!--
     一對(duì)一關(guān)聯(lián)查詢(xú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 查詢(xún)
    問(wèn)題:
        這種方式雖然很簡(jiǎn)單,但在大型數(shù)據(jù)集或大型數(shù)據(jù)表上表現(xiàn)不佳。這個(gè)問(wèn)題被稱(chēng)為“N+1 查詢(xún)問(wèn)題”。 概括地講,N+1 查詢(xún)問(wèn)題是這樣子的:
            你執(zhí)行了一個(gè)單獨(dú)的 SQL 語(yǔ)句來(lái)獲取結(jié)果的一個(gè)列表(就是“+1”)。
            對(duì)列表返回的每條記錄,你執(zhí)行一個(gè) select 查詢(xún)語(yǔ)句來(lái)為每條記錄加載詳細(xì)信息(就是“N”)。
    解決:
        MyBatis 能夠?qū)@樣的查詢(xún)進(jìn)行延遲加載,因此可以將大量語(yǔ)句同時(shí)運(yùn)行的開(kāi)銷(xiāo)分散開(kāi)來(lái)。
        (例如: 我需要teacher這個(gè)對(duì)象的時(shí)候就會(huì)進(jìn)行加載,如果不需要就不會(huì)立即加載(延遲加載))
         然而,如果你加載記錄列表之后立刻就遍歷列表以獲取嵌套的數(shù)據(jù),就會(huì)觸發(fā)所有的延遲加載查詢(xún),性能可能會(huì)變得很糟糕。
    -->
    <!--  關(guān)聯(lián)的嵌套 Select 查詢(xún)  -->
    <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í)體類(lèi)中
        第二種 方式效率比第一種 速度更高
     -->
    <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>

------------------------------------------------------------------
<!--  一對(duì)多  關(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提高查詢(xún)效率的方式

緩存機(jī)制

1 一級(jí)緩存:

當(dāng)mysql連續(xù)執(zhí)行兩次select * from table where id =1;第一次會(huì)執(zhí)行sql語(yǔ)句查詢(xún)數(shù)據(jù)庫(kù),然后保存到sqlsession緩存,第二次查詢(xún)會(huì)先從緩存里查找,有的話(huà)直接返回不會(huì)執(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

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

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

2 二級(jí)緩存:

二級(jí)緩存是基于mapper文件的namaspace,對(duì)該mapper的所有sqlsession都共享一個(gè)二級(jí)緩存,如果兩個(gè)mapper的namespace一致,則兩個(gè)mapper的所有sqlsession共用一個(gè)二級(jí)緩存,

步驟:

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

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

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

不同的兩個(gè)sqlsession查詢(xún)走二級(jí)緩存,但是如果其中有一個(gè)commit操作,為避免臟讀二級(jí)緩存還是會(huì)被清空。

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

懶加載

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

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

在查詢(xún)主表時(shí),不會(huì)把子集查出來(lái),直到子集用到的情況才會(huì)查出子集。

到此,關(guān)于“mybatis查詢(xún)方式與效率高低源碼對(duì)比分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI