天天看點

Mybatis 示例之 foreach (下)

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