共计 1815 个字符,预计需要花费 5 分钟才能阅读完成。
author: Nathannie
date: 2022-04-16-22:58
问题背景
学习 SSM 我的项目,指标是点击前端店铺二级分类按钮,获取此分类对应 shopCategoryId 下的所有店铺信息列表,但点击无果,始终停留在期待刷新页面,解决甚久,破费一下午。
报错信息
报错截图:
问题剖析
始终期待刷新,猜测获取不到数据,借此机会,决定从头到尾的钻研一下此性能的实现过程,最初发现的确是获取不到数据,但不是没有数据,而是获取形式谬误。
此分类下的内容须要分页展现(以动静刷新的形式),设置分页逻辑代码编写谬误,使得获取的数据的索引(Index)超过实在数据(index)范畴。
回顾分页逻辑:
rowIndex = (PageIndex-1) x PageSize
即示意按所需 分页页数 和分页单页数据个数 失去的某页的首个数据项所在的索引地位。艰深来说,依照每页 PageSize 个数据项,获取第 PageIndex 页的第一个数据项的索引地位示意。
图示:
⚠️留神:页数是依照,1,2,3.. 的逻辑开始,而行数(索引)是依照 0,1,2,3… 的逻辑开始,所以索引为
0
的行,事实中的了解逻辑为第1
行,索引为3
的行,事实了解逻辑为第4
行。
上述图的索引为 5
的行,事实逻辑就为第 6
行。
上述算法能够由 RowIndex,pageSize 失去 PageIndex(第几页),由 PageSize,PageIndex 失去 PageIndex 页的首行数据项索引(在所有数据中占第几行)。
问题解决
次要起因是转化算法,参数写错了
谬误的代码:
// 将 pageIndex 转为 rowIndex
int rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);
// 调用办法获取 shopList,count
List<Shop> shopList = shopDao.queryShopList(shopCondition, PageIndex, pageSize);
↑
这里应该是计算后的 rowIndex
正确的代码:
// 将 pageIndex 转为 rowIndex
int rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);
// 调用办法获取 shopList,count
List<Shop> shopList = shopDao.queryShopList(shopCondition, rowIndex, pageSize);
上述 pageIndex
,pageSize
是前端传递的参数,这里为1
,3
。
通过上述剖析,理论数据库中数据只有一条:
依照错误代码的查问形式,则是“从第 2 行数据开始,查问 3 条数据”显然是没有的(没有第二行,也没有三个数据)
查问代码:
SELECT s.shop_id, s.shop_name, s.shop_desc, s.shop_addr, s.phone
, s.shop_img, s.priority, s.create_time, s.last_edit_time, s.enable_status
, s.advice, a.area_id, a.area_name, sc.shop_category_id, sc.shop_category_name
FROM tb_shop s, tb_area a, tb_shop_category sc
WHERE s.shop_category_id = 22
AND s.shop_category_id IN (
SELECT shop_category_id
FROM tb_shop_category
WHERE parent_id = 12
)
AND s.shop_category_id = sc.shop_category_id
AND s.area_id = a.area_id
ORDER BY s.priority DESC
-- LIMIT 1,3
LIMIT 0, 3
LIMIT 0, 3
这才是正确的分页参数。依照 LIMIT 1,3
这个形式天然查不出数据。
⚠️本次问题最终是通过手动复制
mapper
的查问代码到数据库管理软件 (Navcat
) 中进行查问验证是否查问 sql 有问题。因而为解决相似问题提供了一个思路:有问题从三层思考:前端申请,业务解决,数据拜访(sql 语句)。
相干参考
- https://www.yiibai.com/sql/sq…
- https://blog.csdn.net/liu_fen…