主键获取(@SelectKey)

Exisi 2021-03-27 07:47:33
Categories: Tags:
  • @SelectKey 注解的功能与 <selectKey> 标签完全一致。用于解决某些数据库(如Oracle)主键不能支持自增的情况

 

  • @SelectKey 注解有以下属性:

参数

描述

statement

以字符串数组形式指定将会被执行的 SQL 语句

keyProperty

指定作为参数传入的对象对应属性的名称,该属性将会更新成新的值

keyColumn

数据库中的主键字段名

keyColumn属性只在某些数据库中有效(如 OraclePostgreSQL 等)

before

可以指定为 true 或 false 以指明 SQL 语句应被在插入语句的之前还是之后执行

resultType

则指定 keyProperty 的 Java 类型。

statementType

设置编译的方式

  • StatementType.STATEMENT

直接操作sql,不进行预编译,获取数据

  • StatementType.PREPARED

预处理,参数,进行预编译,获取数据,默认

  • StatementType.CALLABLE:执行存储过程

databaseId

MyBatis 3.5.5以上可用, 如果有一个配置好的 DatabaseIdProvider, MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时存在带 databaseId 和不带 databaseId 属性的相同语句,则后者会被舍弃。

 

  • 使用 @SelectKey 注解来在插入前读取数据库序列的值

示例

public interface StudentMapper(){

@Insert("insert into user (id, name) values(#{nameId}, #{name})")

@SelectKey(

statement="call next value for TestSequence",

keyProperty="nameId",

before=true,

resultType=int.class

)

int insertTable3(Name name);

 

  • 使用 @SelectKey 注解来在插入后读取数据库自增列的值

示例

@Insert("insert into user (name) values(#{name})")

@SelectKey(

statement="call identity()",

keyProperty="nameId",

before=false,

resultType=int.class

)

int insertTable2(Name name);

 

  • 获取非自增主键

示例

public interface StudentMapper(){

@Insert("insert into student(id,name,email,addr) values(#{id},#{name},#{email},#{address})") 

@SelectKey(

statement="select UUID()",  

keyProperty="id",

resultType=String.class,

before=true

) 

int insertStudent(Student student); 

}

 

  • 该注解只能在 @Insert @InsertProvider @Update @UpdateProvider 标注的方法上使用,否则将会被忽略

 

  • 如果指定了 @SelectKey 注解,那么 MyBatis 就会忽略掉由 @Options 注解所设置的生成主键

 

来自 <http://www.mybatis.cn/archives/909.html>