mybatis进行批量插入 返回主键ID 插入不成功等问题

来源:互联网 发布:淘宝hot小图标 编辑:程序博客网 时间:2024/06/05 13:34

最近在做公司的工资系统 因为每个月都要对每个人的工资进行数据的核算和工资发放工作的审核 所以需要大量插入数据

dao层框架用的mybatis 最一开始我的批量插入其实是个伪批量 是类似吧很多条insert into语句 直接拼成一条  然后直接运行

发现这样的效率真的是十分低 我做测试时 公司285人的工资 插入一次需要10S多

而当我修改sql的写法:

<insert id="addFlowTableItemNullList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id"  >      insert into cus_sh_gongziceshi  ( applicant,createtime,isdel,  <foreach collection="list" item="table" index="a" >  <if test="a == 0">  <foreach collection="table.map.keys" item="key1" separator=",">  ${key1}  </foreach>  </if>  </foreach>  ) values    <foreach collection="list" item="table2" separator=",">  (${table2.applicant},#{table2.time,jdbcType=TIMESTAMP},0 ,  <foreach collection="table2.map.keys" item="key2" separator=",">  ${table.map[key2]}  </foreach>  )  </foreach>      </insert>
出来的效果大概是 insert into table (a , b c) values(1,2,3),(1,2,3)

这种插入语句方式才是真正的批量插入 执行只需要0.2s左右 快了50多倍

请注意 这种写法 foreach里的collection必须是list 不然会报错 另外还有很重要的一点 mybatis是默认不支持批量插入的

你需要在你的jdbc连接信息中的URL 后加上allowMultiQueries=true

但是使用这种插入方式也带来了其他的一些问题

比如 如何返回主键ID 在插入字符串类型数据时会报错等


首先关于如何返回主键ID  我在网上翻阅大量资料后发现 我使用的mybatis版本有点低 不支持批量插入返回ID  只有mybatis3.3.1 以上的版本才可以

这是mybatis3.4 和对应的spring整合mybatis的 maven依赖

<dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis</artifactId>    <version>3.4.0</version></dependency><dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis-spring</artifactId>    <version>1.3.0</version></dependency>
关于返回主键ID  你需要在insert标签中 添加
 useGeneratedKeys="true" keyProperty="id"
keyProperty就是你要返回的主键ID接受的属性名了


在批量插入中还有一个经常被大家忽略的问题 : 在插入string类型的数据时 要加上' ' 单引号

不然你插入中文的话会 报 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '??????' in 'field list'



原创粉丝点击