MyBatis傳入多個引數的問題

wl199083發表於2015-01-29

在mybatis的mapper配置檔案中,可以利用<foreach>標籤實現sql條件的迴圈,可完成類似批量的sql

mybatis接受的引數分為:(1)基本型別(2)物件(3)List(4)陣列(5)Map

 

無論傳哪種引數給mybatis,他都會將引數放在一個Map中:

如果傳入基本型別:變數名作為key,變數值作為value    此時生成的map只有一個元素。

如果傳入物件:        物件的屬性名作為key,屬性值作為value,

如果傳入List:         "list"作為key,這個List是value  (這類引數可以迭代,利用<foreach>標籤實現迴圈)

如果傳入陣列:       "array"作為key,陣列作為value(同上)

如果傳入Map:        鍵值不變。

 

<foreach>標籤的用法:

六個引數:

collection:要迴圈的集合

index:迴圈索引(不知道啥用。。)

item:集合中的一個元素(item和collection,按foreach迴圈理解)

open:以什麼開始

close:以什麼結束

separator:迴圈內容之間以什麼分隔



當:

map 中傳入多個引數 但實際所需引數既要包含String型別,又要包含List型別時的處理方法:

將引數放入Map,再取出Map中的List遍歷

HashMap<String,Object> map = new HashMap<String,Object>();
		map.put("status","I");
		List<Integer> sourceIds = new ArrayList<Integer>();
		sourceIds.add(1);
		sourceIds.add(100);
		map.put("sourceList",sourceIds);
		List<FundOrderCompareResultPo> lists = fundOrderInstPoMapper.compareResultListBySourceId(map);

sql

	<!-- 批量查詢對賬後表中記錄 -->   				  						
	<select id="compareResultListBySourceId" resultMap="CompareResultMap"
 		parameterType="java.util.Map" >
  		select inst.source_id as source_Id, sum(inst.order_amount) as compare_valueSum, 
		count(inst.record_id) as count_number,inst.status as status from 
		tb_fund_order_inst inst where inst.delete_flag = 'N' and inst.status= #{status}
		and inst.source_id in
  		<foreach collection="sourceList" item="sourceIds" index="index" open="(" close=")" separator=",">
     		#{sourceIds}
  		</foreach>
    	group by inst.source_id
  	</select> 
其中要注意的是:

<foreach collection=" "....> collection 引數 表示要迴圈的集合,開始我命名為list 報錯。意思為宣告為list為空,後來發現

map.put("key",value) ;中的key值不等於collection中的引數,故找不到list

總結一下。。
collection的值其實就是mybatis把引數轉化成Map以後,這個Map的key,但是這個key對應的value必須是一個集合,  可以是陣列,也可以是List
當只傳入list 的時候。collection 屬性值必須為list
當傳入map 時候。list為其中一個引數,這時候collection 的屬性值必須和map中的key一樣,
而#{sourceIds}的命名和map中的key 沒有關係即#{sourceIds}中的命名可以任意命名不必相等

相關文章