今天寫sql發現了一點問題,亂弄了好久算是搞定了。關於mybatis的批量插入使用foreach插入形式為:
insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? ),( ?, ?, ? ),( ?, ?, ? );
而不不希望是這樣的
insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? ) insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? ) insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? )
可以考慮靈活的使用mybatis的foreach標簽官方文檔是這樣子說的
foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及在迭代結果之間放置分隔符。這個元素是很智能的,因此它不會偶然地附加多余的分隔符。 注意 你可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數組對象傳遞給 foreach 作為集合參數。當使用可迭代對象或者數組時,index 是當前迭代的次數,item 的值是本次迭代獲取的元素。當使用 Map 對象(或者 Map.Entry 對象的集合)時,index 是鍵,item 是值。
大意就是這樣子mybatis幫我們循環一個具有一定長度的數據結構然后遍歷其中的數據,用戶可以為其中遍歷的數據起名並使用 還能設置開始循環時首部元素和尾部元素以及分隔符常用的可以這樣試
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach>
</select>
然后由於mybatis對數據結構的良好支持,我們可以傳給mybatis一些復雜類型的數據結構,如java的Map<String,Object>對象。這里我想說的是map.put("string",String) map.put("String",List)這樣式的 可能看這有點迷糊給代碼吧:
傳給mybatis的參數是這樣的
Integer[]privilegeIds Map<String,Object>map=new HashMap<String,Object>(); map.put("role_id", role_id); map.put("create_time", new Date()); map.put("privilegeIds", privilegeIds);
其中你期望循環的對象可以是array 可以是 list都ok的我這里是array 但是需要注意的一點是 使用map封裝的數據結構和單獨傳給mybatis有點不同的就是在foreach中collection指定方法不同
如我不想用map封裝 只需要傳給mybatis一個list 或者array就結束的話應該在foreach中這樣寫 collection中寫的是數據結構名傳的參數是list就寫list 是數組就array
<foreach collection="list" open="(" close=")" item="privilegeId" separator="," index="index"> #{privilegeId} </foreach>
但我這里還需要傳兩個固定的值 實現就類似於values(1,“a"),(1,"b")這樣的其中1是傳過來的一個固定的而a和b是遍歷的值 那么就可以這樣 注意括號
<insert id="addRolePrivilege" parameterType="java.util.Map"> insert ignore into role_privilege( role_id, privilege_id,last_edit) values <foreach collection="privilegeIds" index="index" item="privilege_id" separator=","> (#{role_id}, #{privilege_id}, #{last_edit}) </foreach>
</insert>
雖然根據常用標准應該寫成這樣:
<insert id="addRolePrivilege" parameterType="java.util.Map"> insert ignore into role_privilege( role_id, privilege_id,last_edit) values <foreach collection="privilegeIds" index="index" open="(" close=")" item="privilege_id" separator=","> #{role_id}, #{privilege_id}, #{last_edit} </foreach>
</insert>
可我代碼里寫成這樣會有問題 就是簡單的報錯
很明顯的錯 。。。但我的的確確寫了close=”)“ 不給顯示 所以我就改成帶括號的。
