mybatis批量插入时获取最后一次所插入的主键一直为null

Alittle 发布于 2014/08/03 23:17
阅读 2K+
收藏 0

配置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.



加载中
1
歇蹩虎子
歇蹩虎子
要想获取id就不要批量插入了, 一条一条的插
Alittle
Alittle
回复 @歇蹩虎子 : 这样的确可以,但是mybatis的result自动帮我们填充这个对象要怎么实现?
歇蹩虎子
歇蹩虎子
回复 @Alittle : 在同一个连接的情况下插入完毕后再手动查询一遍SELECT LAST_INSERT_ID() AS id, 讲这条语句当做一个单独的查询应该可以查到最后的id.
Alittle
Alittle
我只想获取最后一条id。这种方式,看网上说都可以获取到,但是我并没有看到完整的例子,所以想知道这种方式的实现。
0
anfield
anfield

自增id的话就不用再在sql里贴了吧

http://chenzhou123520.iteye.com/blog/1583407

Alittle
Alittle
回复 @anfield : mybatis的源码我都没下载过。。。还是请个高人指点一下比较快啊
anfield
anfield
回复 @Alittle : 不要放弃治疗
anfield
anfield
回复 @Alittle : breakpoint
Alittle
Alittle
回复 @anfield : 批量插入可以正常插入,但是这个主键无法获取到,一直为null,是不是我获取的方式写错了?
Alittle
Alittle
回复 @anfield : 汗。。。怎么debug?
下一页
0
sxgkwei
sxgkwei
我觉得,应该是你自己写的resultType="INTEGER"的INTEGER,它不认识。
Alittle
Alittle
mybatis没那么笨吧~
sxgkwei
sxgkwei
回复 @Alittle : 不是让你去掉,而是让你写一个正确的类型标识。
Alittle
Alittle
去了,也无法获取到
返回顶部
顶部