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转为rowIndexint rowIndex = PageCalculator.calculateRowIndex(pageIndex, pageSize);//        调用办法获取shopList,countList<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_nameFROM tb_shop s, tb_area a, tb_shop_category scWHERE 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_idORDER BY s.priority DESC-- LIMIT 1,3LIMIT 0, 3

LIMIT 0, 3这才是正确的分页参数。依照LIMIT 1,3这个形式天然查不出数据。

⚠️本次问题最终是通过手动复制 mapper的查问代码到数据库管理软件(Navcat)中进行查问验证是否查问sql有问题。因而为解决相似问题提供了一个思路:有问题从三层思考:前端申请,业务解决,数据拜访(sql语句) 。

相干参考

  • https://www.yiibai.com/sql/sq...
  • https://blog.csdn.net/liu_fen...