MyBatis的Insert和Update默认返回的是什么?

为什么会提出这个问题

为什么会提出这个问题?
现有一个文章点赞需求,需要保证表一个用户只能给一篇文章点赞,每个用户每种点赞类型对应一条,在不适用分布式锁的情况下,我们采用了在INSERT语句中添加 唯一索引 来保证唯一性,但是,MyBatis返回的值却让我们有点懵。

1.什么是唯一索引(Unique Index)

简单的说,我们需要保证某个数据列(Column)或者某几个数据列(Columns)的唯一性,那么我们可以使用唯一索引来保证他的唯一性,因为 MySQL 会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL 将拒绝插入那条新记录。同时,唯一索引也有他作为索引查询快的特点,既提高了访问速度,又能避免数据出现重复。

2.创建唯一索引

这个就很简单了,执行创建语句就完成了。这里我们需要保证点赞类型,用户id,点赞对象唯一。

ADD UNIQUE INDEX `idx_test`(`user_like_type`, `user_id`, `liked_object_id`) USING BTREE;

3.使用Navicat工具插入数据

这里使用Navicat工具,插入一条SQL
这里 这几个字段表示(点赞类型,点赞的对象的id,用户id,点赞状态(0:未点赞 1:已点赞)),这里默认点赞的状态是1 ,如果重复点赞,状态还是1
点赞表插入
这里显示message:Affected rows 1.Time:0.058000s,说明受影响的行是1行
然后,我再次运行这条SQL。
重复执行SQL
这个时候,我们发现,插入失败了,受影响的行是0 行。说明没有插入成功。

4.在MyBatis的返回情况

我们在新建一个点赞的对象,将其插入
新创建一个对象
断点后,如图所示,结果入预料的,“受影响的1行?”
使用idea debug第一次
紧接着,我们在运行一次,在debug看下
使用idea debug第二次
怎么又插入了一条?!赶紧上数据库看看。
然而只有我们刚刚插入的一条
这到底是怎么回事
由此可见,Mybatis返回的并不是影响的行数。
百度后,是匹配的数量。
至于为什么是匹配数量,这个暂时还需要看源码后确定。

5.业务问题解决

我们回到点赞的问题,如果返回的数值都是1,我们怎么才知道,这条记录到底插入成功没呢,是否是恶意的重复插入呢。
这个时候,我们可以借助一个返回的主键来判断,在mapper里面修改如下,keyProperty=你的id。
在这里插入图片描述
如果是初次插入,那么他会正常返回id,如果该记录以及生成了,那么他不会返回id。具体,我们再把刚才的数据再插入一次
业务问题解决
再次运行,然后debug,若能够进入断点,那么说明我们的判断就是正确的。
验证成功
正如我们所预料的,那么,可以判断此次插入,是属于重复插入或者是失败插入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值