如何使用 Ibatis 返回插入的 ids(使用 RETURNING 关键字)

发布于 2024-08-11 21:30:10 字数 1022 浏览 3 评论 0原文

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

目前我使用以下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>

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

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

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

那么问题来了:

上面的语句如何与ibatis一起使用呢?

I'm using iBatis/Java and Postgres 8.3.
When I do an insert in ibatis i need the id returned.
I use the following table for describing my question:
CREATE TABLE sometable ( id serial NOT NULL, somefield VARCHAR(10) );
The Sequence sometable_id_seq gets autogenerated by running the create statement.

At the moment i use the following sql map:

<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>

It seems this is the ibatis way of retrieving the newly inserted id. Ibatis first runs a INSERT statement and afterwards it asks the sequence for the last id.
I have doubts that this will work with many concurrent inserts. ( discussed in this question )

I'd like to use the following statement with ibatis:
INSERT INTO sometable ( somefield ) VALUES ( #value# ) RETURNING id;

But when i try to use it within a <insert> sqlMap ibatis does not return the id. It seems to need the <selectKey> tag.

So here comes the question:

How can i use the above statement with ibatis?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

脱离于你 2024-08-18 21:30:10

元素是 元素的子元素,其内容在主 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 序列中选择的键。

The <selectKey> element is a child of the <insert> element and its content is executed before the main INSERT statement. You can use two approaches.

Fetch the key after you have inserted the record

This approach works depending on your driver. Threading can be a problem with this.

Fetching the key before inserting the record

This approach avoids threading problems but is more work. Example:

<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>

On the Java side you can then do

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

This should give you the key selected from the my_id_seq sequence.

少女的英雄梦 2024-08-18 21:30: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);

这种方式比 use 更好:

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

Here is simple example:

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

And in Java code:

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

This way more better than use :

  1. It's simpler;
  2. It have not requested to know sequence name (what usually hidden from postgresql developers).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文