- @SelectKey 注解的功能与 <selectKey> 标签完全一致。用于解决某些数据库(如Oracle)主键不能支持自增的情况
- @SelectKey 注解有以下属性:
参数 |
描述 |
statement |
以字符串数组形式指定将会被执行的 SQL 语句 |
keyProperty |
指定作为参数传入的对象对应属性的名称,该属性将会更新成新的值 |
keyColumn |
数据库中的主键字段名 注 keyColumn属性只在某些数据库中有效(如 Oracle、PostgreSQL 等) |
before |
可以指定为 true 或 false 以指明 SQL 语句应被在插入语句的之前还是之后执行 |
resultType |
则指定 keyProperty 的 Java 类型。 |
statementType |
设置编译的方式
直接操作sql,不进行预编译,获取数据
预处理,参数,进行预编译,获取数据,默认
|
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 注解所设置的生成主键