注解简介
@SelectKey
注解主要用于在插入数据后获取数据库生成的主键。这在很多数据库中是常见的做法,比如使用自增字段或序列生成主键。
@SelectKey
注解通常与插入数据的 SQL
语句一起使用,它告诉 MyBatis
在执行插入操作后执行另一个 SQL
语句来获取主键。
@SelectKey
注解用在已经被 @Insert
或@InsertProvider
或 @Update
或@UpdateProvider
注解了的方法上。若在未被上述四个注解的方法上作 @SelectKey
注解则视为无效。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SelectKey {
/**
* 查询主键的sql语句
*/
String[] statement();
/**
* 表示查询结果赋值给代码中的哪个对象,一般是赋值给对象的某个属性
*/
String keyProperty();
/**
* 表示将查询结果赋值给数据库表中哪一列
*/
String keyColumn() default "";
/**
* 可以设置为 true 或false。要运行的SQL语句,before=true表示插入之前进行查询,可以将查询结果赋给keyProperty和keyColumn,
* 赋给keyColumn相当于更改数据库。before=false表示先插入,再查询,这时只能将结果赋给keyProperty。
*/
boolean before();
/**
* 这是预期返回的键值的 Java 类型。
*/
Class<?> resultType();
/**
* 语句类型.
*/
StatementType statementType() default StatementType.PREPARED;
}
注解的使用注意事项
@SelectKey
注解,即听命他人,也指挥别人,主要表现在两个方面:
(1)自身无效的情况。需要前置注解才能生效:@Insert
或 @InsertProvider
或 @Update
或 @UpdateProvider
,否则无效。
(2)他人无效的情况。如果指定了 @SelectKey
注解,那么 MyBatis
就会忽略掉由 @Options
注解所设置的生成主键。
下面是一个简单的例子:
@Insert("INSERT INTO user (name, email) VALUES (#{name}, #{email})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", resultType = Long.class, before = false)
Long insertUser(User user);
在这个例子中,@Insert
注解用于定义插入数据的 SQL
语句。@SelectKey
注解则定义了另一个 SQL
语句 SELECT LAST_INSERT_ID()
,用于在插入操作后获取生成的主键。keyProperty
指定了将获取到的主键值设置到哪个属性上(这里是 User
对象的 id
属性),resultType
指定了主键值的类型(这里是 Long
),before
属性指定了 @SelectKey
注解的 SQL
语句是在插入操作之前执行还是之后执行(这里是 false
,表示在之后执行)。
注解的应用场景
如果向数据库中插入一条数据,同时有希望返回该条记录的主键,该怎么处理了?有两种情况:
(1)数据库主键不是自增列,需要预先生成,然后才能向数据库中插入一条数据;
(2)数据库主键是自增列,插入数据之前,无需自己生成主键,插入成功之后才能获知主键。