主键生成
SQL Server 常用 IDENTITY 或 sequence 生成主键。IDENTITY 在 INSERT 时由数据库生成,dbVisitor 随后把值写回实体;sequence 可以在 INSERT 前取值,应用先得到主键再完成写入。
说明
通用配置见主键生成与回填。
主键策略
| 策略 | 本数据源的用法 |
|---|---|
| 手工赋值 | 插入前由应用提供主键。 |
| 自增 | 由数据库生成数值主键。 |
| UUID | 字符主键使用 UUID32 或 UUID36。 |
| 序列 | 插入前取得序列值。 |
| 自定义 | 使用自定义生成器,在插入前或后处理主键。 |
使用 IDENTITY
CREATE TABLE user_info (
id BIGINT IDENTITY(1, 1) PRIMARY KEY,
name NVARCHAR(64),
age INT
)
实体主键使用 KeyType.Auto:
@Table("user_info")
public class UserInfo {
@Column(value = "id", primary = true, keyType = KeyType.Auto)
private Long id;
private String name;
private Integer age;
}
- 构造器 API
- 方法注解
- Mapper 文件
插入后,数据库生成的 id 会自动写回当前实体。
新增后 属性自动回填
UserInfo user = new UserInfo();
user.setName("mali");
user.setAge(18);
LambdaTemplate lambda = ...;
int rows = lambda.insert(UserInfo.class)
.applyEntity(user)
.executeSumResult();
Long id = user.getId();
方法注解
@Insert(value = "INSERT INTO user_info (name, age) VALUES (#{name}, #{age})",
useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insertUser(UserInfo user);
需要明确返回列或同时回填普通字段时,使用 OUTPUT INSERTED,见数据回填。
<insert id="insertUser"
useGeneratedKeys="true"
keyProperty="id"
keyColumn="id">
INSERT INTO user_info (name, age)
VALUES (#{name}, #{age})
</insert>
注意
一次插入多个实体时,SQL Server 不保证 OUTPUT 按输入顺序返回。需要主键与实体严格对应时,每次调用只插入一个实体。
使用序列
SQL Server 2012 及以上版本支持序列。下面是使用普通主键列的独立示例:
CREATE SEQUENCE user_info_id_seq AS BIGINT START WITH 1 INCREMENT BY 1;
CREATE TABLE user_info (id BIGINT PRIMARY KEY, name NVARCHAR(64), age INT);
- 构造器 API
- 方法注解
- Mapper 文件
import net.hasor.dbvisitor.mapping.Column;
import net.hasor.dbvisitor.mapping.KeySeq;
import net.hasor.dbvisitor.mapping.KeyType;
import net.hasor.dbvisitor.mapping.Table;
@Table("user_info")
public class UserInfo {
@Column(primary = true, keyType = KeyType.Sequence)
@KeySeq("user_info_id_seq")
private Long id;
private String name;
private Integer age;
// 省略 getter 和 setter
}
UserInfo user = new UserInfo();
user.setName("mali");
lambda.insert(UserInfo.class).applyEntity(user).executeSumResult();
Long id = user.getId();
插入前自动获取序列值,赋给 id 后写入记录。多个实体分别获取各自的序列值。
@SelectKeySql(
value = "SELECT NEXT VALUE FOR user_info_id_seq",
keyProperty = "id",
keyColumn = "id",
order = Order.Before
)
@Insert("INSERT INTO user_info (id, name, age) VALUES (#{id}, #{name}, #{age})")
int insertUser(UserInfo user);
<insert id="insertUser">
<selectKey keyProperty="id" order="BEFORE">
SELECT NEXT VALUE FOR user_info_id_seq
</selectKey>
INSERT INTO user_info (id, name, age)
VALUES (#{id}, #{name}, #{age})
</insert>