MyBatis的Insert和Update默认返回的是什么?
- 为什么会提出这个问题
- 1.什么是唯一索引(Unique Index)
- 2.创建唯一索引
- 3.使用Navicat工具插入数据
- 4.在MyBatis的返回情况
- 5.业务问题解决
- **谢~谢~观~看~**
为什么会提出这个问题
为什么会提出这个问题?
现有一个文章点赞需求,需要保证表一个用户只能给一篇文章点赞,每个用户每种点赞类型对应一条,在不适用分布式锁的情况下,我们采用了在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。
这个时候,我们发现,插入失败了,受影响的行是0 行。说明没有插入成功。
4.在MyBatis的返回情况
我们在新建一个点赞的对象,将其插入
断点后,如图所示,结果入预料的,“受影响的1行?”
紧接着,我们在运行一次,在debug看下
怎么又插入了一条?!赶紧上数据库看看。
然而只有我们刚刚插入的一条
由此可见,Mybatis返回的并不是影响的行数。
百度后,是匹配的数量。
至于为什么是匹配数量,这个暂时还需要看源码后确定。
5.业务问题解决
我们回到点赞的问题,如果返回的数值都是1,我们怎么才知道,这条记录到底插入成功没呢,是否是恶意的重复插入呢。
这个时候,我们可以借助一个返回的主键来判断,在mapper里面修改如下,keyProperty=你的id。
如果是初次插入,那么他会正常返回id,如果该记录以及生成了,那么他不会返回id。具体,我们再把刚才的数据再插入一次
再次运行,然后debug,若能够进入断点,那么说明我们的判断就是正确的。
正如我们所预料的,那么,可以判断此次插入,是属于重复插入或者是失败插入。
谢谢观看