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

MyBatis中常用的SQL語(yǔ)句詳解

 更新時(shí)間:2025年03月10日 09:39:55   作者:冰糖心書房  
MyBatis是一種優(yōu)秀的持久層框架,它支持定制化SQL、存儲(chǔ)過(guò)程以及高級(jí)映射,本文介紹了MyBatis中常用的SQL語(yǔ)句,包括基本查詢、多條件查詢、關(guān)聯(lián)查詢、分頁(yè)查詢、插入、更新、刪除等,并結(jié)合MyBatis的特性進(jìn)行了說(shuō)明

MyBatis 中常用的 SQL 語(yǔ)句與標(biāo)準(zhǔn) SQL 語(yǔ)句基本一致,但 MyBatis 提供了一些額外的特性和標(biāo)簽來(lái)更方便地構(gòu)建和管理 SQL 語(yǔ)句。

以下列出 MyBatis 中常用的 SQL 語(yǔ)句,并結(jié)合 MyBatis 的特性進(jìn)行說(shuō)明:

1. SELECT (查詢)

基本查詢:

<select id="selectUserById" parameterType="int" resultType="User">
  SELECT id, username, password, email FROM users WHERE id = #{id}
</select>
  • id: 該 SQL 語(yǔ)句的唯一標(biāo)識(shí)符,用于在 Java 代碼中引用。
  • parameterType: 傳入?yún)?shù)的類型 (可選,MyBatis 可以自動(dòng)推斷)。
  • resultType: 查詢結(jié)果映射的 Java 類型 (POJO)。
  • #{id}: 占位符,表示傳入的參數(shù),MyBatis 會(huì)自動(dòng)進(jìn)行參數(shù)綁定和類型轉(zhuǎn)換,防止 SQL 注入。

多條件查詢 (動(dòng)態(tài) SQL):

<select id="selectUsers" parameterType="map" resultType="User">
  SELECT id, username, password, email FROM users
  <where>
    <if test="username != null and username != ''">
      AND username LIKE CONCAT('%', #{username}, '%')
    </if>
    <if test="email != null and email != ''">
      AND email = #{email}
    </if>
  </where>
</select>
  • <where>: 自動(dòng)添加 WHERE 關(guān)鍵字,并處理多余的 ANDOR
  • <if>: 根據(jù)條件判斷是否包含該 SQL 片段。
  • test: 條件表達(dá)式,使用 OGNL 表達(dá)式。
  • LIKE: 模糊查詢,CONCAT('%', #{username}, '%') 用于構(gòu)建模糊查詢條件。

關(guān)聯(lián)查詢 (JOIN):

<select id="selectUserWithOrders" parameterType="int" resultMap="userWithOrdersResultMap">
  SELECT
    u.id AS user_id,
    u.username,
    o.id AS order_id,
    o.order_date
  FROM users u
  LEFT JOIN orders o ON u.id = o.user_id
  WHERE u.id = #{id}
</select>

<resultMap id="userWithOrdersResultMap" type="User">
  <id property="id" column="user_id"/>
  <result property="username" column="username"/>
  <collection property="orders" ofType="Order">
    <id property="id" column="order_id"/>
    <result property="orderDate" column="order_date"/>
  </collection>
</resultMap>
  • LEFT JOIN: 左連接,獲取用戶及其所有訂單。
  • resultMap: 自定義結(jié)果映射,用于處理復(fù)雜的關(guān)聯(lián)關(guān)系。
  • <collection>: 映射一對(duì)多關(guān)系,將訂單列表映射到 User 對(duì)象的 orders 屬性。

分頁(yè)查詢 :

<!-- MySQL -->
<select id="selectUsersByPage" parameterType="map" resultType="User">
  SELECT id, username, password, email FROM users LIMIT #{offset}, #{pageSize}
</select>

<!-- Oracle -->
<select id="selectUsersByPage" parameterType="map" resultType="User">
  SELECT * FROM (
    SELECT t.*, ROWNUM rn FROM (
      SELECT id, username, password, email FROM users
    ) t WHERE ROWNUM <= #{endRow}
  ) WHERE rn > #{startRow}
</select>
  • LIMIT: MySQL 中的分頁(yè)關(guān)鍵字。
  • ROWNUM: Oracle 中的偽列,用于分頁(yè)。
  • 需要根據(jù)不同的數(shù)據(jù)庫(kù)方言使用不同的分頁(yè)語(yǔ)法。 MyBatis 提供了 Dialect 接口來(lái)支持不同的數(shù)據(jù)庫(kù)方言。

2. INSERT (插入)

  • 基本插入:
<insert id="insertUser" parameterType="User">
  INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
</insert>
  • 獲取自增主鍵:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
  INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
</insert>
  • useGeneratedKeys="true": 啟用獲取自增主鍵。
  • keyProperty="id": 指定將自增主鍵值設(shè)置到 User 對(duì)象的哪個(gè)屬性 (通常是 id)。

批量插入 (foreach):

<insert id="batchInsertUsers" parameterType="java.util.List">
  INSERT INTO users (username, password, email) VALUES
  <foreach collection="list" item="user" separator=",">
    (#{user.username}, #{user.password}, #{user.email})
  </foreach>
</insert>
  • <foreach>: 循環(huán)遍歷 list 集合,生成多個(gè)插入值。
  • collection: 指定要遍歷的集合。
  • item: 集合中每個(gè)元素的別名。
  • separator: 分隔符,用于分隔每次循環(huán)生成的 SQL 片段。

3. UPDATE (更新)

  • 基本更新:
<update id="updateUser" parameterType="User">
  UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}
</update>
  • 動(dòng)態(tài)更新 (set + if):
<update id="updateUserSelective" parameterType="User">
  UPDATE users
  <set>
    <if test="username != null and username != ''">
      username = #{username},
    </if>
    <if test="password != null and password != ''">
      password = #{password},
    </if>
    <if test="email != null and email != ''">
      email = #{email},
    </if>
  </set>
  WHERE id = #{id}
</update>
  • <set>: 自動(dòng)添加 SET 關(guān)鍵字,并處理多余的逗號(hào)。
  • 只更新傳入的非空字段。

4. DELETE (刪除)

  • 基本刪除:
<delete id="deleteUserById" parameterType="int">
  DELETE FROM users WHERE id = #{id}
</delete>
  • 批量刪除 (foreach):
<delete id="deleteUsersByIds" parameterType="java.util.List">
  DELETE FROM users WHERE id IN
  <foreach collection="list" item="id" open="(" close=")" separator=",">
    #{id}
  </foreach>
</delete>
  • open: 循環(huán)開(kāi)始前添加的字符串。
  • close: 循環(huán)結(jié)束后添加的字符串。

5. 其他常用標(biāo)簽和特性

  • <sql>: 定義可重用的 SQL 片段。
<sql id="userColumns">
  id, username, password, email
</sql>

<select id="selectUserById" parameterType="int" resultType="User">
  SELECT <include refid="userColumns"/> FROM users WHERE id = #{id}
</select>
  • #{} vs ${}:
    • #{}: 預(yù)編譯參數(shù),防止 SQL 注入,推薦使用。
    • ${}: 字符串替換,直接將值拼接到 SQL 語(yǔ)句中,有 SQL 注入風(fēng)險(xiǎn),謹(jǐn)慎使用 (例如,用于動(dòng)態(tài)表名或列名)。
  • typeAliases: 定義類型別名,簡(jiǎn)化 resultTypeparameterType 的書寫。
  • <cache>: 開(kāi)啟二級(jí)緩存,提高查詢性能。
  • Result Maps (結(jié)果映射): 處理復(fù)雜類型和關(guān)聯(lián)關(guān)系的映射。

總結(jié)

MyBatis 的核心在于將 SQL 語(yǔ)句與 Java 代碼分離,并通過(guò) XML 或注解的方式進(jìn)行配置。 盡可能使用 #{} 進(jìn)行參數(shù)綁定,以防止 SQL 注入。

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

相關(guān)文章

  • Java實(shí)現(xiàn)多個(gè)sheet頁(yè)數(shù)據(jù)導(dǎo)出功能

    Java實(shí)現(xiàn)多個(gè)sheet頁(yè)數(shù)據(jù)導(dǎo)出功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多個(gè)sheet頁(yè)數(shù)據(jù)導(dǎo)出功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    這篇文章主要給大家介紹了利用Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例,本文生成的是GIF格式 + 干擾元素,讓驗(yàn)證碼破解難度又上了一個(gè)層次,文中給出了詳細(xì)的示例代碼,并在文末給出了完整的實(shí)例代碼供大家下載學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • Springboot中yml文件沒(méi)有葉子圖標(biāo)的解決

    Springboot中yml文件沒(méi)有葉子圖標(biāo)的解決

    這篇文章主要介紹了Springboot中yml文件沒(méi)有葉子圖標(biāo)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Scala 操作Redis使用連接池工具類RedisUtil

    Scala 操作Redis使用連接池工具類RedisUtil

    這篇文章主要介紹了Scala 操作Redis使用連接池工具類RedisUtil,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • AI算法實(shí)現(xiàn)五子棋(java)

    AI算法實(shí)現(xiàn)五子棋(java)

    這篇文章主要為大家詳細(xì)介紹了AI算法實(shí)現(xiàn)五子棋,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Java多線程繼承Thread類詳解

    Java多線程繼承Thread類詳解

    Java多線程的兩種實(shí)現(xiàn)方式:繼承Thread類 & 實(shí)現(xiàn)Runable接口,今天我們來(lái)學(xué)習(xí)下繼承Thread類,希望大家能夠喜歡
    2016-06-06
  • JsonProperty及JSONField注解的使用說(shuō)明

    JsonProperty及JSONField注解的使用說(shuō)明

    文章介紹了兩個(gè)常用的Java庫(kù)注解:Jackson的@JsonProperty和Fastjson的@JSONField,它們用于控制Java對(duì)象與JSON數(shù)據(jù)之間的序列化和反序列化,文章詳細(xì)說(shuō)明了這兩個(gè)注解的常見(jiàn)屬性及其使用場(chǎng)景,包括指定屬性名、控制字段可見(jiàn)性、設(shè)置默認(rèn)值和標(biāo)記字段的必需性
    2024-12-12
  • java多線程編程必備volatile與synchronized深入理解

    java多線程編程必備volatile與synchronized深入理解

    這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java中indexOf函數(shù)示例詳解

    Java中indexOf函數(shù)示例詳解

    Java String 類的 indexOf() 方法返回指定字符串中指定字符或字符串第一次出現(xiàn)的位置,這篇文章主要介紹了Java中indexOf函數(shù)詳解,需要的朋友可以參考下
    2024-01-01
  • SpringCloud的Gateway網(wǎng)關(guān)詳解

    SpringCloud的Gateway網(wǎng)關(guān)詳解

    這篇文章主要介紹了SpringCloud的Gateway網(wǎng)關(guān)詳解,Gateway 是 Spring Cloud 官方推出的一個(gè)基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 網(wǎng)關(guān)實(shí)現(xiàn),本文將介紹 Spring Cloud Gateway 的基本概念、核心組件以及如何配置和使用它,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

会昌县| 大同市| 吉木萨尔县| 谢通门县| 寿光市| 景东| 商丘市| 巫山县| 高尔夫| 河源市| 梅河口市| 平陆县| 凯里市| 潼南县| 贵州省| 肇州县| 普定县| 额尔古纳市| 营口市| 丰都县| 会宁县| 宁武县| 余干县| 汽车| 宣汉县| 长春市| 陆川县| 桦甸市| 紫金县| 廊坊市| 民县| 威宁| 海阳市| 吉林市| 山东省| 思南县| 阿合奇县| 昭通市| 社旗县| 礼泉县| 澳门|