有時會遇到根據特定的情況動態建立表,並對錶進行批次插入,對於Mybatis來說,也是非常簡單的。
先看dao層
void insertBatch(@Param("tableName") String tableName, @Param("dbColumns") List<String> dbColumns,@Param("dbValues") List<LinkedHashMap> dbValues);
注:這裡的值dbValues必須使用LinkedHashMap型別,因為其內部元素是有序的,否則會導致插入列不對應。
sql語句(mapper.xml)
<!--批次插入values--> <sql id="values"> <foreach item="item" collection="dbValues" separator=","> <foreach collection="item" item="detailItem" index="index" open="(" close=")" separator=","> #{detailItem} </foreach> </foreach> </sql> <!--批次插入--> <insert id="insertBatch"> insert into ${tableName} ( <foreach collection="dbColumns" item="columnItem" separator=","> ${columnItem} </foreach> ) values <include refid="values"/> </insert>
實際上是對欄位進行進一步迴圈。
測試方法
List<String> cols = new ArrayList<>(Arrays.asList("name", "sex", "age")); List<LinkedHashMap> data = new ArrayList<>(); LinkedHashMap hashMap = new LinkedHashMap(); hashMap.put("name", "張三"); hashMap.put("sex", "男"); hashMap.put("age", "12"); LinkedHashMap hashMap2 = new LinkedHashMap(); hashMap2.put("name", "張三"); hashMap2.put("sex", "男"); hashMap2.put("age", "12"); data.add(hashMap); data.add(hashMap2); userDao.insertBatch("t_user_001", cols, data);
這個測試方法只是為了演示,實際場景可能不止如此,主要為了展示xml的寫法。