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
相关产品推荐
相关产品推荐

