Mybatis在设置排序后PageHelper分页插件分页第2页开始失效的问题

场景:

    一个简单的页面查询(后台用mvc+mybatis),page.html——>Controller——>Service(PageHelper ——>调用Dao查询)——>Dao(sql语句写在mybatis的DaoClassNameMapper.xml中)——>DataBase。

问题发现及过程:

    1.业务说这个页面排序,所以我首先直接在mybatis的DaoClassNameMapping.xml中的查询加了一句:"order by 排序字段 desc",结果页面分页的功能在第二页开始就没效了。

    2.我开始百度,信息梳理入下:

        2.1.网上说排序的最好用PageHelper.orderBy("字段名 排序方式DESC|ASC");设置比较好。

        2.2.而且是在调用Dao前设置进去,因为这样在mybatis查询的时候,会从Pagehelper中获取排序规则动态拼接到Mapping.xml中写的SQL中,如果自己在SQL写了排序,可能会导致PageHelper设置后动态拼接SQL出现两个"order by"失效;(我的显然不是这个问题,因为我没在PageHelper中设置排序)。

    3.问题原因:

    分页是依据起始点和偏移量的,页面每点击换页,就会重新设置起始点和偏移量来查询某一页的展示结果集,这要求排序字段唯一,我这次是按日期(某月yyyyMM)排序,因为众多数据的日期是非唯一的,所以换页之后的查询可能和换页前的查询顺序是一样的,就出问题了。

    4.解决办法:

    双字段排序,即二级排序。

    比如"order by 非唯一字段 DESC"分页失效,那么就再设置一个唯一字段的二级排序。比如"order by 非唯一字段 DESC,唯一字段 DESC"。可解决排序后PageHelper失效的问题。

    后话:

    其实PageHelper设置排序和直接在SQL写排序都是没问题的,只是不要一起使用就可以。

 

以下是参考博文

https://blog.csdn.net/kalnon/article/details/79559627

https://blog.csdn.net/qq_40995335/article/details/80845914

你可能感兴趣的:(myBatis)