【问题标题】:MyBatis oracle insert new row always return wrong primary id valueMyBatis oracle 插入新行总是返回错误的主 id 值
【发布时间】: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>

【问题讨论】:

    标签: java sql spring oracle mybatis


    【解决方案1】:

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

    *示例)

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

    【讨论】:

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

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

    1. 在插入语句中使用nextval
    2. 使用nextval作为列的默认值
    3. 使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多