c++ 传入动态参数_一文了解Mybatis中动态SQL的实现
一、動態SQL簡介
MyBatis的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其他類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句有多么痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最后的逗號。有些時候,SQL語句where條件中,需要一些安全判斷,例如按某一條件查詢時如果傳入的參數是空,此時查詢出的結果很可能是空的,也許我們需要參數為空時,是查出全部的信息。使用Oracle的序列、mySQL的函數生成Id。這時我們可以使用動態SQL。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。通常使用動態 SQL 不可能是獨立的一部分,MyBatis 當然使用一種強大的動態 SQL 語言來改進這種情形,這種語言可以被用在任意的 SQL 映射語句中。動態 SQL 元素和使用 JSTL 或其他類似基于 XML 的文本處理器相似。MyBatis 采用功能強大的基于 OGNL 的表達式來消除其他元素。
MyBatis中用于實現動態SQL的元素主要有:
1、if和where
2、choose(when,otherwise)
3、trim
4、set
5、foreach
下面將逐一進行介紹。
二、動態SQL的元素詳解
首先來介紹一下SQL片段,它可以把動態SQL的判斷部分獨立處理,以便其他查詢進行復用。
SQL片段定義方式:
引用SQL片段
1、if和where
if就是簡單的條件判斷,利用if語句我們可以實現某些簡單的條件選擇。動態 SQL 通常要做的事情是有條件地包含 where 子句的一部分。
使用示例:
查詢語句塊:
resultType="com.kang.pojo.UserCustom">
SELECT * FROM USER
where元素的作用是會在寫入where元素的地方輸出一個where,另外一個好處是你不需要考慮where元素里面的條件輸出是什么樣子的,MyBatis會智能的幫你處理。如果所有的條件都不滿足那么MyBatis就會查出所有的記錄;如果輸出后是and這個單詞開頭的,MyBatis會把第一個單詞and忽略,當然如果是or開頭的,MyBatis也會把它忽略。此外,在where元素中你不需要考慮空格的問題,MyBatis會智能的幫你加上。
SQL片段:
and user.sex = #{userCustom.sex}
and user.username LIKE '%${userCustom.username}%'
上述配置意思非常簡單,如果你提供了sex參數,那么就要滿足sex!=null和sex!=''兩個條件,同樣如果你提供了username參數的時候,也需要滿足相應的條件,之后就是返回滿足這些條件的所有user,這是非常有用的一個功能,以往我們使用其他類型框架或者直接使用JDBC的時候, 如果我們要達到同樣的選擇效果的時候,我們就需要拼SQL語句,這是極其麻煩的,比起來,上述的動態SQL就要簡單多了。
如果輸入是sex=1和username=null,那么上述配置產生的SQL語句就是:
SELECT * FROM USER where user.sex = #{userCustom.sex}
而不是:
SELECT * FROM USER and user.sex = #{userCustom.sex}
因為where標簽自動加入了"where"這個關鍵字,而且去掉了"and"這個單詞,并在where的前后自動加入了空格,最終組合成相應的SQL語句。
2、choose
choose元素的作用就相當于JAVA中的switch語句,基本上跟JSTL中的choose的作用和用法是一樣的,通常都是與when和otherwise搭配的。
使用示例:
resultType="com.kang.pojo.UserCustom">
SELECT * FROM USER
and user.sex = #{userCustom.sex}
and user.username LIKE '%${userCustom.username}%'
and user.id = 1
上述配置中,when元素表示當when中的條件滿足的時候就輸出其中的內容,跟JAVA中的switch效果差不多的是按照條件的順序,當when中有條件滿足的時候,就會跳出choose,即所有的when和otherwise條件中,只有一個會輸出,當所有的條件都不滿足的時候就輸出otherwise中的內容。
3、trim
trim元素的主要功能是可以在自己包含的內容前加上某些前綴,也可以在其后加上某些后綴,與之對應的屬性是prefix和suffix;可以把包含內容的首部某些內容覆蓋,即忽略,也可以把尾部的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOverrides;正因為trim有這樣的功能,所以我們也可以非常簡單的利用trim來代替where元素的功能。
使用示例:
resultType="com.kang.pojo.UserCustom">
SELECT * FROM USER
and user.sex = #{userCustom.sex}
and user.username LIKE '%${userCustom.username}%'
4、set
set元素主要是用在更新操作的時候,它的主要功能和where元素其實是差不多的,主要是在set標簽包含的語句前輸出一個set。如果包含的語句是以逗號結束的話將會把該逗號忽略。如果set包含的內容為空的話則會出錯。有了set元素我們就可以動態的更新那些修改了的字段,而不用每次更新全部字段。
使用示例:
update user
username=#{username},
birthday=#{birthday},
sex=#{sex},
address=#{address}
where id = #{id}
5、foreach
foreach的主要用在構建in條件中,它可以在SQL語句中迭代一個集合。foreach元素的屬性主要有item,index,collection,open,separator,close。
item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作為分隔符,close表示以什么結束。
collection屬性用于指定傳入參數的類型。該屬性是必須指定的,在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:
如果傳入的是單參數且參數類型是一個List類型的時候,collection屬性值為list。
如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array。
如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map。實際上在傳入參數的時候,MyBatis也是把它封裝成一個Map的,List實例將會以“list”作為鍵,而數組實例將會以“array”作為鍵。這個時候collection屬性值就是傳入的List或array對象在封裝自身的map里面中的對應key。
傳入List的使用示例:
首先是查詢接口:
public List findUserList(List ids);
對應xml文件中的配置:
SELECT * FROM USER WHERE id IN
總結
以上是生活随笔為你收集整理的c++ 传入动态参数_一文了解Mybatis中动态SQL的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧洲科技业:微软在云计算垄断问题上须做更
- 下一篇: NASA推迟波音"星际线"飞船首次载人飞