实现步骤
step1:添加乐观锁拦截器
MP的其他拦截器功能可以参考官网
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
step2:配置Entity
@TableField(fill = FieldFill.UPDATE)
@Version
private Date updateTime;
用更新字段充当版本号。
- 上面的配置需要注意的是:updateTime既配置自动填充,又配置了乐观锁功能。MP在进行处理时会先进行乐观锁处理,然后再进行自动填充。
- 问题:前端送了id和一些需要更新的字段过来,每次需要从数据库中查出version,然后再进行更新(要么前端将版本号传过来);
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime;
- 仅支持 updateById(id) 与 update(entity, wrapper) 方法,在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
- 对于updateTime这个字段,在数据库中建议设置成时区不相关的时间戳类型。
多说一点
使用updateTime作为版本号可能会存在一些问题。
我们通常需要将updateTime返回给前端页面,假如我们不做任何设置,返回前端的数据大概是下面的样子:
{
"userId": 367,
"address": "上海市自由之路xxxxxx...",
"workUnit": "XXXX",
"createTime": "2025-12-22T00:00:00.000+08:00",
"updateTime": "2025-01-08T17:28:14.782+08:00"
}
这种时间格式可能不是前端页面需要的,这是我们可以进行如下设置;
spring:
jackson:
default-property-inclusion: non_null
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
返回的数据
{
"userId": 367,
"address": "上海市自由之路xxxxxx...",
"workUnit": "XXXX",
"createTime":"2025-12-22 00:00:00",
"updateTime":"2025-01-08 17:28:14"
}
经过这个配置后,就可以得到可读性比较好的时间格式了。但是我们需要注意的时候,这个时间的精度其实已经丢失了,当前提交修改数据到后端,这个值和数据库中的值已经不相等了。所以永远不能将数据更新成功。
所以这种情况下使用updateTime来进行乐观锁更新就不太适合了。可以考虑在表中另外加一个字段version来进行乐观锁更新。
但其实还是有比较好的解决办法的。
首先,我们不要对返回的时间格式进行全局话配置。
spring:
jackson:
default-property-inclusion: non_null
time-zone: GMT+8
# date-format: yyyy-MM-dd HH:mm:ss
然后,添加一个updateTime的备份字段updateTimeSimpleFormat,并对这个字段进行单独的时间格式化。
private Date updateTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTimeSimpleFormat;
updateTimeSimpleFormat不要生成get和set方法,在updateTime的set方法中对updateTimeSimpleFormat进行赋值。
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
this.updateTimeSimpleFormat = updateTime;
}
这样就既能满足前端返回格式化的时间,后端又能获取到乐观锁的版本号。
但是,这个方法比较不好的地方,就是必须对每个时间格式进行@JsonFormat注解配置,不能进行全局配置,比较繁琐。
总结:使用updateTime作为乐观锁的优点就是不需要再新加字段,比较简洁。但是带来的问题上面已经讲的很清楚了。还是印证了那个真理:没有完美的技术,只有适合的技术。
相关推荐:
seo网络推广要做什么,seo 网络推广 ,ai少女喝药
SEO自行:提升网站流量的秘密武器,邹平县个人网站建设建议
AI搜索写文章:一丝丝智慧背后的无限可能,电脑免费ai写作神器
ChatGPTWindows版本:让AI助手成为你的工作与生活得力助手,Ai相减变形
ChatGPT免费用户每天的使用限制:如何高效利用,突破困境!,花花制作ai
“更加通顺”-让生活与工作无缝衔接的语言魅力,SEO书架书桌收纳
什么是秀米?全方位了解这款微信公众号排版神器,宁波全网营销型网站建设
“只能写作”:在创作的世界里,选择文字,就是选择自由,云南关键词排名推广报价
SEO职责:为网站注入流量,提升品牌竞争力,拼多多女装关键词排名
SEO攻略:搜索引擎优化,快速提升网站排名,网站推广网站优化费用
文章生成AI:让写作轻松高效的神奇工具
SEO应该如何提升网站流量与排名?揭秘成功的SEO策略,肺炎疫苗推广营销
为什么“未备案域名”会成为互联网行业中的重要问题?,江干区seo优化价格
ChatGPT不能用?揭秘你可能忽视的真相和解决方法,强国ai2022
SEO快速优化技术:助力网站流量暴增,轻松登顶搜索引擎,铜陵ai全网通推广软件
SEO网络营销:如何通过精准优化提升品牌价值,青州建设网站电话
SEO无限:如何利用SEO技术实现网站流量爆发?,网站建设总监
SEO主要是为网站引流吗?深入解析SEO的核心价值,AI算算
SEO导航:助力网站提升流量与排名的必备工具,荣昌建筑网站建设
产品经理seo是什么,产品经理seo是什么意思 ,ai政府公文写作 软件
好用的AI写作工具,提升写作效率与创意的最佳选择
ChatGPT的VPN梯子:畅享全球互联网自由,打破地域限制,一直搜Ai
SEO发明:引领数字时代营销革命的力量,速卖通外贸推广网站
seo网页优化什么意思,seo网站优化必知的10个问答,问吧,【解决】百度不知道 ,ai识别点读机
seo链接锚是什么,什么是锚链接,如何设置锚链接 ,保山智能AI
SEO实际:如何在竞争激烈的市场中脱颖而出,dz论坛seo如何设置
什么是SEO金融,seo是做什么的 ,ai中转程序
《收录情况:数字时代的网络信息检索与价值体现》,山东全域营销推广软件客服电话
ChatGPT服务器坏了?了解背后的技术与应对策略,AI模块代表
ChatGPT当前不可用?如何应对AI服务中断的挑战,ai文章免费写作app
SEO详解:如何优化你的网站提升排名,获得更多流量,伊春湖南网站优化推广
SEO快速提升:让你的网站排名瞬间飙升的秘诀,网站建设的发展目标
SEO如何做?全方位解析提升网站排名的秘诀,AI翻译好处
Bing搜索的注意事项-提高搜索效率与准确性,轻松获取所需信息,最近ai写作软件推荐
pbootcms自动翻译插件,让你的网站轻松实现多语言覆盖,ai 镀金
SEO深度解析:如何通过深度优化提升网站排名,带来流量和转化,咸宁网站建设大概费用
SEO超级,助力企业站点冲刺搜索引擎排名,白云全网营销推广哪家强
SEO才能:提升网站排名,突破网络营销的核心竞争力,南宁本地seo营销公司
SEO收集:如何通过有效数据收集提升网站排名,鞍山商城网站建设报价
ChatGPT198元永久会员,开启智慧之门,体验AI的极致服务!,老孙教ai
SEO运营工作是什么,seo公司运营 ,720516AI
ChatGPT不能用了?了解这一背后的真相及解决方法,ai恐怖头像
SEO在线服务-让您的网站快速跃升至搜索引擎前列,江西小红书营销推广案例
seo站长什么意思,站长工具 - seo综合查询 ,ai少女身材
互联网快排:助力企业网站流量爆发的秘密武器,西安网站建设找资源公司
亚马逊seo信息是什么,亚马逊seo关键词优化软件 ,光谷ai
文章AI排版,让创作更高效的秘密武器
ChatGPT打不开实时问题解决方案:让你的AI助手始终在线,psd 转ai
seo配置是什么,seo设置是什么 ,ai图标制作教程
SEM做得好可以取代SEO吗?浅析两者的异同与未来趋势,王道ai