欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis中常用的SQL語句詳解

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

MyBatis 中常用的 SQL 語句與標準 SQL 語句基本一致,但 MyBatis 提供了一些額外的特性和標簽來更方便地構建和管理 SQL 語句。

以下列出 MyBatis 中常用的 SQL 語句,并結合 MyBatis 的特性進行說明:

1. SELECT (查詢)

基本查詢:

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

多條件查詢 (動態(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>: 自動添加 WHERE 關鍵字,并處理多余的 ANDOR。
  • <if>: 根據(jù)條件判斷是否包含該 SQL 片段。
  • test: 條件表達式,使用 OGNL 表達式。
  • LIKE: 模糊查詢,CONCAT('%', #{username}, '%') 用于構建模糊查詢條件。

關聯(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: 自定義結果映射,用于處理復雜的關聯(lián)關系。
  • <collection>: 映射一對多關系,將訂單列表映射到 User 對象的 orders 屬性。

分頁查詢 :

<!-- 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 中的分頁關鍵字。
  • ROWNUM: Oracle 中的偽列,用于分頁。
  • 需要根據(jù)不同的數(shù)據(jù)庫方言使用不同的分頁語法。 MyBatis 提供了 Dialect 接口來支持不同的數(shù)據(jù)庫方言。

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": 指定將自增主鍵值設置到 User 對象的哪個屬性 (通常是 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 集合,生成多個插入值。
  • collection: 指定要遍歷的集合。
  • item: 集合中每個元素的別名。
  • separator: 分隔符,用于分隔每次循環(huán)生成的 SQL 片段。

3. UPDATE (更新)

  • 基本更新:
<update id="updateUser" parameterType="User">
  UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}
</update>
  • 動態(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>: 自動添加 SET 關鍵字,并處理多余的逗號。
  • 只更新傳入的非空字段。

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)開始前添加的字符串。
  • close: 循環(huán)結束后添加的字符串。

5. 其他常用標簽和特性

  • <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 ${}:
    • #{}: 預編譯參數(shù),防止 SQL 注入,推薦使用。
    • ${}: 字符串替換,直接將值拼接到 SQL 語句中,有 SQL 注入風險,謹慎使用 (例如,用于動態(tài)表名或列名)。
  • typeAliases: 定義類型別名,簡化 resultTypeparameterType 的書寫。
  • <cache>: 開啟二級緩存,提高查詢性能。
  • Result Maps (結果映射): 處理復雜類型和關聯(lián)關系的映射。

總結

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

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

相關文章

  • Spring源碼解析之Bean的生命周期

    Spring源碼解析之Bean的生命周期

    今天給大家?guī)淼氖顷P于Java源碼的相關知識,文章圍繞著Bean的生命周期展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java打印數(shù)組的三種方法整理

    Java打印數(shù)組的三種方法整理

    許多學編程專業(yè)的同學面試的時候,考官都會問到Java如何打印數(shù)組這樣的問題,下面這篇文章主要給大家介紹了關于Java打印數(shù)組的三種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Java使用opencv識別二維碼的完整步驟

    Java使用opencv識別二維碼的完整步驟

    OpenMV是一個開源,低成本,功能強大的機器視覺模塊,下面這篇文章主要給大家介紹了關于Java使用opencv識別二維碼的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • Java編程實現(xiàn)從尾到頭打印鏈表代碼實例

    Java編程實現(xiàn)從尾到頭打印鏈表代碼實例

    這篇文章主要介紹了Java編程實現(xiàn)從尾到頭打印鏈表代碼實例,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • SpringBoot集成Devtools實現(xiàn)熱更新

    SpringBoot集成Devtools實現(xiàn)熱更新

    DevTools是開發(fā)者工具集,主要用于簡化開發(fā)過程中的熱部署問題,熱部署是指在開發(fā)過程中,當代碼發(fā)生變化時,無需手動重啟應用,系統(tǒng)能夠自動檢測并重新加載修改后的代碼,本文給大家介紹了SpringBoot集成Devtools實現(xiàn)熱更新,需要的朋友可以參考下
    2024-08-08
  • Java中關于字典樹的算法實現(xiàn)

    Java中關于字典樹的算法實現(xiàn)

    字典樹,又稱單詞查找樹,Trie樹,是一種樹形結構,哈希表的一個變種。用于統(tǒng)計,排序和保存大量的字符串,本文針對字典樹給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值
    2021-09-09
  • 基于Spring depends-on的使用詳解

    基于Spring depends-on的使用詳解

    這篇文章主要介紹了Spring depends-on的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java下SpringBoot創(chuàng)建定時任務詳解

    Java下SpringBoot創(chuàng)建定時任務詳解

    這篇文章主要介紹了Java下SpringBoot創(chuàng)建定時任務詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • JVM調試命令與調試工具詳解

    JVM調試命令與調試工具詳解

    JVM statistics Monitoring,用于監(jiān)視虛擬機運行時狀態(tài)信息的命令,它可以顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數(shù)據(jù),這篇文章主要介紹了JVM調試命令與調試工具,需要的朋友可以參考下
    2023-10-10
  • java性能調優(yōu)System的gc垃圾回收方法

    java性能調優(yōu)System的gc垃圾回收方法

    這篇文章主要為大家介紹了java性能調優(yōu)System的gc垃圾回收方法示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03

最新評論