技巧:MyBatis 中的trim標籤,好用!

2021-02-06 程序猿DD

點擊上方藍色「程序猿DD」,選擇「設為星標」

回復「資源」獲取獨家整理的學習資料!

作者 | wt_better

來源 | https://blog.csdn.net/wt_better/article/details/80992014mybatis的trim標籤一般用於去除sql語句中多餘的and關鍵字,逗號,或者給sql語句前拼接 「where「、「set「以及「values(「 等前綴,或者添加「)「等後綴,可用於選擇性插入、更新、刪除或者條件查詢等操作。1、使用trim標籤去除多餘的and關鍵字
<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 會變成這樣:

這會導致查詢失敗。如果僅僅第二個條件匹配又會怎樣?這條 SQL 最終會是這樣:
SELECT * FROM BLOG
WHERE 
AND title like 『someTitle』

你可以使用where標籤來解決這個問題,where 元素只會在至少有一個子元素的條件返回 SQL 子句的情況下才去插入「WHERE」子句。而且,若語句的開頭為「AND」或「OR」,where 元素也會將它們去除。
<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>

<trim prefix="WHERE" prefixOverrides="AND">
 <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>
</trim>

2、使用trim標籤去除多餘的逗號如果紅框裡面的條件沒有匹配上,sql語句會變成如下:
INSERT INTO role(role_name,) VALUES(roleName,)

插入將會失敗。使用trim標籤可以解決此問題,只需做少量的修改,如下所示:

註:如果你有興趣的話,也可以研究下Mybatis逆向工程生成的Mapper文件,其中也使用了trim標籤,但結合了foreach、choose等標籤,更多的是牽扯到Criterion的源碼研究。不過研究完之後,你將熟練掌握mybatis各種標籤的使用,學到Criterion的設計思想,對自己的啟發將會很大。如果想要了解更多關餘trim標籤的內容,請移步《trim標籤源碼解析》。本文參考 Mybatis官方文檔(https://mybatis.org/mybatis-3/zh/dynamic-sql.html)

歡迎加入我的知識星球,聊聊技術、說說職場、扯扯社會。

【技術圈】關於Consul作為註冊中心的四種形態演變【技術圈】配置中心除了存儲應用配置之外,適合做其他配置的存儲嗎?【社會人】老實工作沒有其他收入,為什麼還要補繳個稅?【社會人】除了年終彙算清繳之外,今年的另一件大事:LPR

加入方式:長按下方二維碼噢

我的星球是否適合你?

點擊閱讀原文看看我們都在聊啥

相關焦點

  • mybatis中trim標籤的使用
    的trim標籤一般用於去除sql語句中多餘的and關鍵字,逗號,或者給sql語句前拼接 「where「、「set「以及「values(「 等前綴,或者添加「)「等後綴,可用於選擇性插入、更新、刪除或者條件查詢等操作。
  • Mybatis中trim標籤的使用教程
    mybatis的trim標籤一般用於去除sql語句中多餘的and關鍵字,逗號,或者給sql語句前拼接 「where「、「set「以及「values
  • Mybatis trim 標籤的 2 個妙用!
    mybatis的trim標籤一般用於去除sql語句中多餘的and關鍵字,逗號,或者給sql語句前拼接 「where「、「set「以及「values
  • MyBatis 動態 SQL 詳解(以後寫 SQL 爽多了)
    ,MyBatis就會自動將where標籤拼接的sql中多出來的and和or刪掉,然而where標籤依然有弊端,比如這樣拼接sql:<select id="getEmpsByConditionIf" resultType="com.wwj.mybatis.bean.Employee">  select *
  • MyBatis 動態 SQL(認真看看, 以後寫SQL就爽多了)
    = null"> and sex=#{sex} </if> </select>在此 SQL 語句中, where 1=1 是多條件拼接時的小技巧, 後面的條件查詢就可以都用 and 了。
  • Mybatis 動態sql 學習總結
    總體說來mybatis 動態SQL 語句主要有以下幾類:  1. if 語句 (簡單的條件判斷)  2. choose (when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似.
  • Mybatis基礎最全總結
    if 標籤★if 標籤可以自動根據表達式的結果來決定是否將對應的語句添加到 SQL 中,如果條件不成立則不添加, 如果條件成立則添加。」where 標籤 (和if標籤連用)注意:where 標籤不會檢測SQL語句末尾多餘的and並刪除,因此and寫在前面★where 標籤可以自動判斷是否要刪除語句塊中的 and 關鍵字,如果檢測到 where 直接跟 and 拼接,則自動刪除 and,通常情況下 if 和 where 結合起來使用。
  • Mybatis 中xml和註解映射,原來如此簡單
    xml方式九個頂級映射元素對應標籤:<mapper namespace="com.tian.mybatis.mapper.UserMapper"> <resultMap id="
  • MyBatis動態Sql之choose,where,set標籤的用法
    假設有這樣1個需求:當參數id有值時優先使用id查詢,當id沒有值時就去判斷用戶名是否有值,如果有值就用用戶名查詢
  • 寫了10年的代碼,我最怕寫Mybatis這些配置,現在有詳解了
    1.1.3 輸入GroupId和ArtifactIdGroupId 填 com.homejim.mybatisArtifactId 填 mybatis-generator通過以上步驟, 一個普通的Maven項目就創建好了。
  • Java程式設計師必須知道的MyBatis經典面試題
    #{}是預編譯處理,${}是字符串替換Mybatis在處理#{}時,會將sql中的#{}替換為?mybatis把sql語句從Java代碼抽離出來,單獨放在XML文件管理,管理非常方便mybatis底層封裝了JDBC接口,並自動將結果映射到Java bean中,大大減少代碼的編寫數量,減少重複的工作量mybatis可以手動編寫SQL語句,靈活控制SQL語句,編寫更好的
  • Mybatis【配置文件】
    佔位符在Mybatis中,有兩種佔位符#{}解析傳遞進來的參數數據${}對傳遞進來的參數原樣拼接在SQL中主鍵生成策略如果我們在Hibernate中,當我們插入數據的時候,我們是可以選擇是UUID策略的…那麼在Mybatis是怎麼做的呢??
  • Mybatis-Generator,讓你的懶體現到極致!
    一 mybatis-generator介紹在我們對用mybatis對資料庫進行操作的時候,需要編寫實體類、接口和接口映射文件等...雖然這些是一些比較簡單的工作,但是如果操作的表一旦多起來也是比較煩心的一件事,而且是一些無腦工作。現在,有一款mybatis-generation插件可以幫我們自動完成這些事情,只需要簡單的配置既可。
  • Mybatis_day01
    第三,不利於取出SQL在資料庫客戶端執行(取出後還得刪掉中間的Java代碼,編寫好的SQL語句寫好後還得通過+號在Java進行拼湊)。解決問題:我們可以考慮不把SQL語句寫到Java代碼中,那麼把SQL語句放到哪裡呢?首先需要有一個統一存放的地方,我們可以將這些SQL語句統一集中放到配置文件或者資料庫裡面(以key-value的格式存放)。
  • Mybatis 動態sql語句if和where標籤巧妙使用
    本文章描述的是 Mybatis if標籤和where標籤的結合使用需求是:根據電話和名字查用戶數據1 sql 查詢查詢sql語句如下:SELECT id , gender , nickname , mobile , avatar FROM dts_user WHERE gender = 1 AND mobile LIKE '%456%'查詢結果如下圖所示:2 mybatis動態sql配置
  • 從0 開始手寫一個 Mybatis 框架,三步搞定!
    我們對上圖進行分析總結:1、mybatis的配置文件有2類mybatisconfig.xml,配置文件的名稱不是固定的,配置了全局的參數的配置,全局只能有一個配置文件。Mapper.xml 配置多個statemement,也就是多個sql,整個mybatis框架中可以有多個Mappe.xml配置文件。
  • Java 持久層框架之 MyBatis
    -- 用於配置對應實體類所在的包,多個 package 之間可以用 ',' 號分割 --> <property name="typeAliasesPackage" value="com.antoniopeng.ssm.domain"/> <!
  • 企業面試求職中關於mybatis必問的18道面試題解答!
    號佔位符設置參數值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式為使用反射從參數對象中獲取item對象的name屬性值,相當於param.getItem().getName()。2、Xml映射文件中,除了常見的select|insert|updae|delete標籤之外,還有哪些標籤?
  • 你用過MyBatis的discriminator鑑別器映射嗎?
    # 實現方式首先,我們需要在SysRoleMapper.xml中新建角色表的映射roleMapExtend,注意這裡我們使用的是之前新建的擴展類SysRoleExtend:<resultMap id="roleMapExtend" type=
  • mybatis框架之 resultMap 的高級應用
    各位小夥伴今天我們來了解resultMap 的高級應用mybatis 查詢多表資料庫表結構中存在的幾種多表關係:一對一 ,一對多, 多對一 ,多對多第二種方式:用 mybatis 的 resultMap 標籤返回創建一個Dept.Java