首先查了官网文档,说明如下:详情在http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete

mybatis 3.3.1以上的版本已经支持批量返回了,支持注解和mapper文件两种方式,mybatis在执行完insert语句后会专门针对主键生成进行处理,在sql插入后再将自增的值赋值到实体上。代码pr链接:https://github.com/mybatis/mybatis-3/pull/547/files

然而!!按官网操作,不能自动生成,mybatis 版本3.4.6

查了很多文档,终于解决,有一个比较大的坑,特地记录下.

1.dao接口修改,去掉@param,因为加了也没用,反而容易出问题,如果要加,一定要是@param(“list”),变量名不能变,原因见第2条说明

Integer batchInsert(List<Entity> entityList);

2.Xml中,foreach中 collection=”list”,注意,变量名只能是list或者collection!!源码中写死了…所以决定了上面的@param不能随便乱加

mybatis在拿到入参后会调用wrapCollection方法进行处理.

org.apache.ibatis.session.defaults.DefaultSqlSession#wrapCollection

java.util.List继承自java.util.Collection,所以变量名叫list或者collection都可以.参数是数组的话,变量名则只能叫”array”.Jdbc3KeyGenerator在进行主键处理时,将之前包装好的parameter对象进行拆封,取出具体的入参,然后针对每个入参分别回写ID

源码org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator

xml示例如下:

<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO Common
    (
    ...
    )
    VALUES
    <foreach collection="list" index="index" item="entity" separator=",">
        (
        #{entity.bizType},
        …
        )
    </foreach>
</insert>

参考
https://github.com/mybatis/mybatis-3/pull/547/files

留言

2018-03-01