0 0

mybatis 3.0.5 --batch insert后如何获取返回的值20

相关JAVA类:

	
	public static int insertPersons(List<Person> persons){
		SqlSession session = MyFactory.sessionFactory().openSession(ExecutorType.BATCH, false);
		Map<String,List<Person>> tmp = new HashMap<String, List<Person>>();
		tmp.put("persons", persons);
		session.insert("insertPersons", tmp);
		session.commit();
		for (Person person : persons) {
			System.out.println(person.getId());
		}
		return 0;

 对应的XML:

	<insert id="insertPersons"  parameterType="com.wayne.domain.Person"  
			keyProperty="id" keyColumn="GENERATED_KEY" useGeneratedKeys="true">
		INSERT INTO Person (name,address,age)
		VALUES
			<foreach collection="persons" item="item" index="index" separator=",">
        		(#{item.name},#{item.address},#{item.age})
			</foreach>
		
	</insert>

<!--keyColumn是3.0.5里新加的,用于获取那个自增的column的value-->

DB: MySQL

 

 

在执行后能确定record已insert到DB,但是无法获取返回的key value.

 

特意debug发现在session.commit();时会去获取key value.

主要是在 Jdbc3KeyGenerator.processAfter这个method里,代码如下

                while (rs.next()) {
                  Object value = th.getResult(rs, colName);
                  metaParam.setValue(keyProperty, value);
                }

 debug发现确实可以取得那些key value.

 

但是在metaParam.setValue里出了问题,所有的key value都会设置到map(就是参数tmp)里,但是key都是同一个 "id", 这个"id"被set了100次,但是没有set到list的person的id里.

 

 

请问如何让batch insert后的key value设置到person的id里.

 

person类是个简单的domain而已.

 

补充:

不希望用foreach来做batch insert,而是如同xml里那样直接一条SQL搞定.

毕竟foreach循环的话有点浪费吧.

 

如果foreach的话就不能用ExecutorType.BATCH了,否则key value不能正确的返回了.


问题补充:<div class="quote_title">xxq 写道</div><div class="quote_div">insert加入 <br />&lt;selectKey resultClass="int" keyProperty="id"&gt;SELECT LAST_INSERT_ID() AS ID FROM tb LIMIT 1&lt;/selectKey&gt;</div> <br /> <br />谢谢xxq。 <br /> <br />这个已经试过了,不管用的。 <br /> <br />已经特意debug过,其实mybatis已经从driver里获取了return的key value, <br />但是并没有把key value正确的set入bean的id里。 <br /> <br />如果你那里能成功的话,请给一份比较详细的sample或者伪码也可,主要是关键的地方有即可 <br /> <br />
2011年6月07日 20:17

1个答案 按时间排序 按投票排序

0 0

insert加入
<selectKey resultClass="int" keyProperty="id">SELECT LAST_INSERT_ID() AS ID FROM tb LIMIT 1</selectKey>

2011年6月10日 17:26

相关推荐

Global site tag (gtag.js) - Google Analytics