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

doinxwow  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(462)

尝试在向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>
tgabmvqs

tgabmvqs1#

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

  • (示例)
activityLogDao.createActivityLog(alog);
Integer myId = alog.getId();
vhmi4jdf

vhmi4jdf2#

作为 <selectKey /> 需要额外的查询, useGeneratedKey 一般优先。
我来教你怎么用 useGeneratedKeys 用于以下用途。
使用 nextval 在insert语句中
使用 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({
  "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的insert语句基本相同。
请注意 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

相关问题