mybatis,insert返回id
时间: 2025-07-01 07:24:15 浏览: 9
### MyBatis 在执行 Insert 操作后返回生成的 ID 实现方式
MyBatis 提供了多种方法来实现插入操作后返回生成的主键值。以下是一些常见的实现方式:
#### 1. 使用 `useGeneratedKeys` 属性
当数据库支持自动生成主键(例如 MySQL 的 `AUTO_INCREMENT`),可以通过设置 `useGeneratedKeys="true"` 和 `keyProperty` 来获取生成的主键[^1]。
```xml
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, email)
VALUES (#{name}, #{email})
</insert>
```
上述配置中,`useGeneratedKeys="true"` 告诉 MyBatis 使用 JDBC 的 `getGeneratedKeys` 方法从数据库获取生成的主键,并将其赋值给对象的 `id` 属性[^2]。
#### 2. 使用 `selectKey` 标签
如果数据库不支持自动生成主键,或者需要在插入之前生成主键(如使用序列或 UUID),可以使用 `<selectKey>` 标签[^3]。
```xml
<insert id="insertUserWithSelectKey">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT SEQ_USERS.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO users (id, name, email)
VALUES (#{id}, #{name}, #{email})
</insert>
```
在此示例中,`<selectKey>` 标签用于在插入之前生成主键值,并将其赋值给 `id` 属性。`order="BEFORE"` 表示在执行插入语句之前生成主键[^4]。
#### 3. 手动处理返回值
在某些情况下,可能需要通过手动查询来获取生成的主键。这通常发生在复杂场景下,例如跨表事务或分布式系统中的主键生成[^5]。
```java
int affectedRows = sqlSession.insert("insertUser", user);
if (affectedRows > 0) {
Integer generatedId = sqlSession.selectOne("selectLastInsertId");
user.setId(generatedId);
}
```
此方法要求额外定义一个查询语句(如 `selectLastInsertId`)来获取最后插入的主键值。
#### 注意事项
- 确保实体类中存在与 `keyProperty` 对应的字段,并提供相应的 getter 和 setter 方法。
- 如果使用 `useGeneratedKeys`,请确保数据库支持自动生成主键功能。
- 在使用 `<selectKey>` 时,注意选择合适的 `order` 值(`BEFORE` 或 `AFTER`),以匹配主键生成逻辑。
```java
public class User {
private Integer id;
private String name;
private String email;
// Getters and Setters
}
```
阅读全文
相关推荐


















