mybatis 添加一条新数据并返回此数据的ID(主键)

本文介绍如何在Mybatis中通过selectKey和insert标签实现获取插入数据后的ID值,以及实体类的设计和测试过程。

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

通常数据库中表的主键是‘自动递增(mysql)’或’序列(oracle)‘,但插入数据后又要取得些条数据的ID(将ID做为主键)


利用Mybatis 的 selectKey来获得:

<!-- 添加部门 返回部门ID -->
<insert id="addDept" parameterType="com.demo.model.Department" keyProperty="id">
	<selectKey keyProperty='id' resultType='int' order='AFTER'  >
		select LAST_INSERT_ID();
	</selectKey>
     insert into department(<include refid="departmentAllField"/>) 
		values(#{departmentId},#{departmentName},#{departmentManagerName},#{companyId});
 </insert>

<insert id="addDept" parameterType="com.demo.model.Department" useGeneratedKeys="true" keyProperty="id">
  insert into department(<include refid="departmentAllField"/>) 
   values(#{departmentId},#{departmentName},#{departmentManagerName},#{companyId});
</insert><span style="font-family: Arial, Helvetica, sans-serif;"></span>

注意:insert 标签中的 keyProperty  和  selectKey标签块中的 LAET_INSERT_ID() ,另外 order属性 对于 oracl为 BEFORE; mysql为AFTER


实体类:

public class Department {
	private int id;
	private int departmentId;
	private String departmentName;
	private String departmentManagerName;
	private int companyId;
	private List<Employee> employees;
	//...GET SET ...
}

测试:

@Test
public void testDao(){
	deptDao = session.getMapper(DepartmentDao.class);

	Department department = new Department();
	department.setDepartmentName("ares");
	department.setDepartmentManagerName("tom");
	department.setDepartmentId(32);
	department.setCompanyId(6201);

	deptDao.addDept(department);
	System.out.println("新部门ID:"+department.getId());
}


输出成功!

<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**。确保数据库自增配置和实体类注解正确,即可避免手动处理主键的繁琐操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值