Java MyBatis oracle插入新行始终返回错误的主id值

Java MyBatis oracle插入新行始终返回错误的主id值,java,sql,spring,oracle,mybatis,Java,Sql,Spring,Oracle,Mybatis,在向oracle DB插入新行后,尝试获取主id <insert id="createActivityLog" parameterType="ActivityLog" > <selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE"> select ACTIVITY_LOG

在向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}
  )
新的数据/行可以插入到DB中,而不会出现主键/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>

org.mybatis
mybatis
3.4.6
org.mybatis
mybatis泉
1.3.2

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

*(示例)

由于
需要额外的查询,因此通常首选
useGeneratedKey

我将向您展示如何使用
useGeneratedKeys
进行以下用途

  • 在insert语句中使用
    nextval
  • 使用
    nextval
    作为列的默认值
  • 使用
    identity
  • 为了便于解释,我将为每个案例使用一个单独的表

    create sequence test_seq递增1,从1开始;
    创建表user1(
    id int,
    名称varchar(10)
    );
    创建表user2(
    id int默认测试\u seq.nextval,
    名称varchar(10)
    );
    创建表user3(
    id int始终作为标识生成,
    名称varchar(10)
    );
    
    用法1的Insert语句如下所示

    @Insert({
    “插入用户1(id,名称)”,
    “值(test_seq.nextval,#{name})”})
    @选项(useGeneratedKeys=true,
    keyProperty=“id”,keyColumn=“id”)
    void insert1(用户);
    
    为了完整起见,这里提供了一个XML版本

    
    插入用户1(id、名称)
    值(test_seq.nextval,#{name})
    
    用法2和用法3的Insert语句基本相同。
    请注意,
    id
    从列列表中省略

    @Insert({“Insert-into-user2(name)值(#{name})”)
    @选项(useGeneratedKeys=true,
    keyProperty=“id”,keyColumn=“id”)
    void insert2(用户);
    
    下面是一个演示项目:

    您的意思是沿着.getId(),主键将映射到参数对象?映射到DAO中使用的参数的id的对象
        <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>
    
    activityLogDao.createActivityLog(alog);
    Integer myId = alog.getId();