分页

使用Spring Data JPA进行数据分页与排序

拥有回忆 提交于 2019-12-03 22:28:24
一、导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好。所以处理较大数据查询结果展现的时候,分页查询是必不可少的。分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控制,导致用户可能在不同的页看到同一条数据。那么,本文的主要内容就是给大家介绍一下,如何使用Spring Data JPA进行分页与排序。 二、实体定义 我们使用一个简单的实体定义:Article(文章) @Data @AllArgsConstructor @NoArgsConstructor @Builder @Entity @Table(name="article") public class Article { @Id @GeneratedValue private Long id; @Column(nullable = false,length = 32) private String author; @Column(nullable = false, unique = true,length = 32) private String title; @Column(length = 512) private String content; private Date createTime; } @Entity 表示这个类是一个实体类,接受JPA控制管理,对应数据库中的一个表

drf分页功能

孤街醉人 提交于 2019-12-03 18:15:31
day81 drf 内容回顾和补充 什么是restful规范 是一套规则,用于程序之间进行数据交换的约定。 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不同做不同的操作,比如:get/post/delete/put/patch/delete. 初次之外,resetful规范还规定了: - 数据传输通过json 扩展:前后端分离、app开发、程序之间(与编程语言无关) JSON: { name:'alex', age:18, gender:'男' } 以前用webservice,数据传输格式xml。 XML <name>alex</name> <age>alex</age> <gender>男</gender> 什么是drf? drf是一个基于django开发的组件,本质是一个django的app。 drf可以办我们快速开发出一个遵循restful规范的程序。 drf如何帮助我们快速开发的?drf提供了那些功能? - 视图,APIView用处还不知道。 - 解析器,根据用户请求体格式不同进行数据解析,解析之后放在request.data中。 在进行解析时候,drf会读取http请求头 content-type. 如果content-type:x-www-urlencoded,那么drf会根据 &

分页功能的实现

為{幸葍}努か 提交于 2019-12-03 17:07:21
实现分页功能实际上是使用 select 语句对查询结果进行限制,用到了 limit 子句 例如,我们新建一张表如下: 执行 select * from products limit 4; 就会对结果进行限制输出。为了显示剩下的, 执行 select * from products limit 4,4; 它表示从行4往后取4行。 分页 的实现就是 : select * from xx limit x,y y表示当前页面显示几条记录。 x与当前页码有这样的关系:x=(当前页码-1)* y. 例如:50条数据分10页,每页5个, 使用sql 语句来限制输出: 第i页 x y 1 0 5 2 5 5 3 10 5 按照这样的关系就可以实现分页了! 来源: https://www.cnblogs.com/liu-chen/p/11804146.html

主流数据库分页查询介绍

末鹿安然 提交于 2019-12-03 14:47:38
1 背景概述 由于在项目中需要在页面上显示数量非常多的数据, 在进行数据库查询时首先会把所有的数据都查询出来,然后在进行显示,这时候分页查询的操作就必不可少了,本文介绍Mysql、Oracle、sql Server 三种数据库进行分页查询的用法。 2 预期读者 数通畅联内部员工 广大计算机爱好者 3 名词解释 分页查询 就是将将过多的结果在有限的界面上分多页来显示,一般将分页查询分为两类:逻辑分页、物理分页。 逻辑分页 是在用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大集合中,然后存放在session对象,再通过页码计算出当前页需要显示的数据内容,存储到一个小的list的集合中,并将其存储到request对象中,跳转到JSP页面,进行遍历显示。 当用户第二次访问时,只要不关闭浏览器,还会从session中获取数据,来进行显示。因为此种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的,所以叫做逻辑分页。 缺点:如果需要查询的数据量过大,session将耗费大量的内存;因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的。 优点:统一代码处理方式,较容易跨数据库做迁移。 物理分页 ,使用数据库自身所带的分页机制,例如,Oracle数据库的rownum

API做翻页的两种思路

纵然是瞬间 提交于 2019-12-03 14:39:30
转自: https://www.cnblogs.com/cgzl/p/10706881.html 在开发API的时候,有时候数据太多了,就需要分页读取。 基于偏移量的分页(Offset-based) 这种方式就是会提供一个每页笔数(page size)来定义返回条目的最大数,提供一个页数(page number)来表示从哪里开始读取数据。 例如: 1 SELECT * FROM "CampusResumes" ORDER BY "Name" DESC LIMIT 5 OFFSET 10; 这句话的意思就是从该表中读取数据,按照Name字段降序排序,从第10笔数据后开始读取,一共读取5笔(可能不足5笔)。 这就相当于page size = 5,page number = 3的分页读取。 Offset-based分页方式实现起来非常的简单,对用户来说体验也比较好。但是还有有一些劣势的: 对于大规模的数据集,效率不够高。 因为数据库需要进行count和skip操作。 如果数据经常发生变化,那么结果不可信。 在查询的时候如果插入或删除了数据,那么某条数据可能会出现两次或者翻页的时候越界了。 在分布式系统中实现起来略麻烦。 这种情况下,你可能需要扫描不同的数据碎片,然后才能得到想要的数据。 总体来说,当允许结果出现误差的时候,Offset-based分页还是很好用的。 基于游标的分页

原生 JS实现一个简单分页插件

依然范特西╮ 提交于 2019-12-03 14:31:35
最近做的一个 PC 端的需求,这个需求中有一个小点,页面底部有一块列表区域,这个列表的数据量比较大,需要进行分页控制,切换页码的时候,发送一个 ajax 请求,在页面无刷新的情况下,实现列表数据的刷新,所以就涉及到了前端分页功能,到网上看了一圈,发现那些开源的相关插件要么有各种依赖,要么太复杂用不上,要么上手有点困难,所以就想着应该也不太难,自己写个得了。 关于这种分页功能,平时很常见,不过需要自己动手做的需求却很少,所以一直停留在知道应该就是那么回事,但实际上自己从来没怎么探究过的层面上,知道应该会涉及到一些逻辑判断,不会实现起来应该没什么难度,然而,真的等到自己着手实现的时候,才知道什么叫想得美。 简单介绍 先上效果图: 有点类似于 Github 搜索结果页的底部分页,可能部分逻辑有点出入,但总体应该差不多 代码使用 ES6 语法,这个插件其实是一个 class , babel 打包后可兼容到 IE9 ,原生js无任何依赖。 整个插件类代码 SimplePagination 加上空行注释什么的共约 200 行左右,不过其中有部分代码是辅助代码,例如初始化、选择器、增删类等方法,再除去空行注释,最后剩下的核心代码也就不到 100 行的样子。 主要的判断逻辑都在 gotoPage 这个方法中,因为需要考虑到各种情况,所以里面写了很多的 if.. else... 判断

分页Model

孤街浪徒 提交于 2019-12-03 14:28:08
<?php namespace Admin\Model; use Think\Model; class PageModel extends Model{ /* *此函数分页函数。传入表名和当前页,返回 总页数,总条数 底标的分页的数组 */ public function index($tableName,$page,$where,$prefix_page, $sql = '', $add_one_flag = false){ $tables = M($tableName); //第一返回总条数 if($sql){ $tmp = $tables->query($sql); $data['count'] = $tmp[0]['count_num']; }else{ if($where){ $data['count']=$tables->where($where)->count(); }else{ $data['count']=$tables->count(); } } if($add_one_flag === true){ $data['count'] += 1; } $page_step = C('PAGE_NORMAL_COUNT'); //第二返回总页数 $data['page_all']=(int)ceil($data['count']/$page_step); /

RestFramework的过滤组件 和 分页组件

…衆ロ難τιáo~ 提交于 2019-12-03 10:07:23
群查接口各种筛选组件数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16, unique=True, verbose_name='车名') price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格') brand = models.CharField(max_length=16, verbose_name='品牌') class Meta: db_table = 'api_car' verbose_name = '汽车表' verbose_name_plural = verbose_name def __str__(self): return self.name admin.py admin.site.register(models.Car) serializers.py class CarModelSerializer(serializers.ModelSerializer): class Meta: model = models.Car fields = ['name', 'price', 'brand'] views.py # Car的群查接口 from rest

简单实用的原生PHP分页类

空扰寡人 提交于 2019-12-03 09:25:08
一款简单实用的原生PHP分页类,分页按钮样式简洁美观,页码多的时候显示“...”,也是挺多网站用的效果 核心分页代码 1 include_once("config.php"); 2 require_once('page.class.php'); //分页类 3 $showrow = 10; //一页显示的行数 4 $curpage = empty($_GET['page']) ? 1 : $_GET['page']; //当前的页,还应该处理非数字的情况 5 $url = "?page={page}"; //分页地址,如果有检索条件 ="?page={page}&q=".$_GET['q'] 6 //省略了链接mysql的代码,测试时自行添加 7 $sql = "SELECT id,content,addtime FROM wishing_wall"; 8 $total = mysql_num_rows(mysql_query($sql)); //记录总条数 9 if (!empty($_GET['page']) && $total != 0 && $curpage > ceil($total / $showrow)) 10 $curpage = ceil($total_rows / $showrow); //当前页数大于最后页数,取最后一页 11 //获取数据 12 $sql .

Mysql的limit优化方案解析

我怕爱的太早我们不能终老 提交于 2019-12-03 07:02:33
MySQL的分页查询通常通过 limit 来实现。 MySQL的 limit 基本用法很简单。 limit 接收1或2个整数型参数,如果是2个参数,第一个是指定第一个返回记录行的偏移量,第二个是返回记录行的最大数目。初始记录行的偏移量是0。 疑问: 对于小的偏移量,直接使用 limit 来查询没有什么问题,但随着数据量的增大,越往后分页, limit 语句的偏移量就会越大,速度也会明显变慢。 优化思想 : 避免数据量大时扫描太多的的记录 解决 : 子查询的分页方式或者JOIN分页方式。 JOIN分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。 下面举个例子。一般MySQL的主键是自增的数字类型,这种情况下可以使用下面的方式进行优化。 下面以真实的测试环境的100万条数据的一张表为例,比较一下优化前后的查询耗时: -- 传统limit,文件扫描 [SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2; 受影响的行: 0 时间: 5.371s -- 子查询方式,索引扫描 [SQL] SELECT * FROM tableName WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1) LIMIT 2; 受影响的行: 0 时间: 0