Mybatis之foreach用法----List、Array、Map三種類型遍歷

在mybatis的xml文件中構建動態sql語句時,常常會用到標籤遍歷查詢條件。特此記錄下不一樣狀況下書寫方式!-------僅供你們參考------java

1. foreach元素的屬性

  • collection: 需作foreach(遍歷)的對象,做爲入參時,list、array對象時,collection屬性值分別默認用"list"、"array"代替,Map對象沒有默認的屬性值。可是,在做爲入參時可使用@Param(「keyName」)註解來設置自定義collection屬性值,設置keyName後,list、array會失效;
  • item: 集合元素迭代時的別名稱,該參數爲必選項;
  • index: 在list、array中,index爲元素的序號索引。可是在Map中,index爲遍歷元素的key值,該參數爲可選項;
  • open: 遍歷集合時的開始符號,一般與close=")"搭配使用。使用場景IN(),values()時,該參數爲可選項;
  • separator: 元素之間的分隔符,類比在IN()的時候,separator=",",最終全部遍歷的元素將會以設定的(,)逗號符號隔開,該參數爲可選項;
  • close: 遍歷集合時的結束符號,一般與open="("搭配使用,該參數爲可選項;

2.foreach時,collection屬性值的三種狀況:

  • 若是傳入的參數類型爲List時,collection的默認屬性值爲list,一樣可使用@Param註解自定義keyName;
  • 若是傳入的參數類型爲array時,collection的默認屬性值爲array,一樣可使用@Param註解自定義keyName;
  • 若是傳入的參數類型爲Map時,collection的屬性值可爲三種狀況:(1.遍歷map.keys;2.遍歷map.values;3.遍歷map.entrySet()),稍後會在代碼中示例;

3.代碼示例:

3.1 collection屬性值類型爲List:sql

Mapper接口定義的方法:UserList爲模擬返回的數據對象數組

List<UserList> getUserInfo(@Param("userName") List<String> userName);

Mapper.xml 動態sql構建,Mapper接口的方法名和xml文件的id值,必須一一對應,不然會報錯:
-----建議作if test="xxxx !=null and xxxx.size()>0"的校驗,比較嚴謹。array爲.length();mybatis

<select id="getUserInfo" resultType="com.test.UserList">
	      SELECT
	        *
	      FROM user_info
	        where
	        <if test="userName!= null and userName.size() >0">
	            USERNAME IN
	            <foreach collection="userName" item="value" separator="," open="(" close=")">
	                #{value}
	            </foreach>
	        </if>
</select>

3.2 collection屬性值類型爲Array:
Mapper接口定義的方法:UserList爲模擬返回的數據對象app

List<UserList> getUserInfo(@Param("userName") String[] userName);

Mapper.xml 動態sql構建,Mapper接口的方法名和xml文件的id值,必須一一對應,不然會報錯:
-----建議作if test="xxxx !=null and xxxx.length()>0"的校驗,比較嚴謹。spa

<select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="userName!= null and userName.length() >0">
	            USERNAME IN
	            <foreach collection="userName" item="value" separator="," open="(" close=")">
	                #{value}
	            </foreach>
	        </if>
	 </select>

3.3 collection屬性值類型爲Map:
近期在項目中,遇到這樣一個需求,sql查詢的條件之一是兩個字段肯定惟一的一我的,而且條件多是多我的或者一我的。以往開發中,咱們可能遇到只有一個字段的集合或者數組。進入正題:
接收前臺傳遞的List,組裝查詢條件。其實也能夠直接傳一個List對象集合,可是實際開發中,List中的每個對象包含了幾十個字段,而咱們只須要其中的兩個,因此我選擇數據組裝傳遞。
實現類處理:code

Map<String, String> patientMap = userList.stream().filter(item -> StringUtils.hasText(item.getUserName()) &&
                    StringUtils.hasText(item.getAge())).collect(Collectors.toMap(UserList::getUserName, UserList::getAge));

Mapper接口定義的方法:UserList爲模擬返回的數據對象xml

List<UserList> getUserInfo(@Param("user") Map<String,String> user);

Mapper.xml 動態sql構建,Mapper接口的方法名和xml文件的id值,必須一一對應,不然會報錯:
-----建議作 if test="xxxx !=null and xxxx.size()>0"的校驗,比較嚴謹。
第一種:獲取Map的鍵值對,多字段組合條件狀況下,必定要注意書寫格式:括號()對象

eg: SELECT * FROM user_info WHERE (USERNAME,AGE) IN (('張三','26'),('李四','58'),('王五','27'),......);
<select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="user!= null and user.size() >0">
	            (USERNAME,AGE) IN
	            <foreach collection="user.entrySet()" item="value" index="key" separator="," open="(" close=")">
	                (#{key},#{value})
	            </foreach>
	        </if>
</select>

第二種:參數Map類型,只須要獲取key值或者value值
key:索引

<select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="user!= null and user.size() >0">
	            (USERNAME) IN
	            <foreach collection="user.keys" item="key"  separator="," open="(" close=")">
	                #{key}
	            </foreach>
	        </if>
</select>

value:

<select id="getUserInfo" resultType="com.test.UserList">
	        SELECT
	        	*
	        FROM user_info
	        where
	        <if test="user!= null and user.size() >0">
	            (USERNAME) IN
	            <foreach collection="user.values" item="value"  separator="," open="(" close=")">
	                #{key}
	            </foreach>
	        </if>
</select>
相關文章
相關標籤/搜索