亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis查詢方式與效率高低源碼對比分析

發布時間:2023-03-15 16:34:12 來源:億速云 閱讀:203 作者:iii 欄目:開發技術

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

mybatis查詢方式與效率高低

<!--
     一對一關聯查詢
     select s.id,s.name,s.age,t.name tname  from student s,teacher t where s.tid=t.id;
      -->

    <!--
        關聯的嵌套 Select 查詢
    問題:
        這種方式雖然很簡單,但在大型數據集或大型數據表上表現不佳。這個問題被稱為“N+1 查詢問題”。 概括地講,N+1 查詢問題是這樣子的:
            你執行了一個單獨的 SQL 語句來獲取結果的一個列表(就是“+1”)。
            對列表返回的每條記錄,你執行一個 select 查詢語句來為每條記錄加載詳細信息(就是“N”)。
    解決:
        MyBatis 能夠對這樣的查詢進行延遲加載,因此可以將大量語句同時運行的開銷分散開來。
        (例如: 我需要teacher這個對象的時候就會進行加載,如果不需要就不會立即加載(延遲加載))
         然而,如果你加載記錄列表之后立刻就遍歷列表以獲取嵌套的數據,就會觸發所有的延遲加載查詢,性能可能會變得很糟糕。
    -->
    <!--  關聯的嵌套 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>


    <!--
        關聯的嵌套  結果映射
        將結果直接映射 到實體類中
        第二種 方式效率比第一種 速度更高
     -->
    <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>

------------------------------------------------------------------
<!--  一對多  關聯嵌套  結果映射    ofType 將數據封裝到指定的泛型  -->
    <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提高查詢效率的方式

緩存機制

1 一級緩存:

mysql連續執行兩次select * from table where id =1;第一次會執行sql語句查詢數據庫,然后保存到sqlsession緩存,第二次查詢會先從緩存里查找,有的話直接返回不會執行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

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

所以第二次select在緩存里找不到數據,又會執行sql查詢數據庫。

2 二級緩存:

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

步驟:

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

其次在mapper文件開啟緩存 type里面是緩存類。如果不寫是默認的mabatis緩存類,自定義緩存類必須實現cache接口

需要緩存的pojo實體類要實現serializable接口,因為在緩存中取出數據映射到pojo類需要反序列化。

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

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

懶加載

Mybatis中resultmap可以實現高級映射,association一對一,Collection一對多具有延遲加載功能

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

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

到此,關于“mybatis查詢方式與效率高低源碼對比分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵南县| 富川| 常宁市| 商都县| 舟山市| 甘肃省| 泰来县| 连云港市| 吉首市| 萨迦县| 健康| 松原市| 石阡县| 原平市| 时尚| 桂林市| 绍兴市| 灌南县| 玉田县| 通城县| 永泰县| 康马县| 蒲江县| 手机| 太保市| 巴林左旗| 紫金县| 上高县| 苏尼特右旗| 泰兴市| 晋州市| 兴海县| 共和县| 揭西县| 阳原县| 广南县| 长葛市| 化隆| 大方县| 庆城县| 桂阳县|