實現動態SQL的元素
if (多條件選擇)
用來判斷參數 在需要判斷參數的SQL語句中添加if
屬性
test
要判斷的條件
如果滿足該條件,則會在sql語句中增加if中的那一段sql語句

<!-- if判斷條件 --> <select id="userListAssociation" resultMap="userRoleAssociation"> select u.*,r.id as r_id,r.roleName,r.roleCode from smbms_user u,smbms_role r where u.userRole = r.id <!-- 如果userName不是空值null的話,則進入if --> <if test="userName!=null"> and `userName` LIKE CONCAT('%',#{userName},'%') </if> <!-- 如果userRole不是空值null的話,則進入if --> <if test="userRole!=null"> AND `userRole`=#{userRole} </if> </select>
where (簡化sql判斷條件)
使用where標簽時,它上層的sql語句不加where條件關鍵字
如果where標簽內有返回值,則where會自動給sql語句加上where
如果這個標簽(返回值)是以and,or等查詢關鍵字開頭,則自動去除這些關鍵字
如果where標簽內沒有返回值,則不加where條件關鍵字

<!-- where --> <select id="getUserListByPojo" resultType="User" parameterType="User"> SELECT * FROM `smbms_user` <!-- 外層的where關鍵字不用寫 如果where標簽內有返回值,則自動加上where關鍵字,如果沒有返回值,則不會加where關鍵字 --> <where> <if test="userName!=null"> `userName` LIKE CONCAT('%',#{userName},'%') </if> <if test="userRole!=null"> AND `userRole`=#{userRole} </if> </where> </select>
set (set動態更新)
更新時,若某個參數為null,則不需要更新,保持數據庫原值
使用set標簽時,它的上層sql語句不加set條件關鍵字
如果set標簽內有返回值,則set會自動給sql語句加上set關鍵字
set標簽會自動去除(返回值)以","分隔符結束的sql語句

<!-- set --> <update id="updateUser"> UPDATE `smbms_user` <!-- 使用set處理分隔符“ , ” --> <set> <if test="userCode!=null"> `userCode` = #{userCode}, </if> <if test="userName!=null"> `userName` = #{userName} </if> </set> WHERE `id` = #{id} </update>
trim(去除多余關鍵字(代替set和where))
trim標簽會自動識別標簽內是否有返回值,如果有返回值,則會加上屬性的作用
屬性
prefix前綴(在trim元素包含的內容上加上前綴)
where----------where標簽
set----------set標簽
suffix后綴(在trim元素包含的內容上加上后綴)
prefixOverrides前綴覆蓋
可以覆蓋(去除)sql語句開頭的and或or關鍵字等,例:prefixOverrides="and | or"
suffixOverrides后綴覆蓋
可以覆蓋sql語句尾部的","分隔符,例:suffixOverrides=","
trim代替where
<!-- trim代替where --> <select id="getUserListByPojos" resultType="User" parameterType="User"> SELECT * FROM `smbms_user` <!-- 通常prefix="where"和prefixOverrides="and | or"一起--> <!-- 前綴是where,去除sql語句中開頭的and或or --> <trim prefix="where" prefixOverrides="and | or"> <if test="userName!=null"> `userName` LIKE CONCAT('%',#{userName},'%') </if> <if test="userRole!=null"> AND `userRole`=#{userRole} </if> </trim> </select>
trim代替set
<!-- trim代替set --> <update id="updateUsers"> UPDATE `smbms_user` <!-- 通常prefix="set"和suffixOverrides=","一起 --> <!-- 前綴是set,去除sql語句尾部的"," --> <trim prefix="set" suffixOverrides=","> <if test="userCode!=null"> `userCode` = #{userCode}, </if> <if test="userName!=null"> `userName` = #{userName} </if> </trim> WHERE `id` = #{id} </update>
foreach(迭代一個集合,一般用於in條件)
foreach的主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合
屬性
item
給集合或數組起個別名
index
指定一個名稱,表示迭代時每次迭代到的位置
collection必須指定(指定用什么類型接收)
list 集合
array 數組
map-key 鍵值對
open 表示改語句以什么開始,它的值是(
separator 分割符,它的值是 ","
close 表示改語句以什么結束,它的值是)
collection="array"在mapper中示例
<!-- foreach collection="array" --> <select id="getUserListArray" resultType="User"> SELECT * FROM `smbms_user` where id in <!-- collection="array" item="ids" 給數組的名稱是ids open="(" 以"("開始 close=")" 以")"結束 separator="," 分隔符是"," --> <foreach collection="array" item="ids" open="(" close=")" separator=","> <!-- ONGL表達式引用數組中的值 --> #{ids} </foreach> </select>
collection="array"在接口中示例
/** * collection="array" 使用數組傳入參數 * @param ids * @return */ public List<User> getUserListArray(Integer [] ids);
-------List與Array基本一樣-------