Servlet分页查询

分页查询:

1.逻辑分页查询:用户第一次访问时就把全部数据访问出来,添加到一个大集合中,然后放到session中,进行转发。通过页码等的计算,把要显示的内容添加到一个小集合中,转发、遍历小集合以显示当前页码的数据

代码实现:

Dao:

package general.page.query;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class PageQueryDao {
private static Connection con=null;
private static PreparedStatement prst=null;
private static ResultSet rs=null;
public static<T> List<T> pageQuery(Class<T> clazz,String sql,Object...objects) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException{
List<T> beanList=new ArrayList<T>();
Connection con=C3P0Tool.getConnection();
prst=con.prepareCall(sql);
for(int i=0;i<objects.length;i++){
prst.setObject(i+1,objects[i]);
}
rs=prst.executeQuery();
List<String> columnLabelList=getColumnlabel(rs);
Map<String,Object> map=new HashMap<String,Object>();
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
while(rs.next()){
if(columnLabelList.size()>0){
for(String columnLabel:columnLabelList){
Object fieldValue=rs.getObject(columnLabel);
map.put(columnLabel, fieldValue);
}

}
}
list.add(map);

//增强for遍历,要判断集合是否为空
if(list.size()>0){
T t=null;
for(Map<String,Object> mapList:list){
for(Map.Entry<String, Object> entry:map.entrySet()){
t=clazz.newInstance();
String columnlabel=entry.getKey();
Object fieldValue=entry.getValue();
BeanUtils.setProperty(t, columnlabel, fieldValue);
}
}
beanList.add(t);
}
return beanList;
}
public static List<String> getColumnlabel(ResultSet rs) throws SQLException{
List<String> columnLabelList=new ArrayList<String>();
ResultSetMetaData rsmd=rs.getMetaData();
int columnCount=rsmd.getColumnCount();
for(int i=0;i<columnCount;i++){
String columnLabel=rsmd.getColumnLabel(columnCount+1);
columnLabelList.add(columnLabel);
}
return columnLabelList;
}

}

 

 Servlet:

package general.page.query;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class pageQueryServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
int pageNo=Integer.parseInt(request.getParameter("pageNo")==null?"1":request.getParameter("pageNo"));
int pageSize=10;
HttpSession session=request.getSession();
List<Student> bigList = (List<Student>)session.getAttribute("bigList");

//如果第一次访问
if(bigList == null){

//实体类的字段名,要与属性的别名相同
String sql="select sno no,sname name,ssex sex,sbirth birth,zno zn,sclass zclass from student";
try {
bigList=new ArrayList<Student>();
bigList=PageQueryDao.pageQuery(Student.class, sql);
session.setAttribute("bigList", bigList);
request.getRequestDispatcher("/show.jsp").forward(request, response);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

//添加显示记录的小集合

List<T> smallList=new ArrayList<T>();

//计算显示的记录从几行到几行

//定义开始行

int beginIndex=pageSize*(pageNo-1);

//定义结束行

int endIndex=pageSize*pageNo>bigList.size()?bigList.size():pageSize*pageNo;

//注意:集合的索引是从零开始的

for(int i=beginIndex;i<endIndex;i++){

smallList.add(bigList.get(i));

}

request.setAttribute("smallList",smallList);

//转发

2.物理分页查询:通过分页查询的SQL进行查询,所查询的结果集中的内容就是当前页面要显示的内容

代码实现:(以Student类,MySQL数据库(sql="select * from tbName limit ? offset ?")为例,limit限制显示的size,offset跳过前pageNo-1页的记录) 

public List<Student> getStudentList(int pageNo,int pageSize String sql){

List<Student> list=new ArrayList<Student>();

Connection con=null;

PreparedStatement prst=null;

ResultSet rs=null;

con=c3p0.getConnection();

prst=con.prepareStatement(sql);

prst.setInt(1,pageSize);

prst.setInt(2,pageSize*(pageNo-1));

rs.executeQuery();

while(rs.next()){

Student student=new Student();

student.setString(rs.get(1));

    .

    .

    .

}

list.add(student);

//转发

}

总结逻辑分页查询和物理分页查询的区别:

逻辑分页查询:

1.是把所有的相关记录都查出来,然后再通过计算得出在显示页面上要显示的记录,不实实在在的对记录进行分页。

2.如果需要查询的数据量过大,session将耗费大量的内存; 3.因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的。

3.这种分页很少使用。但是在数据量小,不会被修改的数据,使用逻辑分页会提高程序的执行效率。

物理分页查询:

1.是通过sql语句的编写只查询出想要显示的记录

2.数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。

3.物理分页使用了数据库自身带的机制,所以这样的SQL语句不通用,导致不能进行数据库的移植。

时间: 2024-10-13 11:11:41

Servlet分页查询的相关文章

jsp+servlet分页查询

分页查询 减少服务器内存开销 提高用户体验 效果图 思绪图 分页显示Bean文件代码 package cn.ytmj.findlist.domain; import java.util.List; /** * @author rui * @create 2019-08-17 23:34 * 分页对象 * 使用泛型为多种页面提供服务 */ public class PageBean<T> { private int totalCount; //总记录数 private int totalPage

SpringMVC Servlet 分页查询接收参数

@RequestMapping("/sendHistory") public ModelAndView sendrhistory(HttpServletRequest req, HttpServletResponse rep, @RequestParam int p) throws Exception { System.out.println("start..."); String a=req.getParameter("status"); Mo

分页查询

分页查询 分析图 分页javaBean 设计 public class PageBean<T> {    private int currntPage = 1; // 当前页, 默认显示第一页    private int pageCount = 2; // 查询返回的行数(每页显示的行数),默认每页显示3行    private int totalCount; // 总记录数    private int totalPage; // 总页数 = 总记录数/每页显示的行数(+1)    pri

bos 第5天(定区的添加、定区的分页查询、hessian远程调用实现获取客户信息)

BOS项目笔记 第5天 今天内容安排: 1.添加定区功能 2.定区分页查询 3.hessian入门----远程调用技术 4.基于hessian实现定区关联客户 1. 添加定区 定区可以将取派员.分区.客户信息关联到一起. 页面:WEB-INF/pages/base/decidedzone.jsp 第一步:使用下拉框展示取派员数据,修改combobox的URL地址,发送请求 第二步:在StaffAction中提供listajax方法,查询没有作废的取派员,返回json数据 第三步:在StaffSe

JDBC在Java Web中的应用——分页查询

分页查询 通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,在这里介绍两种非常典型的分页方法. 通过ResultSet的光标实现分页 通过ResultSet的光标实现分页,优点是在各种数据库上通用,缺点是占用大量资源,不适合数据量大的情况. 2. 通过数据库机制进行分页 很多数据库自身都提供了分页机制,如SQL Server中提供的top关键字,MySQL数据库中提供的limit关键字,它们都可以设置数据返回的记录数. 通过各种数据库的分页机制实现分页查询,其优

基于Mysql数据库的SSM分页查询

前言: Hello,本Y又来了,"分页"在我们使用软件的过程中是一个很常见的场景,比如博客园对于每个博主的博客都进行了分页展示.可以简单清晰的展示数据,防止一下子将过多的数据展现给用户,毕竟用户的阅读能力和短期接受力都有限,使用分页可以避免带给用户浏览上的不舒服感,利用它可以带给用户良好的体验,便于浏览和查询数据.那么本期我们的博客就来探讨关于分页,使用的Java的框架是Spring+Springmvc+mybatis,这也是目前企业非常流行的搭配方式,使用的数据库是Mysql,我们将

solr 的客户端调用solrj 建索引+分页查询

一.利用SolrJ操作solr API 使用SolrJ操作Solr会比利用httpClient来操作Solr要简单.SolrJ是封装了httpClient方法,来操作solr的API的.SolrJ底层还是通过使用httpClient中的方法来完成Solr的操作. 需要的包如下: 1. apache-solr-solrj-3.5.0.jar 2. commons-httpclient-3.1.jar 3.slf4j-api-1.6.0.jar 4.commons-logging-1.1.jar 在

自己写的一个分页查询前台页码控制

<!doctype html> <%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%> <%@ include file="/pages/common/taglibs.jsp"%> <html> <head> <meta http-equiv=Co

JAVA学习之 实现分页查询

分页是系统中常用到的功能,只要涉及到查询必定伴随而来的就是分页,之前也学习过关于分页的内容,例如在牛腩的新闻发布系统,之前学习的大部分都是使用了假分页,这次学习java,使用Oracle数据库来实现一下真分页. 首先来说一下实现这个分页查询的流程: 一.封装分页信息: 需要分页的部分我们首先要做的是为分页封装一个分页实体,方便返回查询信息,封装如下: /** *封装分页信息 * @author YoungJong * */ public class PageModel<E> { //结果集 p