14

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

目前我使用以下 sql 映射:

<insert id="insertValue" parameterClass="string" >
 INSERT INTO sometable ( somefield ) VALUES ( #value# );
 <selectKey keyProperty="id" resultClass="int">
  SELECT last_value AS id FROM sometable_id_seq
 </selectKey>
</insert>

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

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

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

那么问题来了:

我如何将上述语句与 ibatis 一起使用?

4

2 回答 2

16

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

插入记录后获取密钥

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

在插入记录之前获取密钥

这种方法避免了线程问题,但工作量更大。例子:

<insert id="insert">
  <selectKey keyProperty="myId"
             resultClass="int">
    SELECT nextVal('my_id_seq')
  </selectKey>
  INSERT INTO my
    (myId, foo, bar)
  VALUES
    (#myId#, #foo#, #bar#)
</insert>

在Java方面,你可以做

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

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

于 2009-11-20T11:08:13.237 回答
10

这是一个简单的例子:

<statement id="addObject"
        parameterClass="test.Object"
        resultClass="int">
        INSERT INTO objects(expression, meta, title,
        usersid)
        VALUES (#expression#, #meta#, #title#, #usersId#)
        RETURNING id
</statement>

在 Java 代码中:

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

这种方式比使用更好:

  1. 它更简单;
  2. It have not requested to know sequence name (what usually hidden from postgresql developers).
于 2009-12-03T20:12:18.180 回答