分页查询:

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语句不通用,导致不能进行数据库的移植。

Servlet分页查询的更多相关文章

  1. jsp+servlet分页查询

    分页查询 减少服务器内存开销 提高用户体验 效果图 思绪图 分页显示Bean文件代码 package cn.ytmj.findlist.domain; import java.util.List; / ...

  2. 分页查询关键代码 多条件查询关键代码 删除选中商品关键代码 修改要先回显再修改 修改要先回显再修改 同一业务集中使用同一servlet的方法

    分页查询关键代码: 通过servlet转发回来的各种信息进行分页的设计(转发回的信息有 分页查询的List集合 查询的页码 查询的条数 查询的数据库总条数 查询的总页码) 从开始时循环10次出现十个数 ...

  3. 用Hibernate和Struts2+jsp实现分页查询、修改删除

    1.首先用get的方法传递一个页数过去 2.通过Struts2跳转到Action 3.通过request接受主页面index传过的页数,此时页数是1, 然后调用service层的方法获取DAO层分页查 ...

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

    前言: Hello,本Y又来了,"分页"在我们使用软件的过程中是一个很常见的场景,比如博客园对于每个博主的博客都进行了分页展示.可以简单清晰的展示数据,防止一下子将过多的数据展现给 ...

  5. java使用插件pagehelper在mybatis中实现分页查询

    摘要: com.github.pagehelper.PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件 PageHelper是国内牛人的一个开源项目,有兴趣的可以去看源码,都有 ...

  6. javaweb分页查询实现

    Javaweb分页技术实现 分页技术就是通过SQL语句(如下)来获取数据,具体实现看下面代码 //分页查询语句 select * from 表名 where limit page , count; 和 ...

  7. 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)

             分页查询信息       使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...

  8. Java基础94 分页查询(以MySQL数据库为例)

    1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的).  本文使用的事MySql数据库.       假设:每页显示10条数据.       Select * from c ...

  9. springmvc+mybatis 实现分页查询

    为简化分页功能,设计了一个分页的JSP标签,只需要在页面使用分页标签,就可以完成所有页面的分页功能. 1. 项目结构和数据库设计 (1) 项目结构: (2) 数据库设计 2. PageModel.ja ...

随机推荐

  1. Java网络编程之InetAddress和URL

    在Java中提供了专门的网络开发程序包---java.net,java的网络编程提供了两种通信协议:TCP(传输控制协议)和UDP(数据报协议). 一.IP(Internet Protocol) 与I ...

  2. Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing

    出现E212: Can't open file for writing的问题是由于权限问题导致的,解决方法有以下思路: 1.使用root进行登录,然后再操作. 2.在使用命令时,前面加sudo. 3. ...

  3. PERL 源码 大神网站

    http://blog.csdn.net/haoyujie/article/category/1187883 http://deepfuture.iteye.com/blog/816428

  4. 如何更改ORACLE 用户的 expired状态

    ORACLE(113) 版权声明:本文为博主原创文章,未经博主允许不得转载. oracle中, 经常用户的状态会变成locked, expired 等状态, 这种情况下怎么处理呢? 首先,  如果是l ...

  5. 消息列队 php 基于redis 实现

    说明 消息列队 基于PHP 实现. 之前 用python 的 flower 实现了 列队. 今天这里我们用的是 PHP 来实现: 在实际的业务环境中 PHP 用的多些: PHP 实现列队 最重要的是用 ...

  6. 函数柯里化 curry

    一.函数柯里化的特性: (1)参数复用 $.ajax // 示例一 function ajax(type,url,data) { var xhr = new XMLHttpRequest(); xhr ...

  7. android项目笔记(一)

    1.getInstance:单例模式创建类的实例,getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的全局访问点)的类中常见,用来生成唯一的实例,getInstance往往是s ...

  8. 全国省市区三级联动js

    function Dsy(){ this.Items = {}; } Dsy.prototype.add = function(id,iArray){ this.Items[id] = iArray; ...

  9. 1 npoi 网上 不用模板 设置密码 workbook.WriteProtectWorkbook("password", "admin"); 、、 2 locked.IsLocked = true; sheet1.ProtectSheet("password");NPOI操作EXCEL--设置密码才可以修改单元格内容 3 模板设置密码 确定原密码 设置新密码

    1 workbook.WriteProtectWorkbook("password", "admin"); 还是可以进去 只读进去 可以编辑 编辑就另存为   ...

  10. C#模拟登录Twitter 发送私信、艾特用户、回复评论

    这次做成了MVC程序的接口 private static string UserName = "用户名"; private static string PassWord = &qu ...