亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mybatis優(yōu)化檢索的方法詳解

 更新時(shí)間:2024年05月22日 09:55:53   作者:兔子隊(duì)列  
MyBatis是一款優(yōu)秀的基于Java的持久層框架,它可以將 SQL 語(yǔ)句和數(shù)據(jù)庫(kù)中的記錄映射成為 Java 對(duì)象,并且支持靈活的 SQL 查詢(xún)語(yǔ)句,在Mybatis中,可以使用動(dòng)態(tài)SQL來(lái)靈活構(gòu)造SQL語(yǔ)句,從而滿(mǎn)足各種不同的檢索需求,本文介紹Mybatis如何優(yōu)化檢索,需要的朋友可以參考下

1.SQL 映射

  • MyBatis 允許開(kāi)發(fā)者直接編寫(xiě)原生SQL或動(dòng)態(tài)SQL,而不是依賴(lài)于ORM框架生成的SQL
  • 這種方式可以精確控制SQL執(zhí)行,優(yōu)化查詢(xún)語(yǔ)句的性能,尤其是在處理復(fù)雜查詢(xún)時(shí)
  • 示例
  • 1-數(shù)據(jù)庫(kù)表結(jié)構(gòu)
  • 假設(shè)有兩個(gè)表:user 和 role,以及一個(gè)關(guān)聯(lián)表 user_role
CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    email VARCHAR(255)
);

CREATE TABLE role (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role_name VARCHAR(255)
);

CREATE TABLE user_role (
    user_id INT,
    role_id INT,
    FOREIGN KEY (user_id) REFERENCES user(id),
    FOREIGN KEY (role_id) REFERENCES role(id)
);
  • 2-MyBatis 配置文件(mybatis-config.xml)
  • 這是 MyBatis 的全局配置文件,設(shè)置了一些基本配置和環(huán)境信息
<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>
  • 3-Mapper XML 文件(UserMapper.xml)
  • 這個(gè)文件定義了 SQL 映射和操作數(shù)據(jù)庫(kù)的方法
<?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.example.mapper.UserMapper">
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <resultMap id="userRoleMap" type="com.example.model.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <collection property="roles" ofType="com.example.model.Role">
            <id column="role_id" property="id"/>
            <result column="role_name" property="roleName"/>
        </collection>
    </resultMap>

    <select id="selectUserWithRoles" resultMap="userRoleMap">
        SELECT u.id, u.username, r.id AS role_id, r.role_name
        FROM user u
        LEFT JOIN user_role ur ON u.id = ur.user_id
        LEFT JOIN role r ON ur.role_id = r.id
        WHERE u.id = #{id}
    </select>
</mapper>

2.結(jié)果映射

  • MyBatis 提供了高度靈活的結(jié)果映射機(jī)制,可以將數(shù)據(jù)庫(kù)結(jié)果直接映射到復(fù)雜的對(duì)象模型中
  • 它允許你將 SQL 查詢(xún)返回的結(jié)果集映射到 Java 對(duì)象中
  • 這減少了數(shù)據(jù)轉(zhuǎn)換和處理的開(kāi)銷(xiāo),使得數(shù)據(jù)加載更為高效
  • 示例
  • 在 MyBatis 的 Mapper XML 中配置一個(gè)簡(jiǎn)單的結(jié)果映射如下:
<!-- Mapper XML 配置 -->
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 定義結(jié)果映射 -->
    <resultMap id="BaseResultMap" type="com.example.model.User">
        <id column="id" property="id" />
        <result column="username" property="username" />
        <result column="email" property="email" />
    </resultMap>

    <!-- 使用定義好的結(jié)果映射查詢(xún)用戶(hù) -->
    <select id="selectUserById" resultMap="BaseResultMap">
        SELECT id, username, email FROM user WHERE id = #{id}
    </select>
</mapper>
  • 在這個(gè)例子中
  • BaseResultMap 定義了如何將 user 表的列 id、username、和 email 映射到 Java 對(duì)象 User 的相應(yīng)屬性中

3.延遲加載

  • MyBatis 支持延遲加載技術(shù),允許按需加載關(guān)聯(lián)對(duì)象
  • 這意味著只有在使用到某個(gè)關(guān)聯(lián)對(duì)象時(shí),才會(huì)執(zhí)行相應(yīng)的SQL查詢(xún)
  • 這種策略可以顯著減少初始化對(duì)象時(shí)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)次數(shù)和網(wǎng)絡(luò)延遲
  • MyBatis 支持延遲加載的配置可以在 mybatis-config.xml 中設(shè)置,例如:
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
  • 這個(gè)配置確保了只有在實(shí)際需要使用用戶(hù)的角色信息時(shí),才會(huì)去數(shù)據(jù)庫(kù)加載角色數(shù)據(jù)
  • 這種延遲加載可以提高應(yīng)用的性能,特別是當(dāng)數(shù)據(jù)結(jié)構(gòu)復(fù)雜或數(shù)據(jù)量大時(shí)

4.緩存支持

  • MyBatis 內(nèi)置了強(qiáng)大的緩存機(jī)制,用于存儲(chǔ)已經(jīng)執(zhí)行過(guò)的查詢(xún)結(jié)果
  • 以便在后續(xù)相同的查詢(xún)請(qǐng)求中快速返回結(jié)果而無(wú)需再次執(zhí)行實(shí)際的數(shù)據(jù)庫(kù)查詢(xún)
  • 包括一級(jí)緩存(會(huì)話(huà)緩存)和二級(jí)緩存(全局緩存)
  • 一級(jí)緩存默認(rèn)開(kāi)啟,保證了同一會(huì)話(huà)中相同查詢(xún)的結(jié)果可以被復(fù)用
  • 而二級(jí)緩存則可以跨會(huì)話(huà)復(fù)用查詢(xún)結(jié)果,減少數(shù)據(jù)庫(kù)的查詢(xún)次數(shù),提高應(yīng)用性能

一級(jí)緩存(Session Cache)

  • 作用范圍:一級(jí)緩存是基于 SQL 會(huì)話(huà)的,它僅在當(dāng)前會(huì)話(huà)內(nèi)有效
  • 當(dāng)會(huì)話(huà)關(guān)閉或提交時(shí),一級(jí)緩存也會(huì)被清除
  • 實(shí)現(xiàn)方式:默認(rèn)情況下,MyBatis 的每個(gè) SQL 會(huì)話(huà)有自己的一級(jí)緩存
  • 每當(dāng)會(huì)話(huà)中執(zhí)行查詢(xún)時(shí),MyBatis 首先檢查緩存中是否已存在相應(yīng)的結(jié)果
  • 如果有,則直接返回緩存結(jié)果;如果沒(méi)有,則執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)并將查詢(xún)結(jié)果放入緩存
  • 緩存內(nèi)容:緩存的內(nèi)容包括查詢(xún)結(jié)果對(duì)象和執(zhí)行過(guò)的查詢(xún)語(yǔ)句

二級(jí)緩存(Global Cache)

  • 作用范圍:二級(jí)緩存是跨會(huì)話(huà)的,它可以被不同的會(huì)話(huà)共享
  • 二級(jí)緩存的作用范圍通常是映射器(Mapper)級(jí)別,不同的映射器持有各自的二級(jí)緩存
  • 配置方式:二級(jí)緩存需要在 MyBatis 配置文件或映射文件中顯式開(kāi)啟
  • 開(kāi)啟后,查詢(xún)結(jié)果可以跨會(huì)話(huà)重用,從而減少對(duì)數(shù)據(jù)庫(kù)的查詢(xún)次數(shù),提高效率
  • 實(shí)現(xiàn)技術(shù):二級(jí)緩存可以使用 MyBatis 自帶的簡(jiǎn)單實(shí)現(xiàn),也可以集成更強(qiáng)大的緩存解決方案,如 Ehcache、Redis 等

示例配置

  • 在 MyBatis 的 Mapper XML 中開(kāi)啟二級(jí)緩存的示例:
<!-- 開(kāi)啟當(dāng)前 Mapper 的二級(jí)緩存 -->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

緩存策略

  • eviction:緩存的回收策略
  • 常用的有 LRU(Least Recently Used 最少使用策略)、FIFO(First In First Out 先進(jìn)先出策略)等
  • flushInterval:緩存刷新間隔,單位是毫秒
  • 設(shè)置后,緩存會(huì)在指定的時(shí)間間隔后自動(dòng)清空
  • size:引用數(shù)目,設(shè)置緩存中可以存儲(chǔ)多少個(gè)對(duì)象
  • readOnly:是否只讀
  • 如果為 true,則所有獲取的緩存對(duì)象都是只讀的,這樣可以提供一些性能優(yōu)勢(shì)

5.批量操作優(yōu)化

  • MyBatis 提供了批處理的支持,允許在一個(gè)會(huì)話(huà)中執(zhí)行多個(gè)更新操作
  • 這可以減少數(shù)據(jù)庫(kù)交互次數(shù),降低網(wǎng)絡(luò)開(kāi)銷(xiāo)和數(shù)據(jù)庫(kù)壓力

6.動(dòng)態(tài) SQL

  • MyBatis 的動(dòng)態(tài)SQL功能允許構(gòu)建在運(yùn)行時(shí)評(píng)估的SQL語(yǔ)句,根據(jù)不同的條件組裝不同的SQL片段
  • 這不僅提高了SQL的靈活性,也避免了不必要的查詢(xún)條件,從而優(yōu)化了查詢(xún)效率
  • 動(dòng)態(tài) SQL 的關(guān)鍵組件
  • 1-<if>標(biāo)簽
  • 根據(jù)條件是否為真來(lái)決定是否包含某個(gè) SQL 片段
  • 這可以用來(lái)添加可選的查詢(xún)條件或修改其他 SQL 構(gòu)造
  • 2-<choose><when><otherwise>標(biāo)簽
  • 類(lèi)似于 Java 中的 switch 語(yǔ)句,根據(jù)多個(gè)條件選擇性地包括 SQL 片段
  • 3-<where>標(biāo)簽
  • 自動(dòng)處理 SQL 查詢(xún)中的 WHERE 子句,如果其內(nèi)部的條件為真,就插入 WHERE 關(guān)鍵字
  • 同時(shí)也智能地處理多余的 AND 或 OR 關(guān)鍵字
  • 4-<set>標(biāo)簽
  • 用于動(dòng)態(tài)構(gòu)建 UPDATE 語(yǔ)句,自動(dòng)處理列賦值的列表,并且在需要時(shí)智能插入逗號(hào)
  • 5-<foreach>標(biāo)簽
  • 用于在 SQL 語(yǔ)句中構(gòu)建重復(fù)的 SQL 片段,如批量插入數(shù)據(jù)或構(gòu)建 IN 子句
  • 6-<sql><include>標(biāo)簽
  • 用于SQL片段的抽取
  • <sql>:抽取SQL語(yǔ)句的標(biāo)簽
  • <sql id="片段唯一標(biāo)識(shí)">抽取的SQL語(yǔ)句</sql>
  • <include>:引入SQL片段標(biāo)簽
  • <include refid="片段唯一標(biāo)識(shí)" />
  • 示例
  • 以下是一些動(dòng)態(tài) SQL 的示例,展示如何在 MyBatis 的 Mapper XML 中使用它們
<!-- Mapper XML 文件中的示例 -->
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 動(dòng)態(tài)生成 SELECT 查詢(xún) -->
    <select id="findUsersByConditions" resultType="User">
        <where>
            <if test="username != null">
                AND username = #{username}
            </if>
            <if test="email != null">
                AND email = #{email}
            </if>
        </where>
    </select>

    <!-- 動(dòng)態(tài)生成 UPDATE 查詢(xún) -->
    <update id="updateUser">
        UPDATE users
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="email != null">
                email = #{email},
            </if>
        </set>
        WHERE id = #{id}
    </update>

    <!-- 使用 foreach 生成 IN 子句 -->
    <select id="findUsersByIds" resultType="User">
        SELECT * FROM users
        WHERE id IN
        <foreach item="id" collection="ids" open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>
</mapper>

7.插件和攔截器

  • MyBatis 允許使用插件對(duì)查詢(xún)過(guò)程進(jìn)行攔截和修改
  • 開(kāi)發(fā)者可以通過(guò)插件來(lái)添加或改寫(xiě)某些操作的行為
  • 如執(zhí)行查詢(xún)前的參數(shù)處理或執(zhí)行后的結(jié)果處理,進(jìn)一步優(yōu)化查詢(xún)性能
  • MyBatis 插件本質(zhì)上是通過(guò)攔截器(Interceptor)實(shí)現(xiàn)的
  • MyBatis 的攔截器是實(shí)現(xiàn)了 Interceptor 接口的組件,用于在SQL執(zhí)行的關(guān)鍵環(huán)節(jié)插入自定義邏輯

以上就是Mybatis優(yōu)化檢索的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Mybatis優(yōu)化檢索的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java JDK與cglib動(dòng)態(tài)代理有什么區(qū)別

    Java JDK與cglib動(dòng)態(tài)代理有什么區(qū)別

    這篇文章主要介紹了Java JDK動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理的區(qū)別文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-03-03
  • Java中的ReentrantLock實(shí)現(xiàn)原理及代碼演示

    Java中的ReentrantLock實(shí)現(xiàn)原理及代碼演示

    這篇文章主要介紹了Java中的ReentrantLock實(shí)現(xiàn)原理及代碼演示,非公平鎖 如果已經(jīng)進(jìn)入隊(duì)列,鏈表里面的線(xiàn)程是先進(jìn)先出,如果已經(jīng)釋放了鎖,在搶占鎖時(shí),鏈表里面的頭結(jié)點(diǎn)和還沒(méi)有入隊(duì)列的線(xiàn)程搶鎖,需要的朋友可以參考下
    2024-01-01
  • jpa 使用@Column來(lái)定義字段類(lèi)型

    jpa 使用@Column來(lái)定義字段類(lèi)型

    這篇文章主要介紹了jpa使用@Column來(lái)定義字段類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 如何使用Jenkins編譯并打包SpringCloud微服務(wù)目錄

    如何使用Jenkins編譯并打包SpringCloud微服務(wù)目錄

    這篇文章主要介紹了如何使用Jenkins編譯并打包SpringCloud微服務(wù)目錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java服務(wù)限流算法的6種實(shí)現(xiàn)

    Java服務(wù)限流算法的6種實(shí)現(xiàn)

    服務(wù)限流是指通過(guò)控制請(qǐng)求的速率或次數(shù)來(lái)達(dá)到保護(hù)服務(wù)的目的,本文主要介紹了Java服務(wù)限流算法的6種實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • java的url方式、本地方式獲取json文件內(nèi)容

    java的url方式、本地方式獲取json文件內(nèi)容

    這篇文章給大家分享了java的url方式、本地方式獲取json文件內(nèi)容的實(shí)例代碼,有需要的朋友參考學(xué)習(xí)下。
    2018-07-07
  • springboot vue組件開(kāi)發(fā)實(shí)現(xiàn)接口斷言功能

    springboot vue組件開(kāi)發(fā)實(shí)現(xiàn)接口斷言功能

    這篇文章主要為大家介紹了springboot+vue組件開(kāi)發(fā)實(shí)現(xiàn)接口斷言功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • SpringBoot整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    SpringBoot整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    這篇文章主要介紹了Java?任務(wù)調(diào)度框架?Quartz,Quartz是OpenSymphony開(kāi)源組織在Job?scheduling領(lǐng)域又一個(gè)開(kāi)源項(xiàng)目,完全由Java開(kāi)發(fā),可以用來(lái)執(zhí)行定時(shí)任務(wù),類(lèi)似于java.util.Timer。,下面我們來(lái)學(xué)習(xí)一下關(guān)于?Quartz更多的詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2022-08-08
  • Java中的泛型

    Java中的泛型

    這篇文章主要介紹為何要泛型,如何使用泛型,自定義泛型的方法,泛型類(lèi)的子類(lèi)等多方面介紹了JAVA中的泛型,需要的小伙伴請(qǐng)看下文
    2021-08-08
  • 一文詳解Object類(lèi)和抽象類(lèi)

    一文詳解Object類(lèi)和抽象類(lèi)

    這篇文章主要介紹了一文詳解Object類(lèi)和抽象類(lèi),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下。希望對(duì)你的學(xué)習(xí)有所幫助
    2022-08-08

最新評(píng)論