MyBatis 日常踩坑
注解版MyBatis获取自增主键 在使用MyBatis注解版,往数据库里边Insert文档的时候,一般都不设置id,而是使用自增主键。这时候自增主键在之后的代码中会有更大的作用,所以需要在插入之后获得这个自增主键。 方法有两种:
- 使用
select last_insert_id()@Insert("insert into table(content,questionid,active,submit,createtime) values(#{content},#{questionid}, 1,#{submit},#{createtime})") @SelectKey(statement="select last_insert_id()" ,before=false,keyProperty="_id",resultType=Integer.class,keyColumn="_id") int insertQuestionItem(QuestionItemInfo questionItemInfo);其中,keyProperty是对象中想要的数据名(不一定是id,可以是别的字段,但返回的一定是最后插入的内容),keyColumn是对应的数据库字段名.
@InsertProvider(type=OperateSqlProvider.class,method="insertQuestion") @SelectKey(statement="select last_insert_id()", before=false,keyProperty="bean._id",resultType=Integer.class,keyColumn="_id") int insertQuestion(@Param("bean")QuestionInfo questionInfo);这是使用Provider代理处理,使用了注解(@Param),这时keyProperty发生了变化,变为了 【Param名称.属性名称】 在使用provider之后,要在provider方法中进行响应的设置:
@Override public int insertQuestion(QuestionInfo bean){ mapper.insertQuestion(bean);//MyBatis操纵数据库,返回的信息已经封装到了bean内。 return bean.getId(); } - 使用options注解
这种方法较为简洁,即:
- 写SQL,但不要自己插入主键值
- 配置
@Options(useGeneratedKeys=true, keyProperty="对象.属性")这个的作用是设置是否使用JDBC的getGenereatedKeys()方法获取主键并赋值到keyProperty设置的对象的属性中,说白了就是把自增长的主键值赋值给对象相应的属性 - 在插入后,使用对象.主键属性的getXXId()方法 获取主键值
@InsertProvider(type=OperateSqlProvider.class,method="insertQuestion") @Options(useGeneratedKeys = true, keyProperty = "bean._id") int insertQuestion(@Param("bean")QuestionInfo questionInfo);