MyBatis Plus 占位符的运用场景:Exists 语句
创作时间:
作者:
@小白创作中心
MyBatis Plus 占位符的运用场景:Exists 语句
引用
CSDN
1.
https://blog.csdn.net/wyx1473343124/article/details/140655726
在使用MyBatis Plus时,通常不需要手动编写SQL语句,也不需要像MyBatis一样使用#{}占位符来生成预编译SQL语句。但是,在某些特定场景下,MyBatis Plus仍然需要使用占位符。本文将通过一个实际案例,介绍MyBatis Plus中占位符的使用方法。
业务场景
在实现秒杀下单功能时,需要保证一人一单的功能。也就是说,同一个用户抢购某件商品只能抢购一次,再下单就要返回错误信息。在高并发情况下,如何保证同一个用户一秒内发起100次请求时,只有一个请求能够更新商品库存成功(即下单成功)?
这涉及到两张表:商品表和订单表。
问题分析
一般的思路是,先查询订单表,判断是否有该用户对该商品的订单,如果没有订单,说明可以下单,再更新商品表的stock库存。但是如果不加锁的话,这么做是不行的,查询和更新分开进行,容易导致高并发情况下的安全问题。
解决方案
为了实现一人一单的功能,可以使用not exists语句,只用一条update语句完成判断和更新。以下是具体的代码实现:
boolean res = seckillVoucherService.update()
.setSql("stock = stock - 1") // set stock = stock - 1,代表库存-1
.eq("voucher_id", voucherId) //找到对应的商品来扣减库存
.gt("stock",0) // 库存大于0才能扣减
.notExists("select * from tb_voucher_order where user_id = " + userId + " and voucher_id = " + voucherId )
.update();
但是,直接拼接SQL字符串是不安全的。因此,需要使用MyBatis Plus的占位符功能。MyBatis Plus的占位符使用{索引}的形式,其中索引表示参数的位置。以下是使用占位符的代码示例:
.notExists("select * from tb_voucher_order where user_id = {0} and voucher_id = {1}", userId, voucherId)
在发送SQL时,MyBatis Plus会以预编译的形式发送:
UPDATE tb_seckill_voucher
SET stock = stock - 1
WHERE (voucher_id = ? AND stock > ? AND NOT EXISTS (select * from tb_voucher_order where user_id = ? and voucher_id = ?))
Parameters: 4(Long), 0(Integer), 1010(Long), 4(Long)
总结
本文通过一个实际案例,介绍了MyBatis Plus中占位符的使用方法。需要注意的是,本文所介绍的并发查库策略并不适用于实际生产环境,实际情境下一定不要这样高并发查库,个人测试100请求/s查库可能导致死锁。本文主要是分享一下exists需要的MyBatis Plus占位符的运用,如果大家觉得有不需要占位符的方法,欢迎在评论区讨论。
热门推荐
薛定谔的猫一般比喻什么?探讨这一物理学概念的哲理
财产基本险与综合险:法律视角下的区别解析
财产基本险与综合险条款的对比分析
发现新的证据:再次起诉的法律依据与实务操作
手部寒冷后肿胀麻木?医生教你5个缓解方法
分手后适合很快再谈恋爱吗?新旧观点
怀孕期间如何避免高糖饮食?怀孕食谱中的糖分控制策略
新指南发布!营养被纳入肥胖症预防、治疗和干预过程中
分期乐还款攻略:一次性还清、免息政策及提前还款流程详解
烤箱健康还是空气炸锅健康?您喜欢用哪一个?
精益生产中的持续改善理念如何在实际工作中得到落实?
如何高效进行项目进度工作汇报?掌握这些技巧让你事半功倍
为什么水在常温下也会蒸发?
膈肌:人体呼吸的「幕后英雄」
胰岛素集采中标结果出炉!49个品种中标,中选率92%
城阳区年货大集启动——面食店两周卖出5万斤枣饽饽
如何用人工智能高效学习
长白山机场迎客流高峰:单月旅客吞吐量破18万人次,创历史同期新高
OSCP认证:网络安全领域的敲门砖
怎样认定农村集体经济组织成员资格
推特官网twitter芋圆呀呀,网友:觉得就像在吃网络的甜点
逸剑风云决攻略,全支线任务全结局攻略,地图指引
凯基证券:台股探底危机解除,中长线布局看好七大板块
电车120km/h续航排名:SU7第一,极氪001比MEGA费电,华为系倒数
了解PO膜和PE膜的区别,让你少走弯路
风紧扯呼在商业中意味着什么?
什么是带押过户?带押过户与普通过户有何不同?
科普|冠状动脉的“秘密”:一次CTA检查,揭开心脏健康的神秘面纱
华为起诉小米专利侵权 后者反击无效!为何双方握手 知识产权局全文讲述
从小米与华为之间的专利纠纷中观看高科技企业的攻防策略