项目中会遇到这样的情况,查询出多条记录(一个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>