主键生成
MySQL 使用 AUTO_INCREMENT 生成主键,插入后可将值自动写回实体。
说明
通用配置见主键生成与回填。
主键策略
| 策略 | 本数据源的用法 |
|---|---|
| 手工赋值 | 插入前由应用提供主键。 |
| 自 增 | 由数据库生成数值主键。 |
| UUID | 字符主键使用 UUID32 或 UUID36。 |
| 序列 | 不提供序列主键策略。 |
| 自定义 | 使用自定义生成器,在插入前或后处理主键。 |
使用 AUTO_INCREMENT
CREATE TABLE user_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64)
) ENGINE=InnoDB;
- 构造器 API
- 方法注解
- Mapper 文件
@Table("user_info")
public class UserInfo {
@Column(value = "id", primary = true, keyType = KeyType.Auto)
private Integer id;
@Column("name")
private String name;
}
UserInfo user = new UserInfo();
user.setName("mali");
LambdaTemplate lambda = ...;
lambda.insert(UserInfo.class).applyEntity(user).executeSumResult();
Integer id = user.getId(); // 自动回填
方法注解
@Insert(value = "INSERT INTO user_info (name) VALUES (#{name})",
useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insertUser(UserInfo user);
Mapper 文件
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO user_info (name) VALUES (#{name})
</insert>
注意
插入多个实体后,从各实体属性读取 ID,不要从第一个 ID 推算其它主键。插入冲突导致跳过或更新已有记录时,不保证回填主键。
选择回填来源
方法注解和 Mapper 文件均使用 useGeneratedKeys,保持默认回填来源。生成键和命令本身的结果集不是同一个结果;这里的插入不要设置 generatedKeySource="resultSet"。
上面的例子展示了可用的生成键回填方式;需要指定返回列时使用 keyColumn。