foreach是用來對3種類型的對象進行循環操作的,關于foreach的基礎知識請看:Mybatis 示例之 foreach (上)
注:Map類型沒有預設的map,是以不能直接寫collection="map",如果這麼寫,需要保證傳入的Map參數有@Param("map")注解。
有關參數的更詳細内容,建議看:深入了解MyBatis參數
這節講的是foreach中map的用法。
map和List,array相比,map是用K,V存儲的,在foreach中,使用map時,index屬性值為map中的Key的值。
因為map中的Key不同于list,array中的索引,是以會有更豐富的用法。
第一個簡單例子:
<insert id="ins_string_string">
insert into string_string (key, value) values
<foreach item="item" index="key" collection="map"
open="" separator="," close="">(#{key}, #{item})</foreach>
</insert>
可以看到這個例子相當簡單,表中需要兩個值,正好和K,V對應,因而map中的一個K,V就對應一條資料,如果map中有多個K,V,就會儲存多個結果。
如果map中有兩對K,V,那麼執行SQL如下:
DEBUG [main] - ==> Preparing: insert into string_string (key, value) values (?, ?) , (?, ?)
DEBUG [main] - ==> Parameters: key 1(String), value 1(String), key 2(String), value 2(String)
DEBUG [main] - <== Updates: 2
大部分資料庫是支援values()()這種形式的插入語句,可以插入多條(
相關連結 )。
下面再看一個select的例子:
<select id="sel_key_cols" resultType="int">
select count(*) from key_cols where
<foreach item="item" index="key" collection="map"
open="" separator="AND" close="">${key} = #{item}</foreach>
</select>
可以看到這裡用key=value來作為查詢條件,對于動态的查詢,這種處理方式可以借鑒。
一定要注意到$和#的差別,$的參數直接輸出,#的參數會被替換為?,然後傳入參數值執行。
上述SQL執行日志如下:
DEBUG [main] - ==> Preparing: select count(*) from key_cols where col_a = ? AND col_b = ?
DEBUG [main] - ==> Parameters: 22(Integer), 222(Integer)
DEBUG [main] - <== Total: 1