day41JDBC案例分页查询和条件查询Word格式.docx
- 文档编号:22834174
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:23
- 大小:2.16MB
day41JDBC案例分页查询和条件查询Word格式.docx
《day41JDBC案例分页查询和条件查询Word格式.docx》由会员分享,可在线阅读,更多相关《day41JDBC案例分页查询和条件查询Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
JDBC:
访问数据库操作
C3P0:
配置和使用
DBUtils:
简化JDBC代码操作
BeanUtils:
封装请求数据
今日内容学习目标
1.能够说出使用分页的优点
2.能够说出分页使用内存来实现及优缺点
3.能够说出分页使用数据库查询语句实现及优缺点
4.理解limit语句后的参数含义
5.能够独立编写使用limit关键字,查询商品信息表的前5条数据
6.理解pageBean类中的5个变量
7.能独立能够独立编写pageBean类
8.能编写出分页查询和条件查询各层的代码
一、昨日作业说明(删除选中商品)
1.显示效果
2.流程分析
3.修改页面
在商品序号前面添加超链接:
删除选中(使用javascript让超链接点击效果失效),并设置其显示的字体为黑色,下划线效果去掉!
为每一个商品编号前面添加一个复选框!
引入JQ的核心JS文件(使用JQ获取选中的复选框)
为删除选中超链接添加鼠标单击事件
完整JS代码
·
4.编写servlet(DeleteSelectProductServlet)
注意:
获取所有选中的商品信息,注意参数是pid,传递过来的形式是:
pid=xx&
pid=yy&
pid=zzz
5.编写service
6.编写dao层代码
二、分页查询商品信息
1.案例介绍
在实际开发中,查询操作是非常常见的一个功能,昨天我们已经实现了,但是发现查询的结果在页面现实的时候不是很理想(当商品的数据比较多的时候一个滚屏页面显示不下,用户操作很不方便)。
为了解决这个问题,我们需要对查询的结果做一个分页的数据显示!
1.1显示效果
1.2分页查询相关知识介绍(SQL分页)
1.物理分页:
此种分页最常用,是数据库层次上的分页:
查询数据时分页。
服务器分为WEB服务器和数据库服务器
优点:
占用服务器(WEB服务器tomcat)内存资源极少(几乎可以忽略)
缺点:
增加了服务器和数据库的通信次数,增加了数据库的查询压力
表中的数据量极大的情况下,最好使用物理分页。
select*fromproductlimit?
?
第一个?
:
startIndex=(pageNumber-1)*pageSize
第二个?
pageSize
要查看的页面:
pageNumber
一个参数:
查询前N条记录
二个参数:
分页操作(第一个参数,起始索引【(要查看的页面数-1)*每页显示大小】;
第二个参数:
每页显示大小)
操作:
MySQL:
limit关键字(如果只有一个参数,表示查询前几条记录;
如果有2个参数,第一个参数表示起始索引位置startIndex【计算得来,你需要查看的页码数(pageNumber-1)*pageSize】,第二个参数表示每页显示的条目pageSize【这个是指定的,或者是从页面里面获取到的】)
页面显示4条记录,查看第3页(select*fromproductlimit8,4;
)
SqlServer:
top关键字
Oracle:
rownumber+嵌套子查询
MySQL操作;
查询第3页的商品信息,每页显示5条记录!
select*fromproductlimit10,5;
参数说明:
第一个参数:
查询的起始索引下标,计算公式为(要查询第几页-1)乘以每页显示的记录数
第二个参数:
每页显示的记录数
如果只指定一个参数,那么表示从第一条开始查询出指定参数的个数(记录数)
2.逻辑分页
把数据一次性查询到服务器内存中,在显示的时候写算法进行分页。
只查询一次,大大减少了服务器和数据库的通信次数,减少了数据库查询压力
1.Java集合无法一次性保存过多的数据
2.太占用服务器的内存资源
表中数据量没有达到万的级别(数据量比较小),可以选择用逻辑分页减少数据库的查询压力。
查询压力:
查询的次数多
服务器内存压力:
数据量大
物理分页和逻辑分页将在在大数据开发中是结合在一起的【综合案例项目实战第二天讲解】
物理分页:
通过SQL语句直接操作数据库,占用WEB服务器的内存很少,但是对数据库的查询压力比较大;
逻辑分页:
一次将所有的数据查询出来放到WEB服务器的内存中去,通过算法计算分页的相关的数据出来,对数据库的查询压力很低,但是对WEB服务器的内存占用极大。
2.案例执行流程分析
3.环境搭建
在昨天案例的基础上进行改进即可。
拷贝昨天项目工程里面的src目录和WebRoot目录下面的文件到新创建的项目里面去,选择全部覆盖即可完成操作。
4.基本的查询操作
4.1改写dao层代码
需要给定2个参数:
起始页码(起始索引)和每页显示记录数(由service层传递过来),设置实际参数,修改查询方法里面的参数!
起始索引=(用户要查看的第几页-1)乘以每页显示的记录数
4.2修改service层代码
要查看第几页由WEB层servlet传递过来,每页显示记录数这里指定好!
起始索引值进行计算
4.3修改servlet层代码
接收用户选择的页面数pageNumber
4.4测试运行结果
在地址栏输入:
http:
//localhost:
8080/WEB21_JDBC/FindAllProductServlet
显示结果:
【未指定要查询第几页,未给定pageNumber造成】
再次测试:
8080/WEB21_JDBC/FindAllProductServlet?
pageNumber=2
5.完善分页查询操作
5.1完成上一页和下一页功能
修改plist.jsp页面,完成上一页和下一页功能
上一页:
用户查看当前页-1
下一页:
用户查看当前页+1
在<
/c:
if>
后面添加如下代码:
显示效果:
需要从域对象中获取当前查看页信息,那么需要修改servlet代码,将pageNumber保存到域对象中去。
5.2完成显示页码数功能准备工作(获得5个参数)
我们还想在页面中显示一些页面数码供用户选择,那么问题来了?
这个里面总共有多少页呢?
可不可以这么做?
先查出总记录数,然后用总记录数(totalRecord)/每页显示的条数(pageSize)
使用selectcount(*)fromproduct;
查询出总记录数!
总记录数totalRecord从数据库查询得来!
每页显示条数:
pageSize已经指定的
那么总共有多少页(totalPage):
计算得来
50条
每页显示4条
12余212+1页
totalRecord%pageSize==0?
totalRecord/pageSize:
totalRecord/pageSize+1
起始索引:
startIndex(计算得来)(pageNumber-1)*pageSize
页面显示记录数:
pageSize(指定的)4
要查看到页码:
pageNumber(用户指定)从页面获取
总记录数:
totalRecord(查询得来)selectcount(*)fromproduct50
总页数:
totalPage(计算得来)50/4=12余2
1.修改service层代码
完成查询总记录数(需要查询数据库)和计算总页数操作
2.修改dao层代码
需要使用ScalarHandler,返回值为Long类型,需要进行转换Long.intValue();
3.DeBug测试总记录数和总页数
测试的时候,建议关闭其它项目!
6.抽取pageBean
从上面的操作中,我们发现service层的那些参数都需要传递到WEB层中的servlet去(因为最终这些数据<
总页码数、当前查看的页码数等>
都需要在jsp页面显示,而JSP的数据都是由servlet保存到域对象并转发过去),那么怎么处理呢?
考虑将那些个参数封装到一个JavaBean中去(pageBean)
pageNumber;
//当前页用户传递
pageSize;
//每页显示条数后台指定
startIndex;
//起始索引值计算
totalRecord;
//总记录数数据库查询出来
totalPage;
//总页数计算出来
List<
Product>
result;
//每一页的数据
6.1编写pageBean
6.2修改servlet代码
需要将前台获取到的当前页设置到pageBean里面去
Service层查询商品信息传递就是pageBean,不需要传递pageNumber了
返回值为pageBean!
设置域对象是pageBean了,pageBean里面存放着pageNumber和所有的商品信息了
6.3修改service层代码
●方法签名:
publicPageBeanfindAll(PageBeanpageBean){
所有的参数均从pageBean里面获取,每获取到一个计算出另外一个都需要将计算得到的数据设置到pageBean里面去。
●提供查询所有分页后的商品信息方法
//分页查询所有商品信息
products=dao.findAll(pageBean);
pageBean.setResult(products);
6.4修改dao层代码
修改2个参数(startIndex,pageSize),均是通过传递过去的pageBean得到
6.5DeBug测试
7.修改JSP页面
7.1JSP页面索引页基本实现
需要对pageBean进行非空判断!
上一页和下一页的位置也需要改动
●添加索引页
使用<
c:
forEach>
没有被遍历的对象,有起始值1(第一页),结束值(pageBean.totalPage)
7.2优化索引页
我们发现,如果访问的就是第一页,那么不应该让用户点击第一页索引才对!
所以需要对显示的索引页进行判断使用<
choose>
(<
when>
<
otherwise>
7.3优化上一页和下一页
前面我们发现如果用户查看的是第一页或者是最后一页,那么上一页和下一页应该是不能再点击的。
下面来解决这个Bug
只需要做个判断就OK了
●上一页:
●下一页:
7.4优化pageBean
我们发现在pageBean里面的代码应该能被其它类通用才对,比如员工信息。
那么我们可以使用泛型!
●修改pageBean
修改servlet
后面我们又发现service层的业务代码比较多,像计算出来的内容可以进行抽取,放到pageBean里面进行操作,瘦身service层的代码
●修改索引下标:
将计算公司放到pageBean中的getStartIndex方法的返回值位置,注释service层相关代码
●修改总页数:
三、条件查询商品信息
1.页面效果
3.修改JSP页面
拷贝没有分页的plist.jsp页面到项目里面去,重命名为plistNopage.jsp
调整样式:
4.编写servlet代码(FindProductNopageServlet)
编写FindProductNopageServlet,添加完成后,需要重定向到查询所有商品信息的servlet
5.编写service层代码
7.编写plistNopage.jsp页面
直接使用之前的页面部分代码
8.分类信息动态查询
8.1编写servlet(FindAllCategoryServlet)
8.2编写service(CategoryService)
8.3编写dao(CategoryDao)
8.4修改JSP页面
修改plistNopage.jsp页面,完成条件回显和分类数据回显
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- day41JDBC 案例 分页 查询 条件