跳到主要内容

@Insert 注解

用来标记在接口方法上,执行一个 INSERT 语句。

信息

如果传入的是一个字符串数组,它们会被连接起来,中间用一个空格隔开。
通过字符串数组可以更清晰地管理多行 SQL。

示例:新增一条用户记录
@SimpleMapper
public interface UserMapper {
@Insert({ "insert into users (", // 1. 定义 SQL 语句
" id, name, age, create_time", //
") values (", //
" #{id}, #{name}, #{age}, #{createTime}", //
")" })
int saveUser(UserDTO user); // 2. user 对象为参数
}

属性清单

属性名描述
value必选 将要被执行的 INSERT 语句。
statementType可选 JDBC 执行使用何种方式。默认值为 Prepared
- Statement 对应 java.sql.Statement
- Prepared 对应 java.sql.PreparedStatement
- Callable 对应 java.sql.CallableStatement
timeout可选 设置执行超时时间(秒),会调用 Statement.setQueryTimeout(int)。默认值 -1 表示不设置
useGeneratedKeys可选 是否使用自增属性。如果同时配置了 @SelectKeySql 注解,该配置将会失效。
keyProperty可选useGeneratedKeys = true 时,用于回填自增值的 Bean 属性名。如果同时配置了 @SelectKeySql 注解,该属性将会失效。
keyColumn可选useGeneratedKeys = true 时,从返回结果集中选择的列名用于回填。默认选择结果集的第一列。如果同时配置了 @SelectKeySql 注解,该属性将会失效。
小提示

keyColumn 属性为空时,将会选择返回结果集的第一个列值作为回填结果。

@SelectKeySql 注解

有时新增数据后需要获取自增主键,用于后续业务逻辑。@SelectKeySql 注解可以在 INSERT 前后执行一条额外的 SQL 来获取主键值,并回填到参数对象中。

该注解需要与 @Insert 配合使用。

示例:INSERT 后获取 MySQL 自增 ID
//create table users (
// id bigint auto_increment primary key,
// name varchar(255),
// age int,
// create_time datetime
//);

@SimpleMapper
public interface UserMapper {
@Insert({ "insert into users (", // 1. 定义 SQL 语句
" name, age, create_time", //
") values (", //
" #{name}, #{age}, #{createTime}", //
")" })
// 在 INSERT 执行后,使用 MySQL last_insert_id() 获取自增 ID,并回填到参数对象的 id 属性
@SelectKeySql(value = "select last_insert_id()", keyProperty = "id", order = Order.After)
int saveUser(UserDTO user);
}

UserMapper mapper = ...;
UserDTO user = ...;

mapper.saveUser(user);

long afterId = user.getId(); // 自增 ID 已被回填

属性清单

属性名描述
value必选 用于获取自增主键的 SQL 查询语句。
keyProperty必选 回填主键值的 Bean 属性名。
order必选 执行时机:Before(INSERT 之前)或 After(INSERT 之后)。
keyColumn可选 从查询结果中选择的列名用于回填。默认选择第一列。
statementType可选 JDBC 执行方式。默认值为 Prepared
timeout可选 执行超时时间(秒)。默认值 -1 表示不设置
fetchSize可选 每次从数据库获取的行数。默认值为 256
resultSetType可选 结果集类型:FORWARD_ONLYSCROLL_INSENSITIVESCROLL_SENSITIVEDEFAULT(默认)