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

Posted

技术标签:

【中文标题】MyBatis oracle 插入新行总是返回错误的主 id 值【英文标题】:MyBatis oracle insert new row always return wrong primary id value 【发布时间】:2021-02-18 01:44:12 【问题描述】:

向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
  )

这里是java调用

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

新的数据/行可以插入到数据库中,没有正确的主键/ID 问题。但是 myID 总是返回为 1(应该是 8971)。我怎样才能得到正确的值。提前致谢。

版本:

    <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>

【问题讨论】:

【参考方案1】:

您的插入成功返回 1,失败返回 0。如果要使用主键,请使用您插入的对象的 getId()。

*示例)

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

【讨论】:

你的意思是沿着.getId()?,主键会映射到参数对象? 映射到你在 DAO 中使用的 的 id 的对象【参考方案2】:

由于&lt;selectKey /&gt; 需要额外查询,所以一般首选useGeneratedKey。 我将向您展示如何将useGeneratedKeys 用于以下用途。

    在插入语句中使用nextval 使用nextval作为列的默认值 使用identity

为了便于说明,我将为每种情况使用单独的表格。

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)
);

使用 1 的插入语句如下所示。

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

为了完整起见,这里是一个 XML 版本。

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

用法 2 和 3 的插入语句基本相同。 请注意,列列表中省略了id

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

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

【讨论】:

以上是关于MyBatis oracle 插入新行总是返回错误的主 id 值的主要内容,如果未能解决你的问题,请参考以下文章

mybatis如何获取oracle新插入数据记录的主键?

mybatis+oracle 完成插入数据库,并将主键返回的注意事项

Coredata 总是更新行而不是快速插入新行

Mybatis插入数据时 返回主键

Mybatis插入数据时 返回主键

Mybatis在oracle数据库中插入数据后返回自增值ID