Mybatis中@SelectKey注解

注解简介

@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)数据库主键是自增列,插入数据之前,无需自己生成主键,插入成功之后才能获知主键。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值