项目中会遇到这样的情况,查询出多条记录(一个List对象集合),一次性要插入多条数据到数据库中。一般有两种方式可以解决:

方式一:单条数据插入

缺点:数据多的时候效率太慢,不建议使用

方式二:批量插入

Mybatis本身是很灵活的,因为可以自己在XML文件中编写sql进行操作,那就可以一次性将插入到数据库中,这样只用向数据库提交一次,性能也可以提高不少。

①带主键自增的批量插入

Mapper接口定义的方法

void addByUser(List<Map<String,Object>> list);

Mapper.xml文件:

<!-- 批量插入 -->
<insert id="addByUser" parameterType="java.util.List" useGeneratedKeys="false">
	insert into ts_app_dxdz(ID, USERID,TYPEID, PZID, ZUID,DQID)
    select seq_ts_app_dxdz_id.nextval,cd.* from(
    <foreach collection="list" item="item" index="index" separator="union all">
    	select
        #{item.USERID,jdbcType=DECIMAL} USERID,
        #{item.TYPEID,jdbcType=DECIMAL} TYPEID,
        #{item.PZ,jdbcType=DECIMAL} PZ,
        #{item.ZU,jdbcType=DECIMAL} ZU,
        #{item.DQ,jdbcType=DECIMAL} DQ
        from dual
    </foreach>
    ) cd
</insert>

注意:

mybatis的这个useGeneratedKeys属性的问题,官网的解释是  允许 JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。

如果不加useGeneratedKeys="false"会报RA-00933:SQL 命令未正确结束的错误

②不需要主键自增批量插入
Mapper接口定义的方法

void addListByUser(List<TsAppTmsg> list);

Mapper.xml文件:

<insert id="addListByUser" parameterType="java.util.List" useGeneratedKeys="false">
        insert into TS_APP_TMSG (ID,USERID,SDATE, INFO)
        <foreach collection="list" item="item" index="index" open="(" close=")" separator="union">
            select
            #{item.id,jdbcType=DECIMAL},
            #{item.userid,jdbcType=DECIMAL},
            #{item.sdate,jdbcType=TIMESTAMP},
            #{item.info,jdbcType=VARCHAR}
            from dual
        </foreach>
    </insert>