背景:原先是一次性查询加载到前段,表格插件自动分页,最近查询的数据量越来越大,长的时候需要等好几十秒,决定自己写一个后端分页,我写的和网上大神的略有不同,不是后端写一个类封装分页的参数,每次查询都是穿当前页码和查询行数,详见下文:

步骤:

首先实习分页,思路要理清,其实分页很简单,实习方式也有很多种,首先几个参数是必须的

后端需要的参数:

1:当前查询的页数

2:每页显示的行数

前端需要的参数:

总行数

一:前端修改:

前端我用的是原始的html标签构成几个基本的分页功能,再绑定具体的点击事件,改变事件

<style>
.dss_table_page{margin:0;padding:0;font-family:"Microsoft YaHei",Verdana;font-size:12px;height:30px;line-height:30px;width:100%;user-select: none;-ms-user-select: none;vertical-align:middle;border-top:solid 1px #ccc;margin-top:-1px;}
.dss_table_page div.dss_table_page_oper{width:320px;float:left;margin-left:10px;margin-top:3px;padding:0px;}
.dss_table_page div.dss_table_page_oper span{display:inline-block;margin:0 5px 0 0;padding:0px 6px;line-height:20px;height:20px;border:1px solid #e1e1e1;background:#fff;color:#333;text-decoration:none;cursor:pointer}
.dss_table_page div.dss_table_page_oper span.first_1{background-image:url('../../themes/lightblue/jqgrid/images/left1_a.png');background-repeat:no-repeat;background-position:center center}
.dss_table_page div.dss_table_page_oper span.prev_1{background-image:url('../../themes/lightblue/jqgrid/images/left2_a.png');background-repeat:no-repeat;background-position:center center}
.dss_table_page div.dss_table_page_oper span.next_1{background-image:url('../../themes/lightblue/jqgrid/images/right2_a.png');background-repeat:no-repeat;background-position:center center}
.dss_table_page div.dss_table_page_oper span.last_1{background-image:url('../../themes/lightblue/jqgrid/images/right1_a.png');background-repeat:no-repeat;background-position:center center}
.dss_table_page div.dss_table_page_oper span input{width:30px;height:17px;border:1px solid #e1e1e1;line-height:16px;margin-top:1px;}
.dss_table_page div.dss_table_page_oper span select{width:50px;height:22px;border:1px solid #e1e1e1;line-height:22px}
.dss_table_page div.dss_table_page_oper span.none{border:0px}
.dss_table_page span.sum{float:right;margin-right:10px} </style>
<div id="report_0tp" role="w" class="dss_table_page">
<div class="dss_table_page_oper">
<span class="first_1">&nbsp;</span>
<span class="prev_1">&nbsp;</span>
<span class="none" id="countpage"><input id="curpage" type="text" value="1">
<a style="text-decoration:none;color:black" id="addcount"><a></span>
<span class="next_1">&nbsp;</span>
<span class="last_1">&nbsp;</span>
<span class="none">
<select id="displayrow">
<option value="20" selected="selected">20</option>
<option value="50">50</option>
<option value="100">100</option>
</select></span>
</div>
<span class="sum" id="countrow"></span></div>

效果:

js写了一个方法,用来获取总页数和总条数,初始化分页信息,记住,三个时机调用这个方法,一是页面初始化的时候,二是每次查询的时候,三是改变那个每页显示的条数的下拉框数值的时候

initpaging: function () {
//获取总行数
$.ajax({
url: dss.rootPath + "plugin/sjwfx/getPortUAPCount",
data: {},
async: false,
beforeSend: function () {
dss.load(true);//开始“数据正在加载”的进度条
},
complete: function () {
dss.load(false);//隐藏“数据正在加载”的进度条
},
success: function (data) {
var datacont = data.data.rows[0].cells[0];
parame.datacont=datacont;
}
});
//设置总计多少行
$("#countrow").text("共"+parame.datacont+"条");
//获取每页显示行数的值,默认是20
var opt = $("#displayrow option:selected").text();
//设置共多少页数
var yeshu = parame.datacont/opt+1;
yeshu = Math.floor(yeshu);
parame.yeshu=yeshu;
$("#addcount").text("共"+yeshu+"页");
}

这个地方有几个坑,记住别踩:

1:页面写HTML标签时候,默认就是当前第一页,每页查询20条数据

2:ajax请求数据不要异步的,async: false,,至于为什么这么做,因为我的后台没有传参,用的是上次数据查询的参数,如果是异步的,那么我的分页初始化的方法不会等到ajax执行完,那么参数分页之后显示的参数就是NAN

3:几个按钮的作用和需要控制的东西,一定要弄清,一共6个事件,四个点击事件,分别跳到第一页,最后一页,上一页,下一页,2个改变事件,改变当前页,改变每页显示的条数,具体看代码

                //绑定四个小按钮的点击事件
$(".first_1").click(function(){
//获取当前页数
var pagenum = $("#curpage").val()+1;
$("#curpage").val(1);
method.getDetailed();
//alert("跳到首页");
});
$(".prev_1").click(function(){
//获取当前页数
var pagenum = $("#curpage").val()-1;
if(pagenum<1){
$("#curpage").val(1);
method.getDetailed();
}else{
$("#curpage").val(pagenum);
method.getDetailed();
}
//alert("跳到上一页");
});
$(".next_1").click(function(){
//获取当前页数
var pagenum = $("#curpage").val();
pagenum = parseInt(pagenum)+1;
if(pagenum>parame.yeshu){
$("#curpage").val(parame.yeshu);
method.getDetailed();
}else{
$("#curpage").val(pagenum);
method.getDetailed();
}
//alert("跳到下一页");
});
$(".last_1").click(function(){
$("#curpage").val(parame.yeshu);
method.getDetailed();
//alert("跳到最后一页");
});
//绑定下拉框的改变事件
$("#displayrow").change(function(){
var opt2 = $("select option:selected").text();
method.getDetailed();
method.initpaging();
});
$("#curpage").change(function(){
var cur = $("#curpage").val();
if(cur<1 || cur>parame.yeshu){
alert("请选择合适范围的页数");
}else{
method.getDetailed();
}
//alert("跳到指定的页码");
});

二:后端修改:

后端做的比较简单,只要获取当前总页数,然后limit穿入当前页码和每页显示的行,我的思路是先让数据查询第一页,然后将传入的参数保存在当前类当中,不要limit分页的参数,然后宁外一个方法用这些参数 count(*)查询总行数返回,主要的逻辑还是在前段,后端只多做了一个返回总行数,查询数据加了一个limit。

if(opt.length()>0 && !"".equals(opt) && pagenum.length()>0 && !"".equals(pagenum)){
int opt2 = Integer.valueOf(opt);
int pagenum2 = Integer.valueOf(pagenum);
sql+=" limit "+opt2*pagenum2+","+opt2;
}

limit实现的分页查询的更多相关文章

  1. 在MySQL中如何使用覆盖索引优化limit分页查询

    背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在 ...

  2. MySQL分页查询的性能优化

    MySQL limit分页查询的性能优化 Mysql的分页查询十分简单,但是当数据量大的时候一般的分页就吃不消了. 传统分页查询:SELECT c1,c2,cn… FROM table LIMIT n ...

  3. 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

    如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

  4. mysql分页查询-limit

    分页查询的sql: select * from table limit 4,10; 4表示查询的索引,索引是从0开始,4表示从第五条数据开始查询,10表示要查询多少条数据,10表示查询十条数据 如果从 ...

  5. MySQL进阶8 分页查询(limit) - 【SQL查询语法执行顺序及大致结构】- 子查询的3个经典案例

    #进阶8 分页查询 /* 应用场景: 当要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 #7 from 表1 #执行顺序:#1 [join type join 表2 ...

  6. MySQL分页查询limit踩坑记

    1 问题背景 线上有一个批处理任务,会批量读取昨日的数据,经过一系列加工后,插入到今日的表中.表结构如下: 1 CREATE TABLE `detail_yyyyMMdd` ( 2 `id` bigi ...

  7. Mybatis的ResultMap与limit分页查询

    ResultMap主要解决的是:属性名和字段不一致 如果在pojo中设置的是一个名字,在数据库上又是另一个名字,那么查询出来的结果或者其他操作的结果就为null. //在pojo中 private S ...

  8. MySQL、Oracle和SQL Server的分页查询语句

    假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: SELECT * FROM s ...

  9. 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历

    分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...

随机推荐

  1. c程序内存模型

    这篇文章主要记录一下c程序运行时内存空间如何使用.(摘抄自网络) 在一个多任务操作系统中的每个进程都运行在它自己的内存“沙箱”中.这个沙箱是一个虚拟地址空间(virtual address space ...

  2. Python 包管理(PYPA)

    Python包的管理可以通过Python 自带的管理 工具,例如:package-autoremove,package-list-packages, package-install 等,使用起来也非常 ...

  3. 利用阿里云搭建frp实现外网远程桌面链接内网电脑

    主要应用场景:针对学生放假回家使用外网无法远程操作学校的服务器或者电脑,这里通过阿里云的云服务器搭建一个frp服务,实现内网穿透,从而可以直接通过远程桌面或者其他工具实现对校园网内的服务器或者电脑进行 ...

  4. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  5. Vue+localstrong登录注册,并保持登录状态

    在router.js中添加meta区分 比如登录注册页面,不需要登录即可进入,那么我们把meta中的isLogin标志设置为false { //登录 path: '/login', component ...

  6. 组合 数论 莫比乌斯反演 hdu1695

    题解:https://blog.csdn.net/lixuepeng_001/article/details/50577932 题意:给定范围1-b和1-d求(i,j)=k的数对的数量 #includ ...

  7. XAML控件不可访问,它具有一定的保护级别

    其它namespace的代码访问控件时会出现这个问题 需要把控件状态由protected改为public <TextBlock x:FieldModifier="public" ...

  8. Y1吐槽001 怎么做产品

    做一个产品,这个产品是做给用户用的还是做给领导看的完全是两个不同的出发点..做给领导看有好处,毕竟领导有知道进展的权利和指导方向的作用,还有一个好处就是表现得好. 忽略了使用者的感受是非常致命的,标模 ...

  9. TCP 三次握手、四次挥手

    三次握手:(主要是server.client相互同步系列号) SYN:同步序列号 ACK:确认序列号 第一次握手:client 向server 发送SYN,seq=x,申请同步client端序列号,c ...

  10. C#语言struct结构体适用场景和注意事项

    在C#语言中struct结构体和class之间的区别主要是值类型和引用类型的区别,但实际上如果使用不当是非常要命的.从Win32时代过来的人对于struct一点不感觉陌生,但是却反而忽略了一些基本问题 ...