`

135. [视频]Spring Boot MyBatis升级篇-注解-自增ID【从零开始学Spring Boot】

阅读更多

 

 

【视频&交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

【本篇博客,有配套视频,视频地址:《Spring Boot MyBatis升级篇-注解-自增ID,公众号中点击下面的阅读原文,视频中讲解的更详细】

需求缘起:

       在上一篇文章中,我们已经会集成MyBatic并且完成了保存数据的动作,但是现在如果你细心观察的话,在浏览器看到的数据中id=0。有人说:我不需要返回id呀,id返回我也用不到,返回为0的话,无所谓了。但是在实际项目中,我们是有很多场景需要用到返回的id的。网友就有疑问了,博主你吹牛吧,很多场景,那很多是多少呢?你说两个来听听。

 

使用场景 —— 保存时返回id的使用场景:

       既然网友要让博主回答两个,那就回答两个吧:

1)场景1:在开发app的时候,我们对于朋友圈有留言的功能,留完言之后,那么想要删除,这时候,请求请求到后台执行save()动作之后,就需要返回留言信息的id,不然App端发起删除的时候,就不知道删除哪条评论了。

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 = new QuestionOption();
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),但是在某些情况下,我们插入一条记录后,还想得到这条记录的自增主键IDuseGeneratedKeys=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秒。

 

视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

分享到:
评论
4 楼 林祥纤 2017-10-18  
itlang01 写道
林祥纤 写道
itlang01 写道
场景2的代码加入事务的话就获取不到qid了,一般需要加入事务,这个情况怎么解决


你测试了吗?

找到原因了是因为我设置了defaultExecutorType=BATCH导致的


找到原因就好!
3 楼 itlang01 2017-10-18  
林祥纤 写道
itlang01 写道
场景2的代码加入事务的话就获取不到qid了,一般需要加入事务,这个情况怎么解决


你测试了吗?

找到原因了是因为我设置了defaultExecutorType=BATCH导致的
2 楼 林祥纤 2017-10-12  
itlang01 写道
场景2的代码加入事务的话就获取不到qid了,一般需要加入事务,这个情况怎么解决


你测试了吗?
1 楼 itlang01 2017-10-12  
场景2的代码加入事务的话就获取不到qid了,一般需要加入事务,这个情况怎么解决

相关推荐

Global site tag (gtag.js) - Google Analytics