author: Nathannie
date: 2022-04-16-22:58


问题背景

学习SSM项目,目标是点击前端店铺二级分类按钮,获取此分类对应shopCategoryId下的所有店铺信息列表,但点击无果,一直停留在等待刷新页面,解决甚久,花费一下午。

报错信息

报错截图:

image.png

问题分析

一直等待刷新,猜想获取不到数据,借此机会,决定从头到尾的研究一下此功能的实现过程,最后发现确实是获取不到数据,但不是没有数据,而是获取方式错误。
此分类下的内容需要分页展示(以动态刷新的方式),设置分页逻辑代码编写错误,使得获取的数据的索引(Index)超过真实数据(index)范围。

回顾分页逻辑:

rowIndex = (PageIndex-1) x PageSize

即表示按所需分页页数分页单页数据个数得到的某页的首个数据项所在的索引位置。通俗来说,按照每页PageSize个数据项,获取第PageIndex页的第一个数据项的索引位置表示。
图示:

image.png

⚠️注意: 页数是按照,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

经过上述分析,实际数据库中数据只有一条:
image.png
按照错误代码的查询方式,则是“从第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语句) 。

相关参考


nathannie
15 声望1 粉丝

better and better, day by day.


引用和评论

0 条评论