mybaits的批量插入其实就是对foreach标签的使用。进行批量insert,假设有个User类有一个属性name, 则xml代码如下:
以下都是在mysql数据库中操作
<insert id="insertBatch" useGeneratedKeys="true" parameterType="java.util.List">
<selectKey resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert user(name) values
<foreach collection="list" item="item" index="index" separator="," >
(#{item.name})
</foreach>
</insert>
即可。
在dao层接口,只需传入一个list集合,list中放map也可是user对象,xml代码不变。
如:
List list = new ArrayList();
Map<Object,String> map = new HashMap<Object, String>();
map.put("name", "vv");
list.add(map);
userDao.insertBatch(list)
或者
User user = new User();
user.setName("vv");
list.add(user);
userDao.insertBatch(list)
都是可以正常批量insert的。同时其中任何一条数据在insert的时候出现问题都能触发事物全部回滚的。
最后说下
<selectKey resultType="long" keyProperty="id" order="AFTER">
<span style="white-space:pre"> </span>SELECT LAST_INSERT_ID()
</selectKey>
这段代码,在mybatis中,并不是返回的最后插入数据的id,而是影响的行数。
批量update 基本同上
但需要在jdbc的url加上allowMultiQueries=true这句话,使同时支持支持多条sql
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update user
<set>
name=#{item.name}
</set>
where id = #{item.id}
</foreach>
</update>
java代码和上面写法类似,只需要传入list。同时也支持事物。