简体   繁体   English

MyBatis oracle 插入新行总是返回错误的主 id 值

[英]MyBatis oracle insert new row always return wrong primary id value

Try to get the primary id after inserting a new row to oracle DB向 oracle DB 插入新行后尝试获取主 ID

<insert id="createActivityLog" parameterType="ActivityLog" >
  <selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
      select ACTIVITY_LOG_SEQ.nextval as id from dual
  </selectKey>  
  insert into ACTIVITY_LOG (
         activity_log_id,
         notes,
         details            )
  values (
     #{id,jdbcType=NUMERIC},
     #{notes,jdbcType=VARCHAR},
     #{details,jdbcType=VARCHAR}
  )

Here is the java call这是 java 电话

Integer myId=(Integer) activityLogDao.createActivityLog(alog);

New data/row can be inserted into DB with no issue with correct primary key/id.新的数据/行可以插入到数据库中,而正确的主键/id 没有问题。 But myID is always returned as 1(supposed to be 8971).但是 myID 总是返回为 1(应该是 8971)。 How can I get the correct value.我怎样才能得到正确的值。 Thanks in advcance.提前感谢。

version:版本:

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>

Your insert returns 1 on success and 0 on failure.您的插入成功返回 1,失败返回 0。 If you want to use the primary key, use getId() of the object you used to insert.如果要使用主键,请使用之前插入的 object 的 getId()。

*example) *例子)

activityLogDao.createActivityLog(alog);
Integer myId = alog.getId();

As <selectKey /> requires extra query, useGeneratedKey is preferred in general.由于<selectKey />需要额外的查询,因此通常首选useGeneratedKey
I'll show you how to use useGeneratedKeys for the following usages.我将向您展示如何将useGeneratedKeys用于以下用途。

  1. Use nextval in insert statement在插入语句中使用nextval
  2. Use nextval as the default value of a column使用nextval作为列的默认值
  3. Use identity column使用identity

For explanation, I'll use a separate table for each case.为了解释,我将为每种情况使用一个单独的表。

create sequence test_seq increment by 1 start with 1;

create table user1 (
  id int,
  name varchar(10)
);

create table user2 (
  id int default test_seq.nextval,
  name varchar(10)
);

create table user3 (
  id int generated always as identity,
  name varchar(10)
);

Insert statement for usage 1 would look as follows.用法 1 的插入语句如下所示。

@Insert({
  "insert into user1 (id, name)",
    "values (test_seq.nextval, #{name})"})
@Options(useGeneratedKeys = true,
  keyProperty = "id", keyColumn = "id")
void insert1(User user);

Here is an XML version just for the sake of completeness.为了完整起见,这里是一个 XML 版本。

<insert id="insert1" useGeneratedKeys="true"
  keyProperty="id" keyColumn="id">
  insert into user1 (id, name)
    values (test_seq.nextval, #{name})
</insert>

Insert statements for usage 2 and 3 are essentially the same.用法 2 和 3 的插入语句基本相同。
Note that id is omitted from the column list.请注意,列列表中省略了id

@Insert({"insert into user2 (name) values (#{name})"})
@Options(useGeneratedKeys = true,
  keyProperty = "id", keyColumn = "id")
void insert2(User user);

Here is a demo project:这是一个演示项目:
https://github.com/harawata/mybatis-issues/tree/master/so-66252438 https://github.com/harawata/mybatis-issues/tree/master/so-66252438

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM