目录
前言
前一阵子学了springboot项目对数据库表的分页操作在前端的部署,一直没有整理它,最近看到一个java面试题问的是这个,发现自己已经忘的差不多了,写篇文章整理一下
介绍
在一个前端页面中,如果有很多数据需要展示的情况下,一个页面放不下,就需要有分页操作,
既然数据多了,想要找某条数据,就需要根据条件查询数据的操作,本片文章只讲后端代码实现,会从三层架构入手,不讲述前端api对接
分页查询
详解
准备工作:
首先,在springboot项目中,我们的Controller层返回的结果都是我们人为定义的Result,前端接收到这个Result后,会对这个信息进行分析,然后做出相应的行为,因此我们想要实现分页操作,就需要将数据在数据库中先实现分页,然后查询要展现的页的信息交给Result返回即可,交给Result的数据,我们可以把它规定为一个类PageBean
这个类里边只有两个属性,一个total,代表一共有几条数据,一个rows,是List集合类型,代表这个页面的数据
注:这个类里边的属性,需要根据前端设计的页面去写,不是固定的,前端需要这个页面的什么信息,PageBean类里就应该有什么信息,因为在分页操作时,总会展示一共有几页,因此我设置了一个total,其实只有一个rows传递给Result再传递给前端就能够展现出数据了
有了这个类之后,我们下边就从三层架构拆分所有步骤
一:Controller层的实现
我们在上边已经梳理的很明白了,在Controller层,我们需要做的是
接收前端的信息,要查询第几页的数据,然后把这个数据响应出去
第一步:接收数据
需要知道,前端想要展现数据,得告诉后端,要展示第几页,每页展示几条数据,如果前端没有传递,我们就通过@RequestParam设置一个默认值
第二部:响应数据
不用管pageSize后边的字段,是我们最后要说的
调用Service层,返回一个PageBean类,然后将这个PageBean类作为信息,传递给Result,最后返回
二:Service层的实现
由Controller层可知,Service层需要一个page类,返回值是PageBean
这一层是逻辑实现层,我们知道,最后的Dao层对数据库进行操作时,想要实现分页,我们需要知道两个参数,每页几条数据(PageSize)和起始索引,因此我们在Service层需要根据page和pageSize求一下起始索引
三:Dao层的实现
在Mapper类中,对数据库进行操作
操作分为两步:
1:得到数据一共有几条
2:查询哪一页数据,返回这个页所有的数据
这就实现了分页操作
梳理
首先在Controller层接收前端的请求,知道要查询第几页page,每页几条数据pageSize,传递给Service层实现逻辑处理
然后在Service层,由page和pageSize计算出在数据库中查询的起始索引start,再把start和pageSize传递给Dao层
最后在Dao层,通过SQL语句的limit的用法,查询出来这页数据,返回给Service层,Service层再返回给Controller层,Cintroller层将这个页面信息,先交给Result,再由Result响应给前端
如果前端页面需要数据的总个数,在Page类中加上count属性,并在Service层和Dao层多一步求数据总个数的操作即可
PageHelper
分页操作的Service层和Dao层的操作,其实是死的,因为,不管对哪个表进行分页操作,其实代码是相差不大的
步骤很固定,而实现又很繁琐,因此就有了PageHelper这个插件,来简化操作
首先要去下载这个插件
下面我说一下它简化了哪些步骤
1:在Dao层,不需要再求数据总个数,这个操作插件已经帮我们做了,而且在完成数据库分页操作时,也不需要再传递参数,直接查询即可,因为插件也已经帮我们做了
在Dao层,只需要写这简短的两句即可
2:在Service层
在Dao层我们只执行普通的查询语句,并且没有传递参数,PageHelper怎么知道我们每一页规定多少条数据,要返回第几页的数据呢
这些操作就需要在Service层中去实现
通过方法,PageHelper.startPage传递page和pageSize两个参数
这个方法底层就实现了计算起始索引,并知道了要查询第几页的数据,每一页有几条数据,相当于我们上边所写的三句
注意:通过PageHelper得到的结果,是PageHelper的封装类Page的集合(即List<Emp>其实是Page<Emp>)这就与我们Dao层方法返回值的类型不同了,因此,我们需要强转将其转换为Page,再通过里边的方法getTotal和getResult来分别获取数据总数和查询返回的结果
条件分页查询
在上边我们已经实现了分页操作,下边我们再来讲一下,根据指定的条件查询数据的操作
其实就是在分页操作的基础上又添加一个功能而已
在Controller层中,我们此时不仅需要分离操作需要的参数,还需要用户输入的,查询的字段
注:如果是日期或时间,需要设置一下格式,然后传给Service层
在Service层,其实就在调用Dao层时,将要查询的字段,作为形参传递给Dao层,由Dao层对数据库根据这些字段进行查询操作
在Dao层,我们最好使用xml配置文件的方式,而不使用注解来处理
因为当用户没有使用查询操作时,这时要展现的就是全部数据,只有当使用时,才根据条件进行查询,因此这里通过标签使用动态SQL是最合适的
本文章为个人所感所想,请勿转载,如有问题,请及时与我讨论
——迷糊小白告