Mybatis主键回填
时间: 2025-03-24 16:10:43 浏览: 27
### MyBatis 主键回填的实现机制与示例
#### 1. 使用 `useGeneratedKeys` 属性的方式
当数据库支持自动生成主键(如 MySQL 的 AUTO_INCREMENT 字段),可以通过设置 `useGeneratedKeys="true"` 来让 MyBatis 获取数据库生成的主键值并将其填充到对象中。这种方式依赖于 JDBC 驱动程序中的 `getGeneratedKeys()` 方法。
以下是具体的 XML 映射配置和代码示例:
```xml
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
```
在此配置中,`keyProperty="id"` 表明将数据库返回的主键值赋给传入参数的对象属性 `id`[^2]。
对应的 Java 代码如下:
```java
public class User {
private Integer id;
private String name;
private Integer age;
// Getters and Setters
}
// Mapper 接口方法
int insertUser(User user);
```
调用此方法后,`user.getId()` 将自动被填充为主键值。
---
#### 2. 使用 `<selectKey>` 标签的方式
如果数据库不支持自动生成主键(如 Oracle 数据库),可以手动指定如何生成主键并通过 `<selectKey>` 标签完成主键回填。这种情况下,MyBatis 不依赖于数据库的功能,而是通过执行额外的查询语句获取主键值。
以下是基于 Oracle 序列的一个例子:
```xml
<insert id="insertUserWithSequence">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT SEQ_USER.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>
```
在这个例子中:
- `<selectKey>` 定义了一个查询操作,用于从序列 `SEQ_USER` 中获取下一个可用 ID 值。
- `order="BEFORE"` 表示在实际插入数据之前先执行该查询以获得主键值[^3]。
同样适用上述的 `User` 类型作为实体类。
---
#### 总结对比
| 特性 | `useGeneratedKeys` 方式 | `<selectKey>` 方式 |
|---------------------|--------------------------------------------|------------------------------------|
| **适用场景** | 支持自增主键的数据库 | 所有类型的数据库 |
| **性能开销** | 较低 | 可能稍高 |
| **灵活性** | 对应单一表结构 | 更灵活 |
无论采用哪种方式,都需要确保映射文件中的 SQL 语法正确无误,并且与业务逻辑保持一致。
---
阅读全文
相关推荐


















