我正在使用iBatis / Java和Postgres 8.3。当我在ibatis中插入时,我需要返回ID。
我使用下表描述我的问题:通过运行create语句自动生成
CREATE TABLE sometable ( id serial NOT NULL, somefield VARCHAR(10) );
Sequence 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中使用上述声明?
该<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
序列中选择的密钥。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句