mybatis批量插入时获取最后一次所插入的主键一直为null
配置selectKey,单条插入时,能正常获取到插入的主键,但是批量插入时,一直为null.
<selectKey order="AFTER" keyProperty="id" resultType="INTEGER"> SELECT LAST_INSERT_ID() AS id </selectKey>
下面是完整的代码:
personMapper.xml
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true"> insert into person (id, name, age, sex, address, telephone, birthday) values <foreach collection="list" index="index" item="item" separator=","> (#{item.id,jdbcType=INTEGER}, #{item.name,jdbcType=VARCHAR}, #{item.age,jdbcType=INTEGER}, #{item.sex,jdbcType=VARCHAR}, #{item.address,jdbcType=VARCHAR}, #{item.telephone,jdbcType=DOUBLE},#{item.birthday,jdbcType=VARCHAR}) </foreach> <selectKey order="AFTER" keyProperty="id" resultType="INTEGER"> SELECT LAST_INSERT_ID() AS id </selectKey> </insert>junit的代码:
@Test public void testInsertBatch(){ List<Person> list = new ArrayList<Person>(); for(int i=0; i < 5; i++){ Person person = new Person(); person.setAddress("CHCS" + i); person.setAge(88 + i); person.setName("ABC" + i); person.setSex("男"); person.setTelephone(454545D); list.add(person); } System.out.println(" -------------- before -------------- "); for(Person person:list) System.out.println(person.toString()); pm.insertBatch(list); //pm为Person类DAO层实现类的一个实例化对象 System.out.println(" -------------- after -------------- "); for(Person person:list) System.out.println(person.toString()); }
这里批量插入之后,遍历后的对象所有的id属性都为null,数据可以正常插入。
补充:批量插入我是按照单条记录的插入写法写的,单条记录一模一样的配置(批量就加了个<foreach>)可以正常获取id.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
去了,也无法获取到
回复
不是让你去掉,而是让你写一个正确的类型标识。
我觉得,应该是你自己写的resultType="INTEGER"的INTEGER,它不认识。
回复
汗。。。怎么debug?
回复
批量插入可以正常插入,但是这个主键无法获取到,一直为null,是不是我获取的方式写错了?
回复
breakpoint
回复
不要放弃治疗
回复
mybatis的源码我都没下载过。。。还是请个高人指点一下比较快啊
自增id的话就不用再在sql里贴了吧
http://chenzhou123520.iteye.com/blog/1583407
我只想获取最后一条id。这种方式,看网上说都可以获取到,但是我并没有看到完整的例子,所以想知道这种方式的实现。
回复
在同一个连接的情况下插入完毕后再手动查询一遍SELECT LAST_INSERT_ID() AS id, 讲这条语句当做一个单独的查询应该可以查到最后的id.
回复
这样的确可以,但是mybatis的result自动帮我们填充这个对象要怎么实现?
要想获取id就不要批量插入了, 一条一条的插