135. Spring Boot MyBatis升级篇-注解-自增ID
Posted SpringBoot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了135. Spring Boot MyBatis升级篇-注解-自增ID相关的知识,希望对你有一定的参考价值。
需求缘起:
在上一篇文章中,我们已经会集成MyBatic并且完成了保存数据的动作,但是现在如果你细心观察的话,在浏览器看到的数据中id=0。有人说:我不需要返回id呀,id返回我也用不到,返回为0的话,无所谓了。但是在实际项目中,我们是有很多场景需要用到返回的id的。网友就有疑问了,博主你吹牛吧,很多场景,那很多是多少呢?你说两个来听听。
使用场景 —— 保存时返回id的使用场景:
既然网友要让博主回答两个,那就回答两个吧:
(2)场景2:在题库管理的时候,我们需要录入题目信息以及题库的选项,对于题库的选项是可以多个,如下:
题目:你最喜欢的是技术是?
A: Java语言 B: php语言 C: python语言 D:C语言
那么对于题目信息我们会保存到一张表中Question,对于选项,我们会保存到另外一张表QuestionOption,对于表QuestionOption会有一个外键qid,也就是question的主键。对于Question和QuestionOption的保存是在同一个请求就完成的(如果是题目的保存和选项的保存是两个请求才完成的,那么流程不一样)。在保存QuestionOption的时候,需要用到Question的主键,这时候后台的保存代码是这样的:
Question question =Question();
int qid = save(Question);
QuestionOption qo = newQuestionOption();
qo.setQid(qid);
int qid = save(QuestionOption);
这种场景就需要在保存Question的时候,就返回Question的主键了。
类似的场景很多,总之来说,有很多场景需要我们在保存完数据之后就获取到自增主键id。
示例代码:
在上面说了这么多,其实这个很简单,主要是使用@Options注解,核心代码如下(这个代码是在上一篇博客的代码基础进行编写),只需要修改下DemoMapper即可:
package com.kfit.demo.mapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import com.kfit.demo.bean.Demo;
public interface DemoMapper {
@Insert("insert into Demo(name) values(#{name})")
@Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true)
public void save(Demo demo);
}
这时候在访问http://127.0.0.1:8080/save 就可以看到如下的返回信息:
{"id":7,"name":"张三"}
@Options解说:
@Options注解中的工作就比较有意思,我们在插入记录时,一般是定义主键自增(auto_increment),但是在某些情况下,我们插入一条记录后,还想得到这条记录的自增主键ID,useGeneratedKeys=true就是定义数据库返回主键ID的,常用的属性如下:
useCache=true,
flushCache=false,
resultSetType=FORWARD_ONLY,
statementType=PREPARED,
fetchSize= -1,timeout=-1 ,
useGeneratedKeys=false ,
keyProperty=”id“。
KeyProperty是实体类中定义的主键字段名;
KeyColumn是表中主键对应的字段;
useGeneratedKeys=true定义数据库返回主键ID;
à注解中的useCache还可以设置缓存相关的选项:
useCache = true表示本次查询结果被缓存以提高下次查询速度,flushCache = false表示下次查询时不刷新缓存,timeout =10000表示查询结果缓存10000秒。
从上面的描述中,我们会发现@Options实际常用于两种场景:
@Options的两种使用场景:
(1)场景1:保存数据:返回主键id
设置@Options属性userGeneratedKeys的值为true,并指定实例对象中主键的属性名keyProperty以及在数据库中的字段名keyColumn。这样在gendar插入数据后,gendarId属性会被自动赋值。当然flushCache 仍然可以设置,表示插入数据后是否更新缓存,默认是true。
(2)场景2:查询数据:缓存数据、设置超时时间
配合查询语句使用,主要是开关一些查询的选项。比如useCache = true表示将会缓存本次查询结果,以提高下次查询速度;flushCache= Options.FlushCachePolicy.FALSE表示查询时不刷新缓存;timeout =10000表示查询结果缓存10000秒。
视频+交流平台:
à Spring Boot视频
http://412887952-qq-com.iteye.com/blog/2344171
à Spring Boot交流平台
http://412887952-qq-com.iteye.com/blog/2321532
以上是关于135. Spring Boot MyBatis升级篇-注解-自增ID的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot:Spring Boot整合Mybatis案例