关于java:解决-MySQL-MyBatisPlus-分页数据重复问题

问题

有一个分页查问用户的接口,原本曾经通过测试并且上线运行了。忽然在测试环境报BUG,每一页有不同水平的数据反复,例如,第一页有张三,第三页又呈现张三了。

次要的代码如下:

PageMethod.startPage(query.getCurrPage(), query.getPageSize());
List<User> users = userMapper.pages(query);
return new PageInfo<>(users);

第一反馈是,可能 MyBatis-Plus 出问题了,或者是应用谬误了。

MyBatis-Plus 官网文档举荐的形式,和出问题的代码统一(版本不同)

//第二种,Mapper接口方式的调用,举荐这种应用形式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);

那么问题只可能呈现在SQL

剖析SQL

表构造如下:

CREATE TABLE `gov_contract_customer_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `no` varchar(50) NOT NULL COMMENT '编号',
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创立工夫',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `no_UNI_IDX` (`no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';

呈现问题的分页SQL如下:

SELECT
    *
FROM t_user
WHERE age > 20
ORDER BY create_time DESC
LIMIT 0, 10;

问题体现为 LIMIT 0, 10LIMIT 0, 50 的后果中,前10条数据不统一。

ORDER BY 子句,测试期间没有写操作,不同的分页容量,按以往教训前10条数据应该统一。那么问题可能是 create_time 的值造成的。

查问所有的 create_time 发现,所有的值全副一样。因为是测试环境,测试同学批量导入数据,所以 create_time 值都一样。

起因

如果没有 ORDER BY 子句,MySQL 不保障以任何特定程序返回。咱们可能会察看到相似默认排序的可反复后果,但 MySQL 没有对此做出保障,所以这是不牢靠的。

ORDER BY 子句用于排序的值全副雷同时,会造成和没有 ORDER BY 子句一样的后果。

解决方案

SELECT
    *
FROM t_user
WHERE age > 20
ORDER BY create_time DESC, no ASC
limit 0, 10;

减少排序字段,防止无奈排序字段值全副雷同。最好应用有惟一束缚的字段作为排序根据。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理