You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis XML方式插入Oracle后返回1而非实际carId如何解决

问题根因定位及修复方案

存在的错误点

  • 配置冲突:<insert>标签同时配置了useGeneratedKeys="true"和<selectKey>标签,二者功能重叠。useGeneratedKeys仅适用于支持自增主键的数据库(如MySQL的AUTO_INCREMENT),Oracle使用序列生成主键时仅需保留<selectKey>即可。二者同时启用时,插入操作完成后useGeneratedKeys的逻辑会将插入影响行数(固定为1)覆盖掉<selectKey>提前查询到的序列值,导致最终获取的carId为1。
  • 语法错误:<selectKey>和<insert>标签未正确闭合,结束标签应为</selectKey>、</insert>。
  • 字段映射错误:keyColumn="id"配置与实际表主键列名CAR_ID不匹配。

修正后的XML代码

<insert id = "insertIntoCar" parameterType = "CarEntity">
    <selectKey keyProperty="carId" resultType="long" order="BEFORE">
        SELECT CAR_ID_SEQ.nextval From DUAL
    </selectKey>
    INSERT INTO CAR (CAR_ID, CAR_TYPE, CAR_STATUS)
    VALUES (#{carId}, #{carType}, #{carStatus})
</insert>

验证逻辑说明

  • 执行插入前,<selectKey>会先查询序列值并赋值给CarEntity的carId属性
  • 插入操作直接使用已赋值的carId作为主键写入数据库
  • 插入完成后直接读取CarEntity的carId属性即可拿到真实主键值,无需额外配置,完全符合你不能修改order、不能使用注解的限制要求

内容的提问来源于stack exchange,提问作者Ankur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:48:04