如何在使用MyBatis时获取Oracle中的最后插入ID?

6
我正在向一个Oracle表中插入一些数据,并需要检索插入行的id。该id由序列生成,然后由触发器插入到表中。
现在,我知道在使用JDBC时有几种获取插入行的id的方法,但由于我正在使用MyBatis执行INSERT命令,我似乎无法弄清楚如何在插入数据后获取id。非常感谢您的任何建议。

这是一个关于MySQL的问题,但希望这能引导您朝着正确的方向前进。https://dev59.com/HW855IYBdhLWcg3wik-D - Matt Busche
1
@Insert("插入到员工表中值为('john', 'smith')并返回id") - orangegoat
@MattBusche 谢谢,我正在阅读它。 - mduck
4个回答

6

类似以下这样的内容应该可以运行

class User {
  int userId
  ...
}

<insert id="addUser" useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId">
  INSERT INTO user(login, name,...) VALUES(#{login}, #{name},...
</insert>

谢谢。我还没明白如何捕获插入返回的值。Sqlsession.insert() 是否应该返回此值而不是插入的行数? - mduck
2
在我的例子中,生成的密钥被存储回 User.userId。 - natros

3

对我来说,它是这样工作的(MyBatis 3)

<insert id="create" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID">
    INSERT INTO PROJECT (TITLE,DESCRIPTION)
    VALUES
    (#{title},#{description})
</insert>

不需要使用selectKey。只需确保在keyProperty中放入正确的值即可。 我有一个oracle插入前触发器,用于从序列中获取下一个id。 另外,这种方式也可以:
<insert id="createEmpty" statementType="CALLABLE" parameterType="Panelist">
    BEGIN INSERT INTO PANELIST(PANEL_ID) VALUES (#{panelId})
    RETURNING PANELIST_ID INTO
    #{panelist.panelistId,mode=OUT,jdbcType=INTEGER}; END;
</insert>

0

使用Oracle,最好分两个阶段进行。这样做效果很好,价格只多一个映射器:

第一阶段:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"     
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sample.work.dao.SequencerMapper" >
<select id="selectNextId" resultType="long" >
 select seq_sample.nextval from dual
</select>
</mapper>

你获得了seq,将其放入你的对象占位符中,
第二阶段:
插入你的对象。

0
假设触发器使用id_seq Oracle序列来获取ID。如果您在同一个数据库会话中使用MyBatis执行,那么SQL语句将返回相同的结果。
select id_seq.currval from dual;

您将获得使用的ID。


1
如果在我从序列中选择当前值之前,另一个插入被添加到表中,我会得到新生成的ID吗?还是根据会话给我正确的ID? - mduck
你的会话是将数据插入表格还是另一个会话?是这样的吗:你: 插入表格; 插入表格; id_seq.currval;还是这样的:你:插入表格 其他人:插入表格 你:is_seq.currval在第一种情况下,id_seq.currval 将返回第二个表格的 ID。在第二种情况下,id_seq.currval 将返回你插入表格的 ID。 - Jirawat Uttayaya
是的,可能有另一个会话正在进行插入操作。 - mduck
如果是另一个会话,则Oracle保证currval返回您的会话上次使用的ID。 - Jirawat Uttayaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接