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

MyBatis?SQL映射文件的作用和結(jié)構(gòu)詳解

 更新時(shí)間:2025年03月10日 09:30:09   作者:冰糖心書房  
MyBatisSQL映射文件定義了SQL語句和參數(shù)映射規(guī)則,用于將Java代碼與數(shù)據(jù)庫操作解耦,實(shí)現(xiàn)SQL語句的靈活配置和動(dòng)態(tài)生成

MyBatis SQL 映射文件定義了 SQL 語句以及如何將 SQL 語句的參數(shù)和結(jié)果映射到 Java 對(duì)象。

一、 作用 (Purpose)

MyBatis SQL 映射文件(通常命名為 XXXMapper.xml)的主要作用是:

  1. 定義 SQL 語句: 在 XML 映射文件中編寫 SQL 語句,包括 SELECT, INSERT, UPDATE, DELETE 等各種類型的 SQL 語句。
  2. 參數(shù)映射 (Parameter Mapping): 定義如何將 Java 方法的參數(shù)映射到 SQL 語句中的參數(shù)。 可以使用 #$ 占位符,并指定參數(shù)類型、jdbcType 等信息。
  3. 結(jié)果映射 (Result Mapping): 定義如何將 SQL 語句的查詢結(jié)果映射到 Java 對(duì)象。 可以使用 resultTyperesultMap,并定義一對(duì)一、一對(duì)多等關(guān)系映射。
  4. 動(dòng)態(tài) SQL (Dynamic SQL): 使用 MyBatis 提供的動(dòng)態(tài) SQL 元素 (例如 <if>, <choose>, <when>, <otherwise>, <where>, <set>, <foreach>),根據(jù)不同的條件動(dòng)態(tài)生成 SQL 語句。
  5. 緩存配置 (Cache Configuration): 配置 SQL 語句的緩存行為,提高查詢性能。
  6. 與 Mapper 接口關(guān)聯(lián): 將 SQL 映射文件與 Java Mapper 接口關(guān)聯(lián)起來,使得可以通過調(diào)用 Mapper 接口的方法來執(zhí)行 SQL 語句。

總而言之,SQL 映射文件是 MyBatis 將 SQL 語句與 Java 代碼解耦的關(guān)鍵,它允許開發(fā)者專注于 SQL 語句的編寫和優(yōu)化,而無需關(guān)心 JDBC 的細(xì)節(jié)。

二、 結(jié)構(gòu) (Structure)

MyBatis SQL 映射文件的根元素是 <mapper>,它包含多個(gè)子元素,用于定義 SQL 語句、參數(shù)映射、結(jié)果映射等信息。

以下是一個(gè)典型的 SQL 映射文件結(jié)構(gòu):

<?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">

    <!-- 1. cache (緩存) -->
    <cache
            eviction="LRU"
            flushInterval="60000"
            readOnly="true"
            size="512"/>

    <!-- 2. resultMap (結(jié)果映射) -->
    <resultMap id="UserResultMap" type="com.example.model.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="email" column="email"/>
        <!-- association (一對(duì)一) -->
        <association property="address" column="address_id" javaType="com.example.model.Address"
                     select="com.example.mapper.AddressMapper.selectAddressById"/>
        <!-- collection (一對(duì)多) -->
        <collection property="orders" column="id" ofType="com.example.model.Order"
                    select="com.example.mapper.OrderMapper.selectOrdersByUserId"/>
    </resultMap>

    <!-- 3. select (查詢) -->
    <select id="selectUserById" parameterType="int" resultMap="UserResultMap" useCache="true">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <!-- 4. insert (插入) -->
    <insert id="insertUser" parameterType="com.example.model.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (username, email) VALUES (#{username}, #{email})
    </insert>

    <!-- 5. update (更新) -->
    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}
    </update>

    <!-- 6. delete (刪除) -->
    <delete id="deleteUserById" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>

    <!-- 7. sql (SQL 片段) -->
    <sql id="userColumns">
        id, username, email
    </sql>

</mapper>

三、各個(gè)元素詳解

<mapper> (根元素):

  • namespace 屬性:指定 Mapper 接口的完全限定名。 MyBatis 會(huì)根據(jù)這個(gè)命名空間來查找 SQL 映射文件,并將 SQL 語句與 Mapper 接口的方法關(guān)聯(lián)起來。 這是將 SQL 映射文件與 Java 代碼關(guān)聯(lián)的關(guān)鍵。
  • 例如:<mapper namespace="com.example.mapper.UserMapper"> 對(duì)應(yīng)著 UserMapper.java 接口文件

<cache> (緩存):

  • 配置該 Mapper 對(duì)應(yīng)的二級(jí)緩存。
  • eviction 屬性:指定緩存的淘汰策略 (LRU, FIFO, SOFT, WEAK)。
  • flushInterval 屬性:指定緩存的刷新間隔 (毫秒)。
  • size 屬性:指定緩存的最大容量。
  • readOnly 屬性:指定緩存是否只讀 (truefalse)。
  • <cache type="org.mybatis.cache.impl.PerpetualCache"/> 使用自定義緩存

<cache-ref> (緩存引用):

  • 引用其他 Mapper 的緩存配置。
  • namespace 屬性:指定要引用的 Mapper 的命名空間。

<resultMap> (結(jié)果映射):

作用: 定義如何將 SQL 語句的查詢結(jié)果映射到 Java 對(duì)象。

  • id 屬性:指定 resultMap 的唯一標(biāo)識(shí)。
  • type 屬性:指定要映射的 Java 類型。

子元素:

  • <id>:定義主鍵映射。
    • property 屬性:指定 Java 對(duì)象的屬性名。
    • column 屬性:指定數(shù)據(jù)庫表中的列名。
  • <result>:定義普通屬性映射。
    • property 屬性:指定 Java 對(duì)象的屬性名。
    • column 屬性:指定數(shù)據(jù)庫表中的列名。
  • <association>:定義一對(duì)一關(guān)系映射。
    • property 屬性:指定 Java 對(duì)象的屬性名。
    • column 屬性:指定數(shù)據(jù)庫表中的列名。
    • javaType 屬性:指定關(guān)聯(lián)對(duì)象的 Java 類型。
    • select 屬性:指定用于查詢關(guān)聯(lián)對(duì)象的 SQL 語句的 ID。
  • <collection>:定義一對(duì)多關(guān)系映射。
    • property 屬性:指定 Java 對(duì)象的屬性名。
    • column 屬性:指定數(shù)據(jù)庫表中的列名。
    • ofType 屬性:指定集合中元素的 Java 類型。
    • select 屬性:指定用于查詢集合元素的 SQL 語句的 ID。
  • <discriminator>:定義鑒別器,根據(jù)不同的條件選擇不同的映射規(guī)則。
    • column 屬性:指定用于鑒別的列名。
    • <case> 元素:定義不同的映射規(guī)則。
      • value 屬性:指定鑒別值。
      • resultMap 屬性:指定要使用的 resultMap。

示例:

<resultMap id="UserResultMap" type="com.example.model.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="email" column="email"/>
    <association property="address" column="address_id" javaType="com.example.model.Address"
                 select="com.example.mapper.AddressMapper.selectAddressById"/>
    <collection property="orders" column="id" ofType="com.example.model.Order"
                select="com.example.mapper.OrderMapper.selectOrdersByUserId"/>
</resultMap>

<select> (查詢):

  • 作用: 定義 SELECT 語句,用于查詢數(shù)據(jù)。
  • id 屬性:指定 SQL 語句的唯一標(biāo)識(shí)。 與 Mapper 接口中的方法名對(duì)應(yīng)。
  • parameterType 屬性:指定參數(shù)類型。
  • resultType 屬性:指定結(jié)果類型(如果使用簡單類型映射)。
  • resultMap 屬性:指定結(jié)果映射 (如果使用 <resultMap> 元素)。
  • parameterMap 屬性: (已經(jīng)過時(shí), 不建議使用)
  • flushCache 屬性: 如果設(shè)置為 true,則每次執(zhí)行該語句都會(huì)刷新緩存。
  • useCache 屬性:如果設(shè)置為 true,則該語句的結(jié)果會(huì)被緩存。
  • timeout 屬性:設(shè)置超時(shí)時(shí)間(秒)。
  • fetchSize 屬性:設(shè)置每次從數(shù)據(jù)庫獲取的記錄數(shù)量。
  • statementType 屬性: 指Statement類型, 可選值為 STATEMENT、PREPARED 和 CALLABLE。
  • STATEMENT, 默認(rèn)值, 使用Statement
  • PREPARED, 使用PreparedStatement, 可以防止SQL注入, 性能更好。
  • CALLABLE, 主要用于執(zhí)行存儲(chǔ)過程

示例:

<select id="selectUserById" parameterType="int" resultMap="UserResultMap" useCache="true">
    SELECT * FROM user WHERE id = #{id}
</select>

<insert> (插入):

  • 作用: 定義 INSERT 語句,用于插入數(shù)據(jù)。
  • id 屬性:指定 SQL 語句的唯一標(biāo)識(shí)。
  • parameterType 屬性:指定參數(shù)類型。
  • useGeneratedKeys 屬性:是否允許 MyBatis 使用 JDBC 的 getGeneratedKeys 方法獲取自增主鍵值。
  • keyProperty 屬性:指定 Java 對(duì)象的哪個(gè)屬性用于接收自增主鍵值。
  • keyColumn屬性:指定數(shù)據(jù)庫表的主鍵列名.

示例:

<insert id="insertUser" parameterType="com.example.model.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    INSERT INTO user (username, email) VALUES (#{username}, #{email})
</insert>

<update> (更新):

  • 作用: 定義 UPDATE 語句,用于更新數(shù)據(jù)。
  • id 屬性:指定 SQL 語句的唯一標(biāo)識(shí)。
  • parameterType 屬性:指定參數(shù)類型。

示例:

<update id="updateUser" parameterType="com.example.model.User">
    UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}
</update>

<delete> (刪除):

  • 作用: 定義 DELETE 語句,用于刪除數(shù)據(jù)。
  • id 屬性:指定 SQL 語句的唯一標(biāo)識(shí)。
  • parameterType 屬性:指定參數(shù)類型。

示例:

<delete id="deleteUserById" parameterType="int">
    DELETE FROM user WHERE id = #{id}
</delete>

<sql> (SQL 片段):

  • 作用: 定義可以重復(fù)使用的 SQL 代碼片段。
  • id 屬性:指定 SQL 片段的唯一標(biāo)識(shí)。

示例:

<sql id="userColumns">
    id, username, email
</sql>

四、動(dòng)態(tài) SQL 元素 (Dynamic SQL Elements)

MyBatis 提供了以下動(dòng)態(tài) SQL 元素,可以根據(jù)不同的條件動(dòng)態(tài)生成 SQL 語句:

<if>

  • 作用: 根據(jù)條件判斷是否包含某段 SQL 代碼。
  • test 屬性:指定判斷條件,使用 OGNL 表達(dá)式。

示例:

<select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">
    SELECT * FROM user
    <where>
        <if test="username != null and username != ''">
            AND username = #{username}
        </if>
        <if test="email != null and email != ''">
            AND email = #{email}
        </if>
    </where>
</select>

<choose>, <when>, <otherwise>

  • 作用: 類似于 Java 中的 switch-case 語句,用于選擇其中一個(gè)條件分支。
  • <choose> 元素:包含多個(gè) <when> 元素和一個(gè) <otherwise> 元素。
  • <when> 元素:指定條件和對(duì)應(yīng)的 SQL 代碼。
  • <otherwise> 元素:指定默認(rèn)的 SQL 代碼(當(dāng)所有 <when> 條件都不滿足時(shí)執(zhí)行)。
  • test 屬性:指定 <when> 元素的判斷條件,使用 OGNL 表達(dá)式。

示例:

<select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">
    SELECT * FROM user
    <where>
        <choose>
            <when test="username != null and username != ''">
                AND username = #{username}
            </when>
            <when test="email != null and email != ''">
                AND email = #{email}
            </when>
            <otherwise>
                AND 1 = 1
            </otherwise>
        </choose>
    </where>
</select>

<where>

  • 作用: 動(dòng)態(tài)生成 WHERE 子句,并自動(dòng)處理 ANDOR 關(guān)鍵字。
  • 如果 <where> 元素內(nèi)部有任何內(nèi)容,它會(huì)自動(dòng)添加 WHERE 關(guān)鍵字。
  • 如果 <where> 元素內(nèi)部的內(nèi)容以 ANDOR 開頭,它會(huì)自動(dòng)移除這些關(guān)鍵字。

示例:

<select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">
    SELECT * FROM user
    <where>
        <if test="username != null and username != ''">
            AND username = #{username}
        </if>
        <if test="email != null and email != ''">
            AND email = #{email}
        </if>
    </where>
</select>

<set>

  • 作用: 動(dòng)態(tài)生成 SET 子句,用于 UPDATE 語句,并自動(dòng)處理逗號(hào) ,。
  • 如果 <set> 元素內(nèi)部有任何內(nèi)容,它會(huì)自動(dòng)添加 SET 關(guān)鍵字。
  • 如果 <set> 元素內(nèi)部的內(nèi)容以逗號(hào) , 開頭,它會(huì)自動(dòng)移除這個(gè)逗號(hào)。

示例:

<update id="updateUserSelective" parameterType="com.example.model.User">
    UPDATE user
    <set>
        <if test="username != null">
            username = #{username},
        </if>
        <if test="email != null">
            email = #{email},
        </if>
    </set>
    WHERE id = #{id}
</update>

<trim>

  • 作用: 更通用的動(dòng)態(tài) SQL 元素,可以自定義前綴、后綴、以及前綴和后綴要移除的內(nèi)容。
  • prefix 屬性:指定前綴。
  • suffix 屬性:指定后綴。
  • prefixOverrides 屬性:指定要移除的前綴。
  • suffixOverrides 屬性:指定要移除的后綴。

示例:

<select id="selectUserByCondition" parameterType="com.example.model.User" resultMap="UserResultMap">
    SELECT * FROM user
    <trim prefix="WHERE" prefixOverrides="AND |OR">
        <if test="username != null and username != ''">
            AND username = #{username}
        </if>
        <if test="email != null and email != ''">
            AND email = #{email}
        </if>
    </trim>
</select>

<update id="updateUserSelective" parameterType="com.example.model.User">
    UPDATE user
    <trim prefix="SET" suffixOverrides=",">
        <if test="username != null">
            username = #{username},
        </if>
        <if test="email != null">
            email = #{email},
        </if>
    </trim>
    WHERE id = #{id}
</update>

<foreach>

  • 作用: 用于遍歷集合,生成重復(fù)的 SQL 代碼。
  • collection 屬性:指定要遍歷的集合。
  • item 屬性:指定集合中元素的別名。
  • index 屬性:指定當(dāng)前元素的索引的別名。
  • open 屬性:指定循環(huán)開始時(shí)的字符串。
  • close 屬性:指定循環(huán)結(jié)束時(shí)的字符串。
  • separator 屬性:指定元素之間的分隔符。

示例:

<select id="selectUsersByIds" parameterType="list" resultMap="UserResultMap">
    SELECT * FROM user
    WHERE id IN
    <foreach item="id" collection="list" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

<insert id="insertUsers" parameterType="list">
    INSERT INTO user (username, email) VALUES
    <foreach item="user" collection="list" separator="," >
        (#{user.username}, #{user.email})
    </foreach>
</insert>

<bind>

  • 作用: 創(chuàng)建一個(gè)變量,并將其綁定到 OGNL 表達(dá)式的結(jié)果。
  • name 屬性: 指定變量名
  • value 屬性: 指定 OGNL 表達(dá)式

示例:

<select id="selectUsersBySearchTerm" parameterType="string" resultMap="UserResultMap">
    <bind name="pattern" value="'%' + searchTerm + '%'" />
    SELECT * FROM user
    WHERE username LIKE #{pattern} OR email LIKE #{pattern}
</select>

五、DOCTYPE (Document Type Definition)

MyBatis SQL 映射文件需要遵循特定的 DTD 約束.

DTD 聲明:

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

DTD 文件:

  • mybatis-3-mapper.dtd 文件定義了 MyBatis SQL 映射文件的結(jié)構(gòu)??梢栽?MyBatis 的官方網(wǎng)站上找到該文件。
  • 開發(fā)中通常不需要我們手動(dòng)修改 DTD 文件,只需要在 XML 配置文件中聲明 DTD 即可。

六、總結(jié)

MyBatis SQL 映射文件是 MyBatis 框架的核心,它定義了 SQL 語句以及如何將 SQL 語句的參數(shù)和結(jié)果映射到 Java 對(duì)象。

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

相關(guān)文章

  • Spring自定義MCP sse-endpoint配置指南

    Spring自定義MCP sse-endpoint配置指南

    本文給大家介紹Spring自定義MCP sse-endpoint配置指南,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-09-09
  • springboot配置http跳轉(zhuǎn)https的過程

    springboot配置http跳轉(zhuǎn)https的過程

    SSL是為網(wǎng)絡(luò)通信提供安全以及保證數(shù)據(jù)完整性的的一種安全協(xié)議,SSL在網(wǎng)絡(luò)傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密,這篇文章主要介紹了springboot配置http跳轉(zhuǎn)https的過程,需要的朋友可以參考下
    2023-04-04
  • Java在PowerPoint中添加上標(biāo)和下標(biāo)的實(shí)現(xiàn)方法

    Java在PowerPoint中添加上標(biāo)和下標(biāo)的實(shí)現(xiàn)方法

    當(dāng)我們?cè)谘菔疚母逯刑砑由虡?biāo)、版權(quán)或其他符號(hào)時(shí),我們可能希望該符號(hào)出現(xiàn)在某個(gè)文本的上方或下方。在Microsoft PowerPoint中,我們可以通過對(duì)符號(hào)應(yīng)用上標(biāo)或下標(biāo)格式來實(shí)現(xiàn)這種效果,這篇文章主要介紹了Java在PowerPoint中添加上標(biāo)和下標(biāo),需要的朋友可以參考下
    2022-10-10
  • Java案例使用集合方法實(shí)現(xiàn)統(tǒng)計(jì)任意字符串中字符出現(xiàn)的次數(shù)

    Java案例使用集合方法實(shí)現(xiàn)統(tǒng)計(jì)任意字符串中字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了Java案例使用集合方法實(shí)現(xiàn)統(tǒng)計(jì)任意字符串中字符出現(xiàn)的次數(shù),下面我們將用兩種方法實(shí)現(xiàn),需要的小伙伴可以參考一下文章具體內(nèi)容
    2022-04-04
  • Springmvc和ajax如何實(shí)現(xiàn)前后端交互

    Springmvc和ajax如何實(shí)現(xiàn)前后端交互

    這篇文章主要介紹了Springmvc和ajax如何實(shí)現(xiàn)前后端交互,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java JDBC批量執(zhí)行executeBatch方法詳解

    Java JDBC批量執(zhí)行executeBatch方法詳解

    這篇文章主要介紹了Java JDBC批量執(zhí)行executeBatch方法詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java對(duì)象轉(zhuǎn)JSON時(shí)動(dòng)態(tài)的增刪改查屬性詳解

    Java對(duì)象轉(zhuǎn)JSON時(shí)動(dòng)態(tài)的增刪改查屬性詳解

    這篇文章主要介紹了Java對(duì)象轉(zhuǎn)JSON時(shí)如何動(dòng)態(tài)的增刪改查屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel)

    詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel)

    這篇文章主要介紹了詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java 中如何使用 JavaFx 庫標(biāo)注文本顏色

    Java 中如何使用 JavaFx 庫標(biāo)注文本顏色

    這篇文章主要介紹了在 Java 中用 JavaFx 庫標(biāo)注文本顏色,在本文中,我們將了解如何更改標(biāo)簽的文本顏色,并且我們還將看到一個(gè)必要的示例和適當(dāng)?shù)慕忉專员愀菀桌斫庠撝黝},需要的朋友可以參考下
    2023-05-05
  • Java如何構(gòu)造DSL方法重構(gòu)

    Java如何構(gòu)造DSL方法重構(gòu)

    這篇文章主要介紹了Java如何構(gòu)造DSL方法重構(gòu),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考價(jià)值
    2022-07-07

最新評(píng)論

易门县| 藁城市| 门源| 茶陵县| 黔南| 会理县| 德格县| 绿春县| 报价| 大厂| 金沙县| 搜索| 高州市| 六盘水市| 醴陵市| 咸宁市| 长葛市| 遂宁市| 宝兴县| 云南省| 浦县| 西华县| 晋江市| 揭阳市| 绥滨县| 常山县| 新宾| 榕江县| 腾冲县| 岳西县| 丘北县| 张家港市| 孝义市| 邹平县| 乌拉特前旗| 秦安县| 安吉县| 泽普县| 舞阳县| 五峰| 闽侯县|