需求:

为什么须要採用分页技术呢?在数据库中我们查询数据的时候,须要将数据返回到显示页面。数据库中含有大量数据,所有显示在一个页面过于太多,所以我们须要採用分页技术。每一页显示不同数据。

主要解决这个问题方法:

1,我们必须须要确定每一页显示数目 pageSize=20

2。我们须要查询出共同拥有多少条数据。sunNums

3,我们须要计算出须要一共同拥有多少页 ----採用总数据/pageSize,还要推断是否整除的情况   sunNums/pageSize+ (sunNums%pageSize==0?0:1)

4,我们须要从前台传过去的页面(pageNum)。计算出须要显示数据从哪里開始(pageNum-1)*pageSize

5,我们须要将查询出的数据封装成一个list<Map<String,object>> 。然后存map。然后将map返回给前台。

PS:当然须要带搜索就须要改点參数:如从前台须要将查询的条件传到dao层,进行处理。

这里採用 分层技术  前台----->servlet----->service------>dao

用到的数据库语句:

  1. <span style="font-size:24px;">SELECT COUNT(*) FROM stud //查询共同拥有多少数据
  2. SELECT * FROM stud LIMIT 120,20 //从第120条数据開始。往后20条数据</span>

核心代码:

核心代码主要是DAO数据层

简易版:不带搜索

  1. <span style="white-space:pre"> </span>Map<String, Object> map =new HashMap<String, Object>();
  2. Integer pageSize=20;//每页显示的数目
  3. String sql="select count(1) from stud";//运行这个sql语句得到全部的数据一共多少条
  1. //这里採用c3p0的数据池(基础上自己加入了点功能。作出了 C3P0Utils)。dbutils工具包括有(QueryRunnerle)
  2. QueryRunner run =new QueryRunner(C3p0Utils.getDs());
  3. String sumNum=""+run.query(sql, new ScalarHandler());//把数据封装成一行一列就是一个结果值,这里就不须要自己去处理,直接採用包里面
  4. int sunNums=Integer.valueOf(sumNum);//全部的数据条数
  5. </span>
  1. //计算有多少页数据
  2. int allPageNum=sunNums/pageSize+(sunNums%pageSize==0?
  3.  
  4. 0:1);
  5. map.put("sumNum", allPageNum);//将一起有多少页存起来
  6. sql="select * from stud limit "+(pageNum-1)*pageSize+","+pageSize;
  7. // System.out.println(sql+"-----"+pageNum);
  8. List<Map<String, Object>> list=run.query(sql, new MapListHandler());
  9. map.put("list", list);//加入到map中去
  10. // System.out.println(list);
  11. return map;

上面的代码仅仅能实现简单的对数据进行分页,没有对其进行搜索,

效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

里面的上一页和下一页技术在servlet里面完毕。

完整版:(带搜索)

在搜索中,我们从前台传过来的数据是封装一个值对象里面的。所以在后台仅仅须要从值对象VO里面去取值即可了。

  1. Map<String, Object> map =new HashMap<String, Object>();
  2. Integer pagesize=20;
  1. /*
  2. * 这里是採用新技术,兼容查询部分和查询ALl的功能。由于从前台传过来的数据在这里可能会没有(前台没有输入),这里这样的查询方式兼容全部的查询方式 */
  1. String sql ="select count(*) from stud where 1=1 ";
  2. String sql2="select * from stud where 1=1 ";//这样写1=1,能够和后面的条件想匹配
  3. if(stud.getId()!=null&&stud.getId().trim().length()>0){
  4. sql=sql+"And id like '%"+stud.getId()+"%'";
  5. sql2= sql2+"and id like '%"+stud.getName()+"%'";//模糊查询
  6. }
  7. if(stud.getName()!=null&&stud.getName().trim().length()>0){
  8. sql =sql+"and name like '%"+stud.getName()+"%'";
  9. sql2 =sql2+"and name like '%"+stud.getName()+"%'";
  10. }
  11. QueryRunner run =new QueryRunner(C3p0Utils.getDs());//採用dbutils的查询功能包
  12. String str="" +run.query(sql, new ScalarHandler());//获得全部的数据。一起共同拥有多少条
  13. int sumNum=Integer.valueOf(str);//转成int型
  14.  
  15. //须要计算一起有多少页
  16. sumNum=sumNum/pagesize+((sumNum%pagesize)==0?0:1);
  17. map.put("sumNum", sumNum);//将总页数传到前台
  18. List<Map<String, Object>> list=run.query(sql2 +" limit "+(pageNum-1)*pagesize+","+pagesize, new MapListHandler());
  19. map.put("list", list);
  20. return map;</span>

后台的技术就是这样子的,当我们数据传往前台。还须要在servlet处理页面显示问题。如上一页,下一页,页面自己主动移动。

Servlet的控制部分


servlet部分。须要控制页面的上一页,下一页。搜索之后,页面点击也是搜索的暖融融
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. //注入
  4. IstudService service=new ServiceDAO();
  5.  
  6. ///必须接受从前台传过来的页面数,没有就赋值为1
  7. response.setContentType("text/html;charset=utf-8");//从前台读取值可能会有中文,必须设置编码,能够採用filter,进行过滤
  8. request.setCharacterEncoding("utf-8");
  9. Integer pageNum=null;
  10. Map<String, Object> map=new HashMap<String, Object>();
  11. //从前台获得点击的页面数----第一次是没有数据的,默认设置为1
  12. String num=request.getParameter("num");//没有写的就是空,赋值为1
  13. if(num==null || num.trim().length()==0){
  14. pageNum=1;
  15. }else{
  16. pageNum=Integer.valueOf(num);//否则就解析传进来的值
  17. }

以下须要对提交方式进行差别,由于 表单提交的是须要带查询条件的。直接点击页码是在查询条件之下去数据库查询数据,是不一样的。必须差别:

  1. Stud stud =new Stud();
  2. /*
  3. * 这里採用的技术 ,,超链接和表单提交是不同的两个方式。所以区分,当然这也是数据提交的时候须要
  4. * 採用数据保存起来,供下一次使用
  5. */
  6. if(request.getMethod().equalsIgnoreCase("get")){
  7. stud=(Stud) request.getSession().getAttribute("stud");//要是点击的是超链接,直接获取session里面的值就能够了
  8. }else{
  9. String id=request.getParameter("id");
  10. String name=request.getParameter("name");
  11. stud.setId(id);
  12. stud.setName(name);
  13. request.getSession().setAttribute("stud", stud);//将数据到session里面存储起来,搜到结果之后,我们点击页码就不会调到其它页面
  14. }
  15.  
  16. try {
  17. map = service.query(pageNum,stud);
  18. map.put("current", pageNum);//当前页存起来。可是前台读取不须要超链接
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }</span>

以下就是对页面显示上一页,下一页的技术

  1. //须要进行分页的分页,我们须要每一页显示多少。起始,和结束,然后点击之后的位置须要计算
  2. int startPage=1;//起始位置
  3. int endPage=10;//结束位置
  4. int sizePage=10;//确定每一页显示多少
  5. int sunNum=(Integer)(map.get("sumNum"));
  6. /*
  7. * 最重要的是-----以传过来的參数为主
  8. * 首先要推断第一页能否全然占满,没有沾满就把所有给endPage
  9. * 要是一页占不了,就须要我们去開始设置 start和end,start=当前页加上一半。end等于start+sizePage,可是须要推断
  10. * 是否超过了总页数的范围。接下来在进行赋值
  11. *
  12. */
  13.  
  14. if(sunNum<endPage){
  15. endPage=sunNum;//防止总数少于10。就要又一次赋值了
  16. }else{
  17. if(pageNum>((endPage-startPage)/2)){
  18. startPage=pageNum-sizePage/2+1;
  19. endPage=startPage+sizePage;
  20. if(sunNum<endPage){
  21. endPage=sunNum;
  22. }
  23. }
  24. }
  25. map.put("start", startPage);
  26. map.put("end", endPage);

最后就是封装好的数据传往前台:

  1. request.setAttribute("result", map);
  2. request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);</span>

前台页面

前台页面採用jstl来获取容器里面的数据

  1. <body>
  2. <form action="<c:url value='/Servlet'/>" method="post">
  3. ID<input type="text" name="id" value="${stud.id }"/> 
  4. NAME<input type="text" name="name" value= "${stud.name}" />
  5. <input type ="submit" value="搜索一下"/>
  6. </form>
  7.  
  8. <c:forEach items="${result.list }" var="m">
  9. ${m.id} , ${m.name } <br/>
  10. </c:forEach>
  11. <hr/>
  12. <c:if test="${result.current!=1 }">
  13. <<a href="<c:url value='/Servlet?num=${result.current-1}'/>">上一页</a>
  14. </c:if>
  15. <c:forEach begin="${result.start }" end="${result.end }" var="x">
  16. <span>
  17. <c:if test="${x==result.current }">
  18. ${x} 
  19. </c:if>
  20.  
  21. <c:if test="${x!=result.current }">
  22. <a href="<c:url value='/Servlet?num=${x}'/>">${ x}</a>  
  23. </c:if></span>
  24. </c:forEach>
  25. <c:if test="${result.current!=result.sumNum}">
  26. <a href="<c:url value='/Servlet?num=${result.current+1}'/>">下一页></a>
  27. </c:if>
  28.  
  29. </body></span>

效果图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

带条件查询:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

详细的项目代码:

点击打开链接

JAVAEE之-----MySQL分页技术(带搜索)的更多相关文章

  1. Mysql学习总结(32)——MySQL分页技术详解

    1.什么是数据分页:数据分页就是将很多条记录像书本一样分页,每页显示多少行记录: 2.为什么要数据分页:当我们进行sql语句查询时,假如数据有成千上万行记录,如果在同一个页面去显示,那这个页面得有多大 ...

  2. thinkphp5 列表页数据分页查询-带搜索条件

    一.控制器部分 <?php namespace app\user\controller; use app\user\model\HelpCenterManual as HelpCenterMan ...

  3. SAP UI 搜索分页技术

    搜索分页技术往往和另一个术语Lazy Loading(懒加载)联系起来.今天由Jerry首先介绍S/4HANA,CRM Fiori和S4CRM应用里的UI搜索分页的实现原理.后半部分由SAP成都研究院 ...

  4. jsp-------------之分页技术(一)

    jsp分页技术之: 如下图:百度的喵 看上图中卡哇伊的小苗的爪子下面的数字,就是分页啦!那我们如何做出这样一个效果呢? 下面我们来逐一分解: jsp分页技术一 :  (算法) /* int pageS ...

  5. PHP+MySQL 分页那点事

    分页技术随处可见,这可以算得上是最为基础的网站功能了.于是今天尝试着用PHP来实现一个分页的小例子. 准备工作 环境准备 Apache MySQL PHP 工作环境 数据库准备 建库 建表 预存数据 ...

  6. 转:PHP分页技术的代码和示例

    本文来自:10 Helpful PHP Pagination Scripts For Web Developers 分页是目前在显示大量结果时所采用的最好的方式.有了下面这些代码的帮助,开发人员可以在 ...

  7. Javaweb 第15天 web练习和分页技术

    第15天 web练习和分页技术 复习day14内容: 学习新技术的思路? 分析功能的思路? 使用queryRunner操作数据库的步骤? ResultSetHandler接口常用实现类(三个重点)? ...

  8. MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

    本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...

  9. java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api

    移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...

随机推荐

  1. Apache上php项目简单部署

    1.建一个简单的php项目 1)在目录C:\wamp\www中新建一个文件夹,命名为20151021 2)在文件夹20151021中新建一个index.php文件,内容为: <?php echo ...

  2. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    题面 题意:数一个n阶三角形中,有多少个全等三角形,n<=1e9 题解:拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0), ...

  3. web动画小结

    前端写动画,无非两种方案,一种是通过css,另一种是js css的方案: 1.transform的单独使用 (IE9+) rotate(90deg) 2d旋转,也可以理解为沿着3D的Z轴旋转 rota ...

  4. android切换卡顿解决方法

    如果想要让应用用户流畅的滑动体验的话,那么就必须对activity和fragment的生命周期有一个完整的概念以及在何种情况下会触发哪些事件. 在自己目前做的项目中,就遇到了这样的问题,那么就把自己的 ...

  5. BZOJ 3653 主席树

    思路: (抄一波公式) $$ans=min(dep[x],k)×(size[x]-1)+\sum_{y在x的子树中,且dis(x,y)<=k}(size[y]-1)$$ 顺着DFS序 按照dee ...

  6. Redis学习笔记(四)-数据类型之list类型

    redis的list类型其实就是一个每个子元素都是string类型的双向链表.所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1).另外list会记录链表的长度.所以llen操作也是O ...

  7. 复习HTML+CSS(7)

    n  HTML 注释 <--! 注释内容 --> 注意:注释内容不会显示,注释是为了将来维护方面. n  图片热点(图像地图) 图像热点:给一张图片加多个链接,默认情况下,一张图片只能加一 ...

  8. 【Oracle】详解10053事件

    借助Oracle的10053事件event,我们可以监控到CBO对SQL进行成本计算和路径选择的过程和方法. 10053事件有两个级别: Level 2:2级是1级的一个子集,它包含以下内容: Col ...

  9. hibernate_03_session详解

    获得session对象有两种方法: 1)openSession 2)getCurrentSession 如果使用的是getCurrentSession需要在hibernate.cfg.xml文件中进行 ...

  10. PAT_A1132#Cut Integer

    Source: PAT A1132 Cut Integer (20 分) Description: Cutting an integer means to cut a K digits lone in ...