配置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.
自增id的话就不用再在sql里贴了吧
http://chenzhou123520.iteye.com/blog/1583407