天天看點

mybatis foreach 錯誤_Mybatis之動态SQL1. 判斷語句2. 分支判斷3. where條件标簽4. 标簽,先舉個例子來說明5. 标簽6. 多值循環标簽

MyBatis 的強大特性之一便是它的動态 SQL。如果你有使用 JDBC 或其他類似架構的經驗,你就能體會到根據不同條件拼接 SQL 語句有多麼痛苦。拼接的時候要確定不能忘了必要的空格,還要注意省掉列名清單最後的逗号。利用動态 SQL 這一特性可以徹底擺脫這種痛苦。

通常使用動态 SQL 不可能是獨立的一部分,MyBatis 當然使用一種強大的動态 SQL 語言來改進這種情形,這種語言可以被用在任意的 SQL 映射語句中。

動态 SQL 元素和使用 JSTL 或其他類似基于 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多的元素需要來了解。MyBatis 3 大大提升了它們,現在用不到原先一半的元素就可以了。MyBatis 采用功能強大的基于 OGNL 的表達式來消除其他元素。

常用的幾種動态sql的标簽:if、choose(when/otherwise)、where、set、trim、foreach

下面分别介紹這幾種标簽

1. 判斷語句

If标簽是條件判斷,接受一個boolean類型,一個屬性test,定義為:

test CDATA #REQUIRED

>

注意的是多個判斷用and 或者or連接配接

例如:

    select * from person                        and persion.firstName = #{firstName}                            and id = #{id}            
           

第一個條件,如果firstName不為空,作為where的條件,連接配接符用and,第二個條件是單個條件,看起來寫法與java并沒有什麼大的不同,沒有增加開發者的學習成本。

If用作單個添加的判斷,如果多多條件分支,這時if就比較麻煩了,這時choose就發揮使用者

2. 分支判斷

這三個标簽通常都會一同出現, 有時候可以沒有

不接受任何參數,接受一個test的條件屬性,舉個例子:

    select * from person                                        and id > 100                                        and id >= 80 and id < 100                                        and id >= 60 and id < 80                                        and id < 60                        
           

三個分支,按照條件查詢不同的資料範圍的資料, 注意的是 > < 的寫法,在mybatis裡面,不能直接用,隻能用> 表示>,< 表示= 那麼>=,<=表示也是一樣的。

3. where條件标簽

向上述兩個例子中,都用到了标簽,通常where标簽和if,whoose配合使用,如果在添加的前面加上where 語句,如果條件沒有,則不加where,如果沒有這樣的标簽,那麼隻能在前面加上1=1,這樣很難看

4. 标簽,先舉個例子來說明

依然是上面的裡面,那麼我們不同where的話,怎麼做了,也可以用trim

    select * from person                                        and id > 100                                        and id >= 80 and id < 100                                        and id >= 60 and id < 80                                        and id < 60                        
           

我們在條件的前面加上一個where語句,如果前面是and,那麼去填,可以在前後加,

5. 标簽

通常在更新語句中用到

  update "awful table"            "first name" = #{firstFirstName,jdbcType=VARCHAR},              FIRST_NAME = #{secondFirstName,jdbcType=VARCHAR},        where "CuStOmEr iD" = #{customerId,jdbcType=INTEGER}
           

Set配合if或者choose一起使用, 特别要注意,如果全都是空,會報sql錯誤,如果有如下SQL:

update ytx_consult

and login_id = #{loginId}

and nick_name = #{nickName}

where id = 1

而兩個條件都為空,那麼執行的sql就是:update ytx_consult where id = 1

是以在此要保證至少有一項不為空,比如加上update_time = now()

6. 多值循環标簽

如果傳入的是多個值的資料或清單,那麼需要循環,看一個完整的例子:

  SELECT *  FROM POST P            id = #{id}      AND author_id = #{author_id}                        AND id IN          #{ids[${index}]}                                                                                
           

這個例子中用到多種動态的sql,在此主要看foreach,傳遞過來的是一個數組,那麼在in中,循環擷取這個數組作為參數, 我們來看看foreach的定義:

上述示例中,選擇ids, 每項表示為item_id,元素的前後加上括号,以逗号分隔。

mybatis foreach 錯誤_Mybatis之動态SQL1. 判斷語句2. 分支判斷3. where條件标簽4. 标簽,先舉個例子來說明5. 标簽6. 多值循環标簽