Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用MyBatis在Oracle中获取最后一个插入id?_Java_Oracle_Mybatis - Fatal编程技术网

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

Java 如何使用MyBatis在Oracle中获取最后一个插入id?,java,oracle,mybatis,Java,Oracle,Mybatis,我正在向Oracle表中插入一些数据,需要检索插入行的id。所述id由序列生成,然后由触发器插入到表中 现在,我知道在使用JDBC时,有几种方法可以获取插入行的id,但是由于我使用MyBatis执行INSERT命令,我似乎不知道在插入数据后如何获取id。任何建议都将不胜感激。假设触发器使用id_seq Oracle序列来获取id。如果您使用相同的数据库会话从MyBatis执行,SQL select id_seq.currval from dual; 您将使用该ID。类似的功能应该可以使用 cl

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


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

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

select id_seq.currval from dual;

您将使用该ID。

类似的功能应该可以使用

class User {
  int userId
  ...
}

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

对我来说,它是这样工作的mybatis 3

<insert id="create" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID">
    INSERT INTO PROJECT (TITLE,DESCRIPTION)
    VALUES
    (#{title},#{description})
</insert>
不需要选择键。只需确保在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>

对于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,将其放入对象的位置保持器中,然后

第二阶段:


插入您的对象

这是MySQL的一个问题,但希望这能引导您朝着正确的方向@Insertinsert进入员工的价值观“john”、“smith”id@MattBusche谢谢,现在就看。如果在我去从序列中选择当前值之前对表进行了另一次插入,该怎么办?我会得到新生成的id吗?或者它会根据会话为我提供正确的会话吗?您的会话是在表中插入还是在其他会话中插入?是你们插入的表格;插入表格;id_seq.currval;或者您:insert table其他人:insert table You:is_seq.currval在第一个场景中,id_seq.currval将返回第二个表id。在第二个场景中,id_seq.currval将返回您的表插入id。是的,另一个会话可能正在进行插入。如果是另一个会话,Oracle保证currval会返回您上次使用的会话ID。谢谢。我还不知道如何捕获插入返回的值。Sqlsession.insert是否应该返回此值而不是插入的行数?在我的示例中,生成的键存储回User.userId中