首页 > 技术文章 > Oracle与Mysql分页的区别

myh520it 2020-03-06 17:15 原文

前言

  从去年的12月开始,小故就一直没更博客,主要还是因为时间管理不当(懒),在当时想要跟大家分享一个东西,可是没有及时整理,导致过后就会很快的遗忘重点,第二天或许又会有新的东西打乱原先的思维。话不多说,回归正题。

 正文

  因为之前在项目中比较少接入oracle,做的项目中即使用到了,更多做的也是结算相关的业务,管理系统这块应该说算是重新操刀了吧。刚做分页的时候,还是用回mysql的习惯limit去解决,后来发现不起作用。百度了一下,说是用rownum是可以用来解决oracle分页的特殊方法,代码如下图一:

  这种做法是没有问题的。那么问题来了各位,这也是我想写这篇博客的原因,管理系统中分页是绕不开的话题(当然如果有朋友直接用包米豆(baomidou)封装好的Page做法那就另说了),这种写法下,我们都知道直接在 where后面加上查询条件,然后再拼接分页语句即可。如下图二

  这样是错的,你会发现加上条件查询不但分不了页,而且查不回数据。原因是上述做的rownum的别名rn(这个必须要有)被限制了,当你加了条件后,库中找到那个条件对应的数据并不是rn对应的第一条数据,即rn不等于1了。所以导致rn后面的分页条件不成立。  区别于mysql的是,mysql并不需要rownum这一个关键字来做模拟的分页,所以即使加上条件也可以用limit关键字去限制pageSize(太简单,不放图了)。所以对于这个问题,我去查了百度,什么的都有,拼接sql等等。后面觉得自己来,其实我们的思维可以是这样,既然加了条件之后,rn所对应的数不是规则的从1-10了,那我们可以从rn入手,即使是加了条件,再重新排列条件后的数据是1-10,有了这个思维咱就直接上 图三

   是不是感觉没变化,再对比图二和图三看看,思维对了就很简单了。只需要把<include refid="where_sql" />(你的查询条件)放到括号内即可。但是又出现新的问题了:

那你不能开两个接口给前端了,一个列表页,一个搜索页,这样搞前端设计就不合理了。那其实可以在同一个接口内加个判断,有条件过来的话,走图三;不加条件,走图一,即可解决了。

 总结

  又到了周五,在工位闲了想找点事做,就赶在下班前赶紧写了好今晚可以打打游戏冲冲浪哈哈哈。有三个多月没更新博客了,疫情过后更新博客关于java内容的或许会慢慢减少,当然是不出意外的情况。身边总会有很多想要跳槽的,小故是幸运的,在当今大环境不好的情况下,能有转行的机会,实属珍贵且珍惜,愿自己成功。网上总说,如今已不再是闷头做程序猿的时代,但小故认为,如今是一个需要程序猿偶尔抬抬头,看看这时代需要的新技术、该具备的思维,再闷头不断学习的、成为一个"全能”的程序猿的时代。

 

 

 

 

 

 

 

推荐阅读