好程式設計師分享MyBatis之動態SQL語句

好程式設計師發表於2020-07-20

  好程式設計師分享MyBatis 之動態 SQL 語句,我們在進行專案開發時,經常遇到需要根據不同的需求,對原有 SQL 語句的內容進行修改,原來這是一個比較頭疼的問題,因為需要對原有 SQL 語句進行拼接、重組,費時費力還容易出錯,今天我們將學習 MyBatis 的動態 SQL 功能,可以解決這個問題。

  動態SQL 語句簡介

  動態SQL 語句是 MyBatis 的一個非常強大的功能,允許我們根據不同的需求,組合出不同的 SQL 語句,在 select update insert delete 標籤中都可以新增動態 SQL 語句。

  IF 標籤

  IF 標籤可以在條件成立時,在 SQL 語句中插入 IF 標籤中的內容,不成立就不插入

  示例:

  <select id="selectUserByUser" parameterType="User" resultMap="userMap">

  select * from tb_user where

  <if test="realname != null">

  u_realname=#{realname}

  </if>

  <if test="gender != null">

  and u_gender=#{gender}

  </if>

  </select>

  上面程式碼中是按照User 物件的各個屬性進行查詢,如果姓名不為空就插入姓名作為條件,如果性別不為空就插入性別作為條件。

  但是我們會發現如果姓名為空,性別不為空,SQL 語句就會變成: select * from tb_user where and u_gender=#{gender}

  或者姓名、性別都為空就會變成:select * from tb_user where

  這樣都會出現語法錯誤,這樣我們就需要下一個標籤:where

  Where 標籤

  Where 標籤 用於配置 where 條件,會去掉多餘的 and or ,如果一個條件都不成立,會自動去掉 sql 中的 where

  程式碼改為:

  <select id="selectUserByUser" parameterType="User" resultMap="userMap">

  select * from tb_user

  <where>

  <if test="realname != null">

  u_realname=#{realname}

  </if>

  <if test="gender != null">

  and u_gender=#{gender}

  </if>

  <if test="age != null">

  and u_age=#{age}

  </if>

  </where>

  </select>

  這樣就不會出現上面可能的錯誤了

  Trim 標籤

  上面where 標籤的功能,也可以使用 trim 標籤實現, trim 能去掉多餘的字首和字尾。

  語法:

  <trim prefix=" 字首 SQL" suffix=" 字尾 " prefixOverrides=" 刪除前面的符號 " suffixOverrides=" 刪除後面的符號 ">

  <if 標籤 >

  </trim>

  示例:

  <trim prefix="where" prefixOverrides="and|or">

  ...

  </trim>

  Set 標籤

  用於配置update 語句中的 set 部分,可以自動新增 set 關鍵字,刪除多餘的逗號

  示例:

  <update id="update" parameterType="User">

  update tb_user

  <set>

  <if test="name != null">

  u_name=#{name},

  </if>

  <if test="password != null">

  u_password=#{password},

  </if>

  </set>

  where u_id=#{id}

  </update>

  也可以使用trim 實現:

  <trim prefix="set" suffixOverrides=",">

  <if test="name != null">

  u_name=#{name},

  </if>

  ...

  </trim>

  Foreach 標籤

  用於迴圈遍歷集合或陣列的值,如:按多個人姓名查詢

  select * from tb_user where u_realname in (' 張三 ',' 李四 '....)

  語法:

  <foreach collection=" 集合名 " item=" 變數名 " index=" 下標名 " open=" 開始符號 " close=" 結束符號 " seperator=" 分割符號 ">

  #{ 變數名 }

  </foreach>

  注意:集合名在Mapper 介面中需要使用 @Param 註解配置

  示例:

  <select id="selectUserByRealnames" resultMap="userMap">

  select * from tb_user where u_realname in

  <foreach collection="realnames" item="name" index="i" separator="," open="(" close=")">

  #{name}

  </foreach>

  </select>

  Choose 標籤

  Java 中有 if ,也會有 if-else switch 語句來判斷多個條件, MyBatis 也有 Choose 標籤可以進行多條件判斷

  示例:

  <select id="findActiveBlogLike"

  resultType="Blog">

  SELECT * FROM BLOG WHERE state = ACTIVE

  <choose>

  <when test="title != null">

  AND title like #{title}

  </when>

  <when test="author != null">

  AND author_name like #{author}

  </when>

  <otherwise>

  AND featured = 1

  </otherwise>

  </choose>

  </select>

  這裡從第一個when 進行判斷,如果成立就插入條件,結束 choose 標籤,如果不成立再判斷下一個 when ,如果所有 when 都不成立,就插入 otherwise 中的語句。

  總結

    動態SQL 語句是 MyBatis 非常重要的特性,能夠讓我們根據不同需求組合 SQL 語句,而且不容易出錯。動態 SQL 的標籤有: if where set choose foreach 等。掌握好它們我們可以寫出更加靈活、高效的資料庫操作程式碼。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2705601/,如需轉載,請註明出處,否則將追究法律責任。

相關文章