Chr*_*oph 14 java postgresql ibatis
我正在使用iBatis/Java和Postgres 8.3.当我在ibatis中插入时,我需要返回id.
我使用下表来描述我的问题:通过运行create语句自动生成
CREATE TABLE sometable ( id serial NOT NULL, somefield VARCHAR(10) );
Sequence sometable_id_seq.
目前我使用以下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>
Run Code Online (Sandbox Code Playgroud)
看来这是检索新插入的id的ibatis方式.Ibatis首先运行INSERT语句,然后它询问序列的最后一个id.
我怀疑这将适用于许多并发插入.(在这个问题中讨论过)
我想在ibatis中使用以下语句:
INSERT INTO sometable ( somefield ) VALUES ( #value# ) RETURNING id;
但是当我尝试在<insert>sqlMap中使用它时,ibatis不会返回id.它似乎需要<selectKey>标签.
所以这里有一个问题:
我如何在ibatis上使用上述声明?
小智 15
该<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>
Run Code Online (Sandbox Code Playgroud)
在Java方面,您可以这样做
Integer insertedId = (Integer) sqlMap.insert("insert", params)
Run Code Online (Sandbox Code Playgroud)
这应该为您提供从my_id_seq序列中选择的密钥.
leo*_*idv 10
这是一个简单的例子:
<statement id="addObject"
parameterClass="test.Object"
resultClass="int">
INSERT INTO objects(expression, meta, title,
usersid)
VALUES (#expression#, #meta#, #title#, #usersId#)
RETURNING id
</statement>
Run Code Online (Sandbox Code Playgroud)
在Java代码中:
Integer id = (Integer) executor.queryForObject("addObject", object);
object.setId(id);
Run Code Online (Sandbox Code Playgroud)
这种方式比使用更好:
| 归档时间: |
|
| 查看次数: |
44167 次 |
| 最近记录: |