热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql分页查询web_分页查询的入门打开方式(JavaWeb)

技术涵盖(JavaWeb、HTML、Ajax、JQuery、Bootstrap)接触这一部分知识的时候,我们经常会做一些小Demo来练手,不可避免的就需

技术涵盖(JavaWeb、HTML、Ajax、JQuery、Bootstrap )

接触这一部分知识的时候,我们经常会做一些小Demo来练手,不可避免的就需要接触到一定量的数据,我们常常需要将数据从数据库中回显到页面中,但是随着数据量的增加,如果不对数据的查询或者显示进行一定的处理,那么会出现各式各样的问题,例如:客户端:如果数据同时展示在一个页面中,用户体验效果比较差,操作也是极其不方便

服务端:一次请求,查询到所有的数据,数据传输量过大或导致超时或者响应速度变慢,对于服务器的负荷过大

分页方式

前端 JS 分页 - 不推荐

我们可以请求获取到所有数据后,使用 Javascript 来进行数据分页显示,单纯的在数据的显示这一方面看确实美观了很多,并且这种分页方式要比后端分页简单很多

但是如果存在一定数据量的情况下,这种方式着实有一些尴尬,他并没有解决了我们服务端的任何问题,反而会让用户在等待响应数据耗时过多,体验不佳,不过它仍然是一种分页方式

在这里我们重点讲解后端分页,所以我们简单的演示一下,也把代码贴出来,由于我们 html 中使用的是 BootStrap 前端框架,所以我们借助了 bootstrap-table 这个前端分页插件

前端 JS 分页 演示代码:

![11.1-01-003](G:\公众号\markdown文件\11-分页与条件查询\分页查询\11.1-01-003.png)

用户信息管理系统

用户信息列表

td, th {

text-align: center;

}

$(function () {

$("#userInfo_table").bootstrapTable({

url: 'user/userList',

toolbar: '#toolbar',

method: 'GET',

striped: true, //是否显示行间隔色 cache: false, //是否使用缓存 toolbarAlign: "right", //工具栏对齐方式 sidePagination: "client", //分页方式:client客户端分页,server服务端分页 search: true, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端 uniqueId: "id",

pageNumber: 1, //初始化加载第一页 pageSize: 10, //每页的记录行数 pageList: [5, 10, 15, 20], //可供选择的每页的行数 pagination: true, // 是否分页 sortable: true, // 是否启用排序 sortOrder: "asc", //排序方式 showColumns: true, //是否显示列选择按钮 showRefresh: true, //是否显示刷新按钮 clickToSelect: true, //是否启用点击选中行 // height: 500, //行高 showToggle: true, //是否显示详细视图和列表视图的切换按钮 cardView: false, //是否显示详细视图 detailView: false, //是否显示父子表 queryParamsType: '',//设置请求参数格式 queryParams: function queryParams(params) { //设自定义查询参数 /*请求远程数据时,可以通过修改queryParams来发送其他参数。如果queryParamsType = 'limit',params对象包含:limit,offset,search,sort,order。否则,它包含:pageSize,pageNumber,searchText,sortName,sortOrder。返回false停止请求。默认: function(params) { return params }*/

return params;

},

columns: [{

title: "全选",

field: "select",

checkbox: true,

width: 20, //宽度 align: "center", //水平 valign: "middle" //垂直 }, {

field: 'uid',

title: '编号'

}, {

field: 'username',

title: '用户名'

}, {

field: 'nickname',

title: '昵称'

}, {

field: 'email',

title: '邮箱'

}, {

field: 'telephone',

title: '电话'

}, {

field: 'gender',

title: '性别'

}, {

field: 'birthday',

title: '生日'

},{

field: 'id',

title: '操作',

// width: 120, align: 'center',

valign: 'middle',

formatter: actionFormatter

}]

})

})

//操作栏的格式化 function actionFormatter(value, row, index) {

var id = row.id;

var result = "";

result += "修改";

result += "删除";

return result;

}

(二) 后端分页 - 推荐

后端分页与前端分页的最大不同就是,它不需要一次性向后端请求大量的数据,而是根据用户的设定,一次请求一定量的数据,然后将这些数据回显到页面上,后端分页也才是分页的正确打开方式,其避免了一次性从数据库获取很多数据,也可以美化前端展示效果,优化用户体验

后端分页的实现方式

(一) 整体分析

根据我们上面所讲的,我们需要的就是前端向后端提交请求,后端响应前端需要的数据,并且展示在前端页面中

前端页面中,我们自然需要一个分页条

我们根据需要大致改造一下,增加一个首页和末页,同时增加一个页数以及数据记录统计文字

我们数据涉及到的问题基本就是上图以及响应数据在表格中的回显

① 响应的数据,自然我们需要 将后端所传来包含 用户信息的 list 集合进行遍历回显即 需要接收并处理一个 List集合

② 总记录数,经后台在数据库查询后给出值即 需要一个int totalCount 变量 (变量名自行决定)

③ 总页码,可以根据总记录数以及每页展示的条数计算出(后面具体讲)即 需要一个 int totalPage 变量

④ 当前页码,根据当前页码可以让后台知道你需要的数据是哪些即 需要一个 int currentPage 变量

⑤ 每页展示的条数,这个值可以暂时写为固定的,改进时,可以交给客户端选择,并且提供给后端即 需要一个 int pageSize 变量

⑥ 每次查询的起始位置,每次查询时通过 LIMIT 语句进行限制,可以结合每页显示的条数得出即 需要一个 int start 变量

(二) 后端实现

(1) 分页对象

由于前端需要接收到后台传来的需要数据信息,我们可以为上面我们简单分析出所需要的东西,集合成一个分页对象,方便我们的数据传递

//为方便后期调用,加上泛型 public class PageBean {

private int totalCount;//总记录数 private int totalPage;//总页数 private int currentPage;//当前页码 private int pageSize;//每页显示的条数 private List list;//每页显示的数据集合 ​

//省略对应构造,get set方法 ​

}

(2) Servlet 代码首先需要获取到前端传来的: currentPage、pageSize 两个 String 类型的值

如果前端不传递,默认设置 这两个变量的值,若传递值合理,则将其类型转为 int 型(前期可以先忽略这个,或者在前端设置校验)

调用 service 查询 PageBean 分页对象,并接收其返回值

将PageBean对象序列化为 json 格式,返回

@WebServlet("/route/*")

public class RouteServlet extends BaseServlet {

/*** 分页查询方法** @param request* @param response* @throws ServletException* @throws IOException*/

public void routeQuery(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

String currentPageStr = request.getParameter("currentPage"); //当前页码 String pageSizeStr = request.getParameter("pageSize"); // 每页显示的条数 ​

//当前页码,如果不传递,默认为第1页 int currentPage = 0;

if (currentPageStr != null && currentPageStr.length() > 0) {

currentPage = Integer.parseInt(currentPageStr);

} else {

currentPage = 1;

}

//每页显示条数,如果不传递,默认显示8条记录 int pageSize = 0;

if (pageSizeStr != null && pageSizeStr.length() > 0) {

pageSize = Integer.parseInt(pageSizeStr);

} else {

pageSize = 8;

}

//获取条件查询参数 Map condition = request.getParameterMap();

//调用service查询PageBean对象 RouteService service = new RoutrServiceImpl();

PageBean userPageBean = service.pageQuery(currentPage, pageSize);

//将PageBean对象序列化为json,返回 ObjectMapper mapper = new ObjectMapper();

response.setContentType("application/json;charset=utf-8");

mapper.writeValue(response.getOutputStream(), userPageBean);

}

}

说明:以上代码我抽取了Servlet,方便日后扩展方法,刚接触的朋友 直接创建一个 普通的 Servlet 直接在其中编写也是一样可以的,熟悉的朋友,请忽略我这句话

我们需要导入 jackson spring mysql druid 的相关jar包

(3) Service 代码

currentPage 和 pageSize 这两个值已经确定了,我们还需要确定的有:

总记录数 totalCount 和 总页码数 totalPage 以及需要回显到前端页面的 List 集合总记录数我们直接通过dao层查询就可以了

总页码数我们可以通过 (总记录数 / 每页显示的条数) 确定,要注意不能整除需要多出一页

查询 需要在前端页面展示的数据 list 我们需要在SQL查询中 使用 LIMIT进行限制,所以我们需要提供查询 的开始点 以及每次 查多少条,这样才能准确的找到这一页 应该是哪些数据被回显到页面中,简单的举举例就能得每一页应该从哪里开始查

即:int start = (currentPage - 1) * pageSize

public class RouteServiceImpl implements RouteService {

private RouteDao routeDao = new RouteDaoImpl();

/*** 分页查询** @param currentPage* @param pageSize* @param condition* @return*/

@Override

public PageBean pageQuery(int currentPage, int pageSize, Map condition) {

//创建pageBean对象 PageBean pageBean = new PageBean();

//设置参数 pageBean.setCurrentPage(currentPage);

pageBean.setPageSize(pageSize);

//调用dao查询总记录数 int totalCount = routeDao.findTotalCount(condition);

pageBean.setTotalCount(totalCount);

//调用dao查询List集合 int start = (currentPage - 1) * pageSize;

List list = routeDao.findByPage(start, pageSize, condition);

pageBean.setList(list);

//计算总页码 int totalPage = (totalCount % pageSize) == 0 ? totalCount / pageSize : (totalCount / pageSize + 1);

pageBean.setTotalPage(totalPage);

return pageBean;

}

}

(4) Dao 代码

/*** 根据 start pageSize 查询当前页的数据集合** @param start* @param pageSize* @return*/

@Override

public List findByPage(int start, int pageSize) {

String sql = "SELECT * FROM user_info LIMIT ? , ?";

return template.query(sql,

new BeanPropertyRowMapper(User.class), start, pageSize);

}

(三) 前端实现

文档载入完毕

$(function () {

//暂时的传递两个固定值 var currentPage = 1;

var pageSize = 8;

//在这里调用具体的功能方法 load(currentPage,pageSize);

});

function load(currentPage, pageSize){

//具体的回显代码,下面详细解释这里些什么 }

注意:以下代码均写在 load方法中

(1) ajax 异步提交

$.get("route/routeQuery", {currentPage:currentPage,pageSize:pageSize}, function (data){

//传递currentPage、pageSize到后端,同时回调函数返回一个data //下面是具体代码 })

我们下面按照这个流程顺序来进行说明

(2) 数据记录数以及总页码数统计

这一步,只要后台的代码写好了,基本不会出现太大的问题的

$("#pageCount").html("共" + data.totalCount + "条记录,共" + data.totalPage + "页");

(3) 用户信息回显

在HTML 中我们使用了 代码拼接的方式实现了这种需求,这个时候返回的 list集合中的一个User的数据被遍历显示到我们的表格中

('#userInfo_table tr:gt(0)').remove();

var s = '';

for (var i = 0; i

s += '

' + '' + '' + data.list[i].uid + '' + data.list[i].username + '' + data.list[i].nickname + '' + data.list[i].email + '' + data.list[i].telephone + ''+ data.list[i].gender + '' + data.list[i].birthday + ''+

'修改' + ' ' +

'删除' + '

';

}

$('#userInfo_table').append(s);

这样我们的数据回显就体现出来了,第一页,正好8个数据 (Ps:前面测试时删过一些所以编号非0开始)

(4) 首尾页和翻页实现

var lis = " ";

//点击首页代码var firstPage = '

首页';

//计算上一页的页码var previousNum = data.currentPage - 1;

if(previousNum <&#61; 0){

previousNum &#61; 1;

}

//上一页翻页的具体代码var previousPage &#61; &#39;

«&#39;;

lis &#43;&#61; firstPage;

lis &#43;&#61; previousPage;尾页以及下一页和 首页和上一页 基本是差不多的

(5) 页码的处理

如何处理页码比前面几点就要复杂一点了&#xff0c;我们既需要用户点击后可以显示出 正确的用户信息&#xff0c;其次我们又需要考虑如何保证只显示我们需要的页码左右的几个页码&#xff0c;总不能有多少页就显示多少个页码

我们还是需要作出规范&#xff0c;就像这样&#xff1a;

/*一共展示8个页码&#xff0c;前4后3如果前面不够4个&#xff0c;后面补齐8个如果后面不足8个&#xff0c;前面补齐8个*/

var start;

var end;

//总页码超过8页if (data.totalPage <8) {

start &#61; 1;

end &#61; data.totalPage;

}else{

//总页码超过8页 start &#61; data.currentPage - 4;

end &#61; data.currentPage &#43; 3;

//如果前面不够4个 if (start <1) {

start &#61; 1;

end &#61; start &#43; 7;

}

//如果后面不足3个&#xff0c;前面补齐8个 if (end > data.totalPage ) {

end &#61; data.totalPage;

start &#61; end - 7;

}

}

for (var i &#61; start; i <&#61; end; i&#43;&#43;) {

if (data.currentPage &#61;&#61; i){

var li &#61; &#39;

&#39;&#43; i &#43; &#39;&#39;;

}else{

var li &#61; &#39;

&#39; &#43; i &#43; &#39; &#39;;

}

lis &#43;&#61; li;

}

说明&#xff1a;上文使用了这种形式执行href&#61;"Javascript:load(&#39;&#43;i&#43;&#39;,8)&#xff0c;大家可以使用onclick自行优化一下

效果展示

首页

末页

总结

这篇文章到这里就基本结束了&#xff0c;这个样式是我参考某马中的一个样式布的局&#xff0c;使用 HTML &#43; Ajax 替代了 JSP 然后后端的代码也对应全改写了 &#xff0c;不过可以说是最简单的一种分页了&#xff0c;比较适合在JavaWeb阶段 刚刚接触分页的朋友们了解一下&#xff0c;多多少少希望能带给大家一些帮助&#xff0c;不喜勿喷

同样&#xff0c;在这里祝大家新年快乐&#xff0c;也希望大家都能健康平安&#xff01;

结尾

如果文章中有什么不足&#xff0c;或者错误的地方&#xff0c;欢迎大家留言分享想法&#xff0c;感谢朋友们的支持&#xff01;

如果能帮到你的话&#xff0c;那就来关注我吧&#xff01;如果您更喜欢微信文章的阅读方式&#xff0c;可以关注我的公众号在这里的我们素不相识&#xff0c;却都在为了自己的梦而努力 ❤

一个坚持推送原创开发技术文章的公众号&#xff1a;理想二旬不止



推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 查询单个functionquery(id){$.ajax({url:smallproductServlet,async:true,type:POST,data:{typ ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
author-avatar
彭菜菜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有