如何使用Ibatis返回带有插入内容的ID(使用RETURNING关键字)

我正在使用iBatis / Java和Postgres 8.3。 当我在ibatis中插入时,我需要返回id。
我使用下表来描述我的问题:
CREATE TABLE sometable ( id serial NOT NULL, somefield VARCHAR(10) );
序列sometable_id_seq通过运行create语句自动生成。

目前我使用以下sql map:

  INSERT INTO sometable ( somefield ) VALUES ( #value# );  SELECT last_value AS id FROM sometable_id_seq   

看来这是检索新插入的id的ibatis方式。 Ibatis首先运行INSERT语句,然后询问序列的最后一个id。
我怀疑这将适用于许多并发插入。 ( 在这个问题中讨论过 )

我想在ibatis中使用以下语句:
INSERT INTO sometable ( somefield ) VALUES ( #value# ) RETURNING id;

但是当我尝试在 sqlMap中使用它时,ibatis不会返回id。 它似乎需要标签。

所以这里有一个问题:

我如何在ibatis上使用上述声明?

元素是元素的子元素,其内容在主INSERT语句之前执行。 您可以使用两种方法。

插入记录后获取密钥

这种方法取决于您的驱动程序。 线程可能是一个问题。

在插入记录之前获取密钥

这种方法避免了线程问题,但更多的工作。 例:

   SELECT nextVal('my_id_seq')  INSERT INTO my (myId, foo, bar) VALUES (#myId#, #foo#, #bar#)  

在Java方面,您可以这样做

 Integer insertedId = (Integer) sqlMap.insert("insert", params) 

这应该为您提供从my_id_seq序列中选择的密钥。

这是一个简单的例子:

  INSERT INTO objects(expression, meta, title, usersid) VALUES (#expression#, #meta#, #title#, #usersId#) RETURNING id  

在Java代码中:

 Integer id = (Integer) executor.queryForObject("addObject", object); object.setId(id); 

这种方式比使用更好:

  1. 它更简单;
  2. 它没有要求知道序列名称(通常隐藏在postgresql开发人员中)。