当前位置: 首页 > 面试题库 >

如何在具有Ibatis的插入中返回ID(使用RETURNING关键字)

葛胡媚
2023-03-14
问题内容

我正在使用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序列中选择的密钥。



 类似资料:
  • 问题内容: 假设我有一个Oracle数据库和一个像这样的接口: 如果我致电并且所有列均具有值,则映射包含三个条目。但是,如果为,则地图只有两个条目。在许多情况下,这不是问题,但是在我们代码的通用部分中,我实际上想在该地图上调用,并希望包含三个条目的列表。任何条目都可以是(或一个空字符串,与Oracle中的相同)。 实际上,我真的很高兴这样的事情,其中​​每个外部列表都由具有三个条目的列表组成: 但

  • 本文向大家介绍Mybatis返回插入主键id的方法,包括了Mybatis返回插入主键id的方法的使用技巧和注意事项,需要的朋友参考一下 在mapper的xml文件中配置  useGeneratedKeys 以及 keyProperty 返回Id即可 PS:Mybatis中insert中返回主键ID的方法 1、XyzMapper.xml 或 2、XyzMapper.java 3、要在map或c中有一

  • 问题内容: 我有本身具有外键的表。列 parentid 是外键, 不能 为NULL。 如果我这样做,那么它说不能将NULL插入 父母的父母 。但是,如果还没有插入行,我可以为它设置什么值呢? 我如何编写将向该表添加行的脚本? 谢谢 问题答案: 技巧:拥有一个带有虚拟密钥的虚拟行,例如99999。将其插入为FK,然后将FK更改为其实际值。并在交易中完成。

  • 问题内容: 我想检索数据库中插入行的ID,但是我不知道该怎么做。 我尝试使用SQL子句返回,但不起作用。 插入一行后如何返回ID? 问题答案: 在上调用方法后,插入行的ID将位于属性中。只看它。

  • 问题内容: 通常,我可以在MySQL表中插入一行并取回。但是,现在,我想将许多行批量插入表中并获取ID数组。有人知道我该怎么做吗? 有一些类似的问题,但并不完全相同。我不想将新ID插入任何临时表;我只想找回ID数组。 我可以从批量插入中检索lastInsertId吗? 带有last_insert_id()的MySQL多行插入选择语句 问题答案: 旧线程,但只是研究了一下,所以去了:如果您在最新版本

  • 问题内容: 我有桌子 我还有一张桌子 我要插入两个远程怪物:一个被称为 “弓箭妖精” ,攻击距离为 10 ,另一个被称为 “龙” ,攻击距离为 50 。我怎样才能在一条指令中做到这一点? 到目前为止,我已经尝试过了: 最坏的方法 这很不好,因为name列允许重复,并且检索到的记录可能不止一次。。。也不得不两次写出怪物的名字似乎不是一个好习惯。 插入…返回 如果表仅具有的列(外键),那么我可以使用以