mybatis使用注解方式插入数据后获取自增长的主键值
Mybatis使用:Sql Annotation
mybatis本身提供的注解
插入
插入的使用注解
获取自增id的方式有
INSERT INTO table_name (col1, col2,…) VALUES (‘val1’, ‘val2’…);
1. SELECT LAST_INSERT_ID();
2. SELECT @@IDENTITY
3. SELECT MAX(id)
……
应用情景
- 写SQL,但不要自己插入主键值,插入数据后获取自增长的主键值
- 配置@Options(useGeneratedKeys=true, keyProperty=”对象.属性”)
这个的作用是设置是否使用JDBC的getGenereatedKeys()方法获取主键并赋值到keyProperty设置的对象的属性中,
插入一条记录后,还想得到这条记录的自增主键ID,useGeneratedKeys=true就是定义数据库返回主键ID的。
也就是说把自增长的主键值赋值给对象相应的属性
@Insert("INSERT INTO `wx_act` (`name`, `modelId`, `image`) VALUES (#{name}, #{modelId}, #{image})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int saveMoonCoke(MidAutumn midAutumn);
- 在插入后,使用对象.主键属性的getXXId()方法 获取刚刚插进去的主键值
- 这个方法返回的内容是insert的影响的行数
例子
System.out.println("Before inserting ... " + moonCoke.getId());
MidAutumn moonCoke = new MidAutumn();
moonCoke.setName(name);
moonCoke.setModelId(modelId);
moonCoke.setImage(photoUrl);
int effectRow = midautumnService.saveMoonCoke(moonCoke);
System.out.println("effect row ... " + effectRow);
System.out.println("After inserting ... " + moonCoke.getId());
Options的其他选项
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Options {
boolean useCache() default true;
boolean flushCache() default false;
ResultSetType resultSetType() default ResultSetType.FORWARD_ONLY;
StatementType statementType() default StatementType.PREPARED;
int fetchSize() default -1;
int timeout() default -1;
boolean useGeneratedKeys() default false;
String keyProperty() default "id";
String keyColumn() default "";
}
对于这些属性,还是比较好理解的,如useCache、flushCache、timeout等。
其中跟主键返回功能相关的属性就是useGeneratedKeys、keyProperty、keyColumn这三个。
对于Options的使用,根据官方文档有个特别重要的注意点:
**
once you engage the Options annotation, your statement is subject to all of the default values.
**
如果你使用了这个属性,SQL的执行就会使用Options的默认值,如果你没有重新定义的话。仔细看下keyColumn的默认值是空,这个如果和你数据库设定不一致的话,就会出问题;所以一旦决定使用主键返回功能,推荐同时使用useGeneratedKeys、keyProperty、keyColumn这三个属性