如何使用 Ibatis 返回插入的 ids(使用 RETURNING 关键字)
我正在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
元素是
元素的子元素,其内容在主INSERT< 之前执行。 /代码> 声明。您可以使用两种方法。
插入记录后获取密钥
此方法的工作原理取决于您的驱动程序。线程可能会出现问题。
在插入记录之前获取密钥
这种方法可以避免线程问题,但工作量更大。示例:
在 Java 端,您可以执行
以下操作:这将为您提供从
my_id_seq
序列中选择的键。The
<selectKey>
element is a child of the<insert>
element and its content is executed before the mainINSERT
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:
On the Java side you can then do
This should give you the key selected from the
my_id_seq
sequence.这是一个简单的例子:
在 Java 代码中:
这种方式比 use 更好:
Here is simple example:
And in Java code:
This way more better than use :