分页查询,就是将将过多的结果在有限的界面上分好多页来显示,这个是很多网站常用的功能,也是最基本的功能,今天简单总结一下。
分页以前听人们说都是一项技术,但是我觉的不尽然。我认为分页是将数据库的数据,利用一些特殊的sql语句来进行查询,显示理所应当显示的内容,更恰当的说可以是对SQL语句的灵活运用,对逻辑思维的简单使用。
一,一般人们将分页查询分为两类:逻辑分页,物理分页,我们先从理论上理解一下:
1,逻辑分页概述:就是用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大的集合中,然后存放在session对象,然后通过页码计算出当前页需要显示的数据内容,存储到一个小的list的集合中,并将之存储到request对象中,跳转到JSP页面,进行遍历显示。 当用户第二次访问时,只要不关闭浏览器,我们还会从session中获取数据,来进行显示。为什么叫逻辑分页呢?因为此种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的。
来看它的一些缺点吧:
a,如果需要查询的数据量过大,session将耗费大量的内存;
b,因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的。
小结:这种分页很少使用。但是在数据量小,不会被修改的数据,使用逻辑分页会提高程序的执行效率。
2,物理分页概述:使用数据库自身所带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。因为是对数据库实实在在的数据进行分页条件查询,所以叫物理分页。每一次物理分页都会去连接数据库。
优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。
缺点:物理分页使用了数据库自身带的机制,所以这样的SQL语句不通用,导致不能进行数据库的移植。
小结:在实际中物理分页还是使用的较多的。
二,看一下逻辑分页查询的应用:
public class PageQueryUserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取页码
int pageno = Integer.parseInt(request.getParameter("pageno")==null?"1":request.getParameter("pageno"));
//从session中获取大List集合
HttpSession session = request.getSession();
List bigList = (List)session.getAttribute("bigList");
//如果第一次访问
if(bigList == null){
//创建大List集合
bigList = new ArrayList();
//如果大List集合不存在,则连接数据库
Connection conn = null;
PreparedStatement ps= null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
String sql = "select usercode,username,orgtype from t_user order by regdate desc";
ps = conn.prepareStatement(sql);
//执行查询语句返回查询结果集
rs = ps.executeQuery();
//遍历结果集封装javabean对象并存储到大List集合中
while(rs.next()){
User user = new User();
user.setUsercode(rs.getString("usercode"));
user.setUsername(rs.getString("username"));
user.setOrgtype(rs.getString("orgtype"));
bigList.add(user);
}
//将大List集合存储到session中
session.setAttribute("bigList", bigList);
} catch (Exception e) {
e.printStackTrace();
} finally{
DBUtil.close(conn, ps, rs);
}
}
//如果从session中可以获取到大List集合,则通过页码计算得出小List集合
List smallList = new ArrayList();
//计算开始标识=页数大小*(页码-1)
int beginIndex = Const.PAGE_SIZE * (pageno-1);
//结束标识=页数大小*页码,如果超过了总数据条数,则表示为最后一页,写为总结条数即可
int endIndex = Const.PAGE_SIZE * pageno > bigList.size() ? bigList.size() : Const.PAGE_SIZE * pageno;
for(int i=beginIndex;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?