mybatis+oracle添加一条数据并返回所添加数据的主键问题(转)

本文介绍如何使用MyBatis结合Oracle数据库,在插入数据后返回新增记录的主键值。具体实现包括:通过XML配置文件使用<selectKey>元素获取Oracle序列值并赋给对象属性,在Controller层通过方法返回带有主键值的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做mybatis+oracle项目的时候解决添加一条数据并返回所添加数据的主键问题

controller层

 

@RequestMapping("/addplan")
    public @ResponseBody OnlineAddplanWithBLOBs insertOnlineAddplan(OnlineAddplanWithBLOBs plan) throws Exception{
         
     //plan是添加的数据,planid为数据主键,此时对象中主键为null
        int n = service.insertOnlineAddplan(plan);
    
     //获取对象主键
        System.out.println("返回的主键值是"+plan.getPlanid()); 
        
        return plan;
    }

 

在mapperx.xml中

 

<insert id="insert" parameterType="com.online.pojo.OnlineAddplanWithBLOBs" >
    
    //获取序列值,并赋值到对象的planid字段
    <selectKey keyProperty="planid" resultType="DECIMAL" order="BEFORE">  
            select online_sequence.nextval from dual  
    </selectKey>
    
    insert into ONLINE_ADDPLAN (PLANID, COMPLETETIME, PERSON, 
      OPERATION, USERNAME, EVENTNODE, 
      WORKPLAN, CHENGGUOMIAOSHU)
  //获取上面对象中planid字段的值
    values (#{planid,jdbcType=DECIMAL}, #{completetime,jdbcType=TIMESTAMP}, #{person,jdbcType=VARCHAR}, 
      #{operation,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, #{eventnode,jdbcType=CLOB}, 
      #{workplan,jdbcType=CLOB}, #{chengguomiaoshu,jdbcType=CLOB})
  </insert>

 

<think>好的,我现在需要回答用户关于MyBatis-Plus插入数据后如何返回id的问题。首先,我要回忆一下之前用户的问题和之前的回答。用户之前询问了不同数据库在插入数据返回ID的方法,我给出了不同数据库的具体SQL示例和编程语言中的实现方法,比如MySQL的LAST_INSERT_ID(),PostgreSQL的RETURNING子句等。现在用户MyBatis-Plus,这是一个基于MyBatis的增强工具,简化了开发,所以需要针对MyBatis-Plus的特点来回答。 首先,我需要确认MyBatis-Plus中插入数据返回主键的机制。通常,MyBatis本身支持通过配置useGeneratedKeys和keyProperty来获取自增主键MyBatis-Plus作为增强工具,可能进一步简化了这个过程。需要检查是否在实体类中正确配置了主键生成策略,比如使用@TableId注解,数据库表的主键是自增的。 然后,我需要分步骤说明如何在MyBatis-Plus中实现插入后返回id。首先,确保数据库表的主键设置为自增,比如MySQL的AUTO_INCREMENT。接着,在实体类的主键字段上添加@TableId注解,指定主键类型,比如IdType.AUTO。然后,通过调用MyBatis-Plus提供的insert方法插入数据,插入成功后,实体对象的主键字段会被自动填充,可以直接获取。 此外,还需要考虑不同数据库的主键生成策略是否一致,比如Oracle可能需要使用序列,这时候可能需要不同的配置。但用户的问题可能更关注于常见的自增主键情况,比如MySQL、PostgreSQL等。需要提到这些配置可能因数据库不同而有所调整,但MyBatis-Plus通常能自动处理。 还需要注意可能出现的常见问题,比如没有在实体类中正确配置主键注解,或者数据主键未设置为自增,导致无法正确获取ID。此外,要确保插入操作使用的是MyBatis-Plus的insert方法,而不是自定义的SQL,否则可能需要手动配置才能返回主键。 最后,可能需要提供一个代码示例,展示实体类的配置和插入操作的代码,以及如何从实体对象中获取返回的ID。同时,提醒用户检查数据库连接配置,确保使用了正确的JDBC驱动,数据库本身支持自增主键。</think>在 MyBatis-Plus 中插入数据返回自增主键 ID 的实现非常简单,**核心依赖于实体类的主键注解配置和数据库自增字段的支持**。以下是详细步骤及代码示例: --- ### **1. 前置条件:数据库表设计** 确保数据库表的主键字段设置为**自增模式**(如 MySQL 的 `AUTO_INCREMENT`,PostgreSQL 的 `SERIAL` 或 `GENERATED BY DEFAULT AS IDENTITY`)。 示例表结构(MySQL): ```sql CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 自增主键 name VARCHAR(50), email VARCHAR(50) ); ``` --- ### **2. 实体类配置** 在 Java 实体类的主键字段上添加 `@TableId` 注解,指定主键生成策略为 `IdType.AUTO`(表示跟随数据库自增): ```java @Data @TableName("user") // 指定表名(若表名与类名不一致时需要) public class User { @TableId(value = "id", type = IdType.AUTO) // 关键注解 private Long id; private String name; private String email; } ``` --- ### **3. 插入数据获取 ID** 直接调用 MyBatis-Plus 的 `insert()` 方法插入数据,**插入成功后实体对象会自动填充生成的 ID**: ```java // 创建实体对象(无需手动设置 id) User user = new User(); user.setName("张三"); user.setEmail("zhangsan@example.com"); // 调用插入方法 userMapper.insert(user); // userMapper 是 MyBatis-Plus 生成的 Mapper 接口 // 插入后直接通过实体对象获取 ID Long generatedId = user.getId(); // 自动填充的自增 ID System.out.println("生成的 ID:" + generatedId); ``` --- ### **关键原理说明** 1. **注解 `@TableId(type = IdType.AUTO)`** - 告诉 MyBatis-Plus 主键数据库自增生成。 - MyBatis-Plus 底层会通过 JDBC 的 `getGeneratedKeys()` 方法获取自增值,回填到实体对象中。 2. **无需手动编写 SQL** - MyBatis-Plus 的 `insert()` 方法已封装了主键回填逻辑,无需像原生 MyBatis 那样在 XML 中配置 `useGeneratedKeys` 和 `keyProperty`。 --- ### **常见问题排查** - **问题 1:插入后 ID 未回填** - 检查数据库表的主键是否设置为自增。 - 检查实体类的 `@TableId` 注解是否正确配置 `type = IdType.AUTO`。 - 确保使用的是 MyBatis-Plus 的 `insert()` 方法,而非自定义 SQL。 - **问题 2:Oracle 等非自增主键数据库** 若数据库使用序列(如 Oracle),需修改主键策略为 `IdType.INPUT`,配合 `@KeySequence` 注解指定序列: ```java @KeySequence("SEQ_USER") // 指定数据序列名 public class User { @TableId(type = IdType.INPUT) // 手动输入模式 private Long id; // 其他字段... } ``` --- ### **总结** MyBatis-Plus 通过 `@TableId` 注解和内置的主键回填机制,**只需一行代码即可实现插入后返回自增 ID**。确保数据库自增配置和实体类注解正确,即可避免手动处理主键的繁琐操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值