需求:

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

主要解决这个问题方法:

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

用到的数据库语句:

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

核心代码:

核心代码主要是DAO数据层

简易版:不带搜索

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

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

效果:

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

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

完整版:(带搜索)

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

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

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

Servlet的控制部分


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

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

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

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

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

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

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

前台页面

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

<body>
<form action="<c:url value='/Servlet'/>" method="post">
ID<input type="text" name="id" value="${stud.id }"/> 
NAME<input type="text" name="name" value= "${stud.name}" />
<input type ="submit" value="搜索一下"/>
</form> <c:forEach items="${result.list }" var="m">
${m.id} , ${m.name } <br/>
</c:forEach>
<hr/>
<c:if test="${result.current!=1 }">
<<a href="<c:url value='/Servlet?num=${result.current-1}'/>">上一页</a>
</c:if>
<c:forEach begin="${result.start }" end="${result.end }" var="x">
<span>
<c:if test="${x==result.current }">
${x} 
</c:if> <c:if test="${x!=result.current }">
<a href="<c:url value='/Servlet?num=${x}'/>">${ x}</a>  
</c:if></span>
</c:forEach>
<c:if test="${result.current!=result.sumNum}">
<a href="<c:url value='/Servlet?num=${result.current+1}'/>">下一页></a>
</c:if> </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. idea常用快捷键(转)

    ---恢复内容开始--- IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+S ...

  2. 前端面试:问到GET和POST两种区别

    最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. "标准答案"(本标准答案参考自w3schools): GET在浏览器回退时是无害的,而P ...

  3. C - Between the Offices

    Problem description As you may know, MemSQL has American offices in both San Francisco and Seattle. ...

  4. Spring Boot (13) druid监控

    druid druid是和tomcat jdbc一样优秀的连接池,出自阿里巴巴.除了连接池,druid哈hi有一个很实用的监控功能. pom.xml 添加了以下依赖后,会自动用druid连接池替代默认 ...

  5. Spring + Redis ( 简单使用)

    1.Redis 的 Java API Java 中 使用 Redis 工具,要先去 maven 仓库中,下载 jedis jar包 jedis 依赖 <dependency> <gr ...

  6. js动态操作订单表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Java_Jdbc_连接mysql数据库_1.打通数据库

    准备工作:myeclipes,mysql,navicat,jar包等工具 首先,需要导入连接数据库需要的jar包.照着教程敲的程序一直出错,结果就是导jar包导得有问题. 正确的(不唯一)的步骤为:1 ...

  8. phpstorm 使用

    常用快捷 ctrl + / 单行注释 Alt+1 隐藏左侧任务栏 设置 1:control+shift+A功能可以搜索对应功能,把mouse:Change font size(Zoom) ...的按钮 ...

  9. JavaEE的起步

    因为某些原因,现在要从.net开发转向J2EE了,在这里记录一下学习经历

  10. rabbitmq-3.5.1-安裝

    系统版本:CentOS 6.5RabbitMQ-Server:3.5.1一.安装erlang1.安装准备,下载安装文件 wget https://packages.erlang-solutions.c ...