主頁 > 知識庫 > mybatis動態(tài)sql常用場景總結(jié)

mybatis動態(tài)sql常用場景總結(jié)

熱門標(biāo)簽:武漢AI電銷機(jī)器人 萬利達(dá)綜合醫(yī)院地圖標(biāo)注點(diǎn) 實(shí)體店地圖標(biāo)注怎么標(biāo) 南京電銷外呼系統(tǒng)哪家好 外呼系統(tǒng)會封嗎 電銷機(jī)器人 深圳 股票配資電銷機(jī)器人 在電子版地圖標(biāo)注要收費(fèi)嗎 地圖標(biāo)注如何弄全套標(biāo)

前言

平時(shí)在開發(fā)中,針對動態(tài)sql這塊目前是薄弱點(diǎn),自己根據(jù)官網(wǎng)在對應(yīng)項(xiàng)目邊測試邊寫博客,此篇只是為了加深動態(tài)sql的熟練度,有不到之處敬請批評指正!

1.if

使用動態(tài) SQL 最常見情景是根據(jù)條件包含 where 子句的一部分。比如:

select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE'
  if test="title != null">
    AND title like #{title}
  /if>
/select>

這條語句提供了可選的查找文本功能。如果不傳入 “title”,那么所有處于 “ACTIVE” 狀態(tài)的 BLOG 都會返回;如果傳入了 “title” 參數(shù),那么就會對 “title”
一列進(jìn)行模糊查找并返回對應(yīng)的 BLOG 結(jié)果(細(xì)心的讀者可能會發(fā)現(xiàn),“title” 的參數(shù)值需要包含查找掩碼或通配符字符)。
如果希望通過 “title” 和 “author” 兩個(gè)參數(shù)進(jìn)行可選搜索該怎么辦呢?首先,我想先將語句名稱修改成更名副其實(shí)的名稱;接下來,只需要加入另一個(gè)條件即可。

select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE'
  if test="title != null">
    AND title like #{title}
  /if>
  if test="author != null and author.name != null">
    AND author_name like #{author.name}
  /if>
/select>

2. choose、when、otherwise

有時(shí)候,我們不想使用所有的條件,而只是想從多個(gè)條件中選擇一個(gè)使用。針對這種情況,MyBatis 提供了 choose 元素,它有點(diǎn)像 Java 中的 switch 語句。
還是上面的例子,但是策略變?yōu)椋簜魅肓?“title” 就按 “title” 查找,傳入了 “author” 就按 “author” 查找的情形。若兩者都沒有傳入,
就返回標(biāo)記為 featured 的 BLOG(這可能是管理員認(rèn)為,與其返回大量的無意義隨機(jī) Blog,還不如返回一些由管理員精選的 Blog)。

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 != null">
      AND author_name like #{author.name}
    /when>
    otherwise>
      AND featured = 1
    /otherwise>
  /choose>
/select>

3. trim、where、set

前面幾個(gè)例子已經(jīng)方便地解決了一個(gè)臭名昭著的動態(tài) SQL 問題?,F(xiàn)在回到之前的 “if” 示例,這次我們將 “state = ‘ACTIVE'” 設(shè)置成動態(tài)條件,看看會發(fā)生什么。

select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE
  if test="state != null">
    state = #{state}
  /if>
  if test="title != null">
    AND title like #{title}
  /if>
  if test="author != null and author.name != null">
    AND author_name like #{author.name}
  /if>
/select>

如果沒有匹配的條件會怎么樣?最終這條 SQL 會變成這樣:

SELECT * FROM BLOG
WHERE

這會導(dǎo)致查詢失敗。如果匹配的只是第二個(gè)條件又會怎樣?這條 SQL 會是這樣:

SELECT * FROM BLOG
WHERE
AND title like ‘someTitle'

這個(gè)查詢也會失敗。這個(gè)問題不能簡單地用條件元素來解決。這個(gè)問題是如此的難以解決,以至于解決過的人不會再想碰到這種問題。
MyBatis 有一個(gè)簡單且適合大多數(shù)場景的解決辦法。而在其他場景中,可以對其進(jìn)行自定義以符合需求。而這,只需要一處簡單的改動:

select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  where>
    if test="state != null">
         state = #{state}
    /if>
    if test="title != null">
        AND title like #{title}
    /if>
    if test="author != null and author.name != null">
        AND author_name like #{author.name}
    /if>
  /where>
/select>

where 元素只會在子元素返回任何內(nèi)容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會將它們?nèi)コ?br /> 如果 where 元素與你期望的不太一樣,你也可以通過自定義 trim 元素來定制 where 元素的功能。比如,和 where 元素等價(jià)的自定義 trim 元素為:

trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
/trim>

prefixOverrides 屬性會忽略通過管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子會移除所有 prefixOverrides 屬性中指定的內(nèi)容,并且插入 prefix 屬性中指定的內(nèi)容。
用于動態(tài)更新語句的類似解決方案叫做 set。set 元素可以用于動態(tài)包含需要更新的列,忽略其它不更新的列。比如:

update id="updateAuthorIfNecessary">
  update Author
    set>
      if test="username != null">username=#{username},/if>
      if test="password != null">password=#{password},/if>
      if test="email != null">email=#{email},/if>
      if test="bio != null">bio=#{bio}/if>
    /set>
  where id=#{id}
/update>

這個(gè)例子中,set 元素會動態(tài)地在行首插入 SET 關(guān)鍵字,并會刪掉額外的逗號(這些逗號是在使用條件語句給列賦值時(shí)引入的)。
來看看與 set 元素等價(jià)的自定義 trim 元素吧:

trim prefix="SET" suffixOverrides=",">
  ...
/trim>

注意,我們覆蓋了后綴值設(shè)置,并且自定義了前綴值。

4. foreach

動態(tài) SQL 的另一個(gè)常見使用場景是對集合進(jìn)行遍歷(尤其是在構(gòu)建 IN 條件語句的時(shí)候)。比如:

select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  /foreach>
/select>

foreach 元素的功能非常強(qiáng)大,它允許你指定一個(gè)集合,聲明可以在元素體內(nèi)使用的集合項(xiàng)(item)和索引(index)變量。它也允許你指定開頭與結(jié)尾的字符串以及集合項(xiàng)迭代之間的分隔符。
這個(gè)元素也不會錯(cuò)誤地添加多余的分隔符,看它多智能!
提示 你可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數(shù)組對象作為集合參數(shù)傳遞給 foreach。當(dāng)使用可迭代對象或者數(shù)組時(shí),index 是當(dāng)前迭代的序號,
item 的值是本次迭代獲取到的元素。當(dāng)使用 Map 對象(或者 Map.Entry 對象的集合)時(shí),index 是鍵,item 是值。
至此,我們已經(jīng)完成了與 XML 配置及映射文件相關(guān)的討論。下一章將詳細(xì)探討 Java API,以便你能充分利用已經(jīng)創(chuàng)建的映射配置。

到此這篇關(guān)于mybatis動態(tài)sql總結(jié)的文章就介紹到這了,更多相關(guān)mybatis動態(tài)sql內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • IDEA下創(chuàng)建SpringBoot+MyBatis+MySql項(xiàng)目實(shí)現(xiàn)動態(tài)登錄與注冊功能
  • mybatis的動態(tài)sql之if test的使用說明
  • 在Mybatis @Select注解中實(shí)現(xiàn)拼寫動態(tài)sql
  • Mybatis中的動態(tài)SQL語句解析
  • MyBatis動態(tài)Sql之if標(biāo)簽的用法詳解
  • mybatis動態(tài)sql之Map參數(shù)的講解
  • Mybatis下動態(tài)sql中##和$$的區(qū)別講解
  • MyBatis執(zhí)行動態(tài)SQL的方法

標(biāo)簽:廣東 臺州 汕頭 濟(jì)源 安徽 泰安 濟(jì)寧 武威

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mybatis動態(tài)sql常用場景總結(jié)》,本文關(guān)鍵詞  mybatis,動態(tài),sql,常用,場景,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mybatis動態(tài)sql常用場景總結(jié)》相關(guān)的同類信息!
  • 本頁收集關(guān)于mybatis動態(tài)sql常用場景總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章