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

时间:2013-03-05 21:43:13

标签: java oracle mybatis

我正在将一些数据插入到Oracle表中,需要检索插入行的id。所述id由序列生成,然后通过触发器插入到表中。

现在,我知道有几种方法可以在使用JDBC时获取插入行的ID,但由于我使用MyBatis来执行INSERT命令,我可以好像在插入我的数据后弄清楚如何获取id。任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:5)

这样的事情应该有效

class User {
  int userId
  ...
}

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

答案 1 :(得分:2)

对我而言,它就像这样(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>

答案 2 :(得分:0)

假设触发器使用id_seq Oracle序列来获取id。如果使用相同的数据库会话从MyBatis执行SQL

select id_seq.currval from dual;

您将获得使用的ID。

答案 3 :(得分: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,放入你的对象占位符和

第二阶段:

插入您的对象