Oracle下的Java分页功能_动力节点Java学院整理

就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pageNum)、当前第几页(pageNo)等等信息,所以我们封装一个查询结果PageModel类,代码如下:

package com.bjpowernode.test;
import java.util.List;
public class PageModel<E> {
 private List<E> list;
 private int pageNo;
 private int pageSize;
 private int totalNum;
 private int totalPage;
 public List<E> getList() {
 return list;
 }
 public void setList(List<E> list) {
 this.list = list;
 }
 public int getPageNo() {
 return pageNo;
 }
 public void setPageNo(int pageNo) {
 this.pageNo = pageNo;
 }
 public int getPageSize() {
 return pageSize;
 }
 public void setPageSize(int pageSize) {
 this.pageSize = pageSize;
 }
 public int getTotalNum() {
 return totalNum;
 }
 public void setTotalNum(int totalNum) {
 this.totalNum = totalNum;
 setTotalPage((getTotalNum() % pageSize) == 0 ? (getTotalNum() / pageSize)
  : (getTotalNum() / pageSize + 1));
 }
 public int getTotalPage() {
 return totalPage;
 }
 public void setTotalPage(int totalPage) {
 this.totalPage = totalPage;
 }
 // 获取第一页
 public int getFirstPage() {
 return 1;
 }
 // 获取最后页
 public int getLastPage() {
 return totalPage;
 }
 // 获取前页
 public int getPrePage() {
 if (pageNo > 1)
  return pageNo - 1;
 return 1;
 }
 // 获取后页
 public int getBackPage() {
 if (pageNo < totalPage)
  return pageNo + 1;
 return totalPage;
 }
 // 判断'首页'及‘前页'是否可用
 public String isPreable() {
 if (pageNo == 1)
  return "disabled";
 return "";
 }
 // 判断'尾页'及‘下页'是否可用
 public String isBackable() {
 if (pageNo == totalPage)
  return "disabled";
 return "";
 }
} 

其中使用泛型是为了能使的该分页类能进行重用,比如在查询用户时可以封装User对象、在查询财务中的流向单时可以封装流向单FlowCard类。

我们以查询用户为例,用户选择查询条件,首先调用Servlet获取查询参数,然后请求业务逻辑层取得分页封装结果类。业务逻辑调用Dao层取得结果集、取得中记录数封装成分页类。最后Servlet将结果设置到jsp页面显示。

首先来讲解Servlet,代码如下:

package com.bjpowernode.test;
import java.io.*;
import java.util.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kane.UserInfo;
import kane.UserInfoManage;
import kane.PageModel;
public class UserBasicSearchServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private int pageSize = 0;
 @Override
 public void init(ServletConfig config) throws ServletException {
 pageSize = Integer.parseInt(config.getInitParameter("pageSize"));
 }
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
 doPost(req, resp);
 }
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
 // 1.取得页面参数并构造参数对象
 int pageNo = Integer.parseInt(req.getParameter("pageNo"));
 String sex = req.getParameter("gender");
 String home = req.getParameter("newlocation");
 String colleage = req.getParameter("colleage");
 String comingyear = req.getParameter("ComingYear");
 UserInfo u = new UserInfo();
 u.setSex(sex);
 u.setHome(home);
 u.setColleage(colleage);
 u.setCy(comingyear);
 // 2.调用业务逻辑取得结果集
 UserInfoManage userInfoManage = new UserInfoManage();
 PageModel<UserInfo> pagination = userInfoManage.userBasicSearch(u,
  pageNo, pageSize);
 List<UserInfo> userList = pagination.getList();
 // 3.封装返回结果
 StringBuffer resultXML = new StringBuffer();
 try {
  resultXML.append("<?xml version='1.0' encoding='gb18030'?>/n");
  resultXML.append("<root>/n");
  for (Iterator<UserInfo> iterator = userList.iterator(); iterator
   .hasNext();) {
  UserInfo userInfo = iterator.next();
  resultXML.append("<data>/n");
  resultXML.append("/t<id>" + userInfo.getId() + "</id>/n");
  resultXML.append("/t<truename>" + userInfo.getTruename()
   + "</ truename >/n");
  resultXML.append("/t<sex>" + userInfo.getSex() + "</sex>/n");
  resultXML.append("/t<home>" + userInfo.getHome() + "</home>/n");
  resultXML.append("</data>/n");
  }
  resultXML.append("<pagination>/n");
  resultXML.append("/t<total>" + pagination.getTotalPage()
   + "</total>/n");
  resultXML.append("/t<start>" + pagination.getFirstPage()
   + "</start>/n");
  resultXML.append("/t<end>" + pagination.getLastPage() + "</end>/n");
  resultXML.append("/t<pageno>" + pagination.getPageNo()
   + "</pageno>/n");
  resultXML.append("</pagination>/n");
  resultXML.append("</root>/n");
 } catch (Exception e) {
  e.printStackTrace();
 }
 writeResponse(req, resp, resultXML.toString());
 }
 public void writeResponse(HttpServletRequest request,
  HttpServletResponse response, String result) throws IOException {
 response.setContentType("text/xml");
 response.setHeader("Cache-Control", "no-cache");
 response.setHeader("Content-Type", "text/xml; charset=gb18030");
 PrintWriter pw = response.getWriter();
 pw.write(result);
 pw.close();
 }
} 

其中User对象代码如下:

package com.bjpowernode.test;
import java.util.Date;
public class UserInfo {
 private int id;
 private String username;
 private String password;
 private String truename;
 private String sex;
 private Date birthday;
 private String home;
 private String colleage;
 private String comingYear;
 public int getId() {
 return id;
 }
 public void setId(int id) {
 this.id = id;
 }
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
 this.username = username;
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
 }
 public String getTruename() {
 return truename;
 }
 public void setTruename(String truename) {
 this.truename = truename;
 }
 public String getSex() {
 return sex;
 }
 public void setSex(String sex) {
 this.sex = sex;
 }
 public Date getBirthday() {
 return birthday;
 }
 public void setBirthday(Date birthday) {
 this.birthday = birthday;
 }
 public String getHome() {
 return home;
 }
 public void setHome(String home) {
 this.home = home;
 }
 public String getColleage() {
 return colleage;
 }
 public void setColleage(String colleage) {
 this.colleage = colleage;
 }
 public String getCy() {
 return comingYear;
 }
 public void setCy(String cy) {
 this. comingYear= cy;
 }
} 

接着是业务逻辑层代码,代码如下:

package com.bjpowernode.test;
import java.sql.Connection;
import kane.DBUtility;
import kane.PageModel;
public class UserInfoManage {
 private UserInfoDao userInfoDao = null;
 public UserInfoManage () {
 userInfoDao = new UserInfoDao();
 }
 public PageModel<UserInfo> userBasicSearch(UserInfo u, int pageNo,
  int pageSize) throws Exception {
 Connection connection = null;
 PageModel<UserInfo> pagination = new PageModel<UserInfo>();
 try {
  connection = DBUtility.getConnection();
  DBUtility.setAutoCommit(connection, false);
  pagination.setList(userInfoDao.getUserList(u, pageNo, pageSize));
  pagination.setPageNo(pageNo);
  pagination.setPageSize(pageSize);
  pagination.setTotalNum(userInfoDao.getTotalNum(u));
  DBUtility.commit(connection);
 } catch (Exception e) {
  DBUtility.rollBack(connection);
  e.printStackTrace();
  throw new Exception();
 } finally {
  DBUtility.closeConnection();
 }
 return pagination;
 }
} 

其中DBUtility为数据库的连接封装类。

最后是Dao层代码实现,代码如下:

package com.bjpowernode.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import kane.UserInfo;
import kane.DBUtility;
public class UserInfoDao {
 public List<UserInfo> getUserList(UserInfo userInfo, int pageNo,
  int pageSize) throws Exception {
 PreparedStatement pstmt = null;
 ResultSet rs = null;
 List<UserInfo> userList = null;
 try {
  String sql = "select * from(select rownum num,u.* from(select * from user_info where sex = ? and home like '"
   + userInfo.getHome()
   + "%"
   + "' and colleage like '"
   + userInfo.getColleage()
   + "%"
   + "' and comingyear like '"
   + userInfo.getCy()
   + "%"
   + "' order by id) u where rownum<=?) where num>=?";
  userList = new ArrayList<UserInfo>();
  Connection conn = DBUtility.getConnection();
  pstmt = conn.prepareStatement(sql);
  pstmt.setString(1, userInfo.getSex());
  pstmt.setInt(2, pageNo * pageSize);
  pstmt.setInt(3, (pageNo - 1) * pageSize + 1);
  rs = pstmt.executeQuery();
  while (rs.next()) {
  UserInfo user = new UserInfo();
  user.setId(rs.getInt("id"));
  user.setTruename(rs.getString("truename"));
  user.setSex(rs.getString("sex"));
  user.setHome(rs.getString("home"));
  userList.add(user);
  }
 } catch (SQLException e) {
  e.printStackTrace();
  throw new Exception(e);
 } finally {
  DBUtility.closeResultSet(rs);
  DBUtility.closePreparedStatement(pstmt);
 }
 return userList;
 }
 public int getTotalNum(UserInfo userInfo) throws Exception {
 PreparedStatement pstmt = null;
 ResultSet rs = null;
 int count = 0;
 try {
  String sql = "select count(*) from user_info where sex=? and home like '"
   + userInfo.getHome()
   + "%"
   + "' and colleage like '"
   + userInfo.getColleage()
   + "%"
   + "' and comingyear like '"
   + userInfo.getCy()+ "%" + "'";
  Connection conn = DBUtility.getConnection();
  pstmt = conn.prepareStatement(sql);
  pstmt.setString(1, userInfo.getSex());
  rs = pstmt.executeQuery();
  if (rs.next()) {
  count = rs.getInt(1);
  }
 } catch (SQLException e) {
  e.printStackTrace();
  throw new Exception(e);
 } finally {
  DBUtility.closeResultSet(rs);
  DBUtility.closePreparedStatement(pstmt);
 }
 return count;
 }
} 

最后就是servlet将得到的结果返回给jsp页面显示出来。

注:其中DBUtility代码是封装数据库连接操作的代码,如下:

1.package com.bjpowernode.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtility {
 private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
 public static Connection getConnection() {
 Connection conn = null;
 conn = threadLocal.get();
 if (conn == null) {
  try {
  Class.forName("oracle.jdbc.driver.OracleDriver");
  conn = DriverManager.getConnection(
   "jdbc:oracle:thin:@localhost:1521:oracle", "admin",
   "admin");
  threadLocal.set(conn);
  } catch (ClassNotFoundException e) {
  e.printStackTrace();
  } catch (SQLException e) {
  e.printStackTrace();
  }
 }
 return conn;
 }
 // 封装设置Connection自动提交
 public static void setAutoCommit(Connection conn, Boolean flag) {
 try {
  conn.setAutoCommit(flag);
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 // 设置事务提交
 public static void commit(Connection conn) {
 try {
  conn.commit();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 // 封装设置Connection回滚
 public static void rollBack(Connection conn) {
 try {
  conn.rollback();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 // 封装关闭Connection、PreparedStatement、ResultSet的函数
 public static void closeConnection() {
 Connection conn = threadLocal.get();
 try {
  if (conn != null) {
  conn.close();
  conn = null;
  threadLocal.remove();
  }
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 public static void closePreparedStatement(PreparedStatement pstmt) {
 try {
  if (pstmt != null) {
  pstmt.close();
  pstmt = null;
  }
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
 public static void closeResultSet(ResultSet rs) {
 try {
  if (rs != null) {
  rs.close();
  rs = null;
  }
 } catch (SQLException e) {
  e.printStackTrace();
 }
 }
} 

使用ThreadLocal是为了保证事务的一致,使得同一个线程的所有数据库操作使用同一个Connection。

到此一个简单的代码实现就完成了。

总结

以上所述是小编给大家介绍的Oracle下的Java分页功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 分页技术原理与实现之Java+Oracle代码实现分页(二)

    紧接着上篇-分页技术原理与实现之分页的意义及方法(一) ,本篇继续分析分页技术.上篇讲的是分页技术的简单原理与介绍,这篇深入分析一下分页技术的代码实现. 上篇最后讲到了分页的最佳实现是在数据库层进行分页,而且不同的数据库有不同的分页实现,比如Oracle是用三层sql嵌套实现分页的.MySQL是用limit关键字实现的(上篇已讲到). 这篇以Java+Oracle为基础,讲解代码层的实现. 就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pag

  • java调用oracle分页存储过程示例

    1.分页类 复制代码 代码如下: package org.zh.basic; /** * 页面类 *  * @author keven *  */public class PageInfo { // 定义    private String p_tableName; // -表名    private String p_strWhere; // --查询条件    private String p_orderColumn; // --排序的列    private String p_orderS

  • Oracle下的Java分页功能_动力节点Java学院整理

    就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pageNum).当前第几页(pageNo)等等信息,所以我们封装一个查询结果PageModel类,代码如下: package com.bjpowernode.test; import java.util.List; public class PageModel<E> { private List<E> list; private int pageNo; private int pa

  • Java分页简介_动力节点Java学院整理

    什么是分页技术 分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自习自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止.其实这和我们阅读书籍很类似. 分页的意义 分页确实有效,但它一定会加大系统的复杂度,但可否不分页呢?如果数据量少的话当然可以.但是对于企业信息系统来说数据量不会限制在一个小范围内.如果不顾一切的Select * from某个表,再将返回的数据一古脑的扔给客户,即使客户能够忍受成千

  • Java Iterator迭代器_动力节点Java学院整理

    迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的.只要拿到这个对象,使用迭代器就可以遍历这个对象的内部. 1.Iterator Java提供一个专门的迭代器<<interface>>Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器.Iterator接口实现后的功能是"使用"一个迭代器. 文档定义: Package java.util; publici

  • Java数组优点和缺点_动力节点Java学院整理

    数组是Java语言的基本知识之一,在深入学习Java基础后,我们都知道那些容器,在之后,在我们学习.工作的过程中基本就是使用容器了,很少很使用数组,那么为什么还要有数组呢,我也是今天才遇到这个问题,专门的找资料学习了一下. 数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力,当然现在有泛型,保存类型的区别已经不大了. 数组较容器,最大的优点就是效率.在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式,数组就是一个简单的线性序列,这使得元素访问非常快速,无论使用

  • Java二分法查找_动力节点Java学院整理

    算法 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2. 开始令front=0(指向3),end=7(指向88),则mid=3(指向36).因为mid>x,故应在前半段中查找. 令新的end=mid-1=2,而front=0不变,则新的mid=1.此时x>mid,故确定应在后半段中查找. 令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a

  • Java方法重写_动力节点Java学院整理

    一.方法重写(Override) 在Java中如何来定义重写:Java程序中类的继承特性可以产生一个子类,子类继承父类就拥有了父类的非私有的属性(方法和变量),在子类中可以增加自己的属性(方法和变量),同时也可以对父类中的方法进行扩展,以增强自己的功能,这样就称之为重写,也称为复写或者覆盖.所谓方法重写就是子类的方法和父类中继承下来的方法具有完全相同的方法名.返回值类型.方法的参数个数以及参数类型,这样才能被称为方法重写. 代码体现: // 这是父类的定义 public class Person

  • Java List简介_动力节点Java学院整理

    Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解.  List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引  ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步  LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)  Vector:底层是数组数据结构 线

  • 十大常见Java String问题_动力节点Java学院整理

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ? 简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象). 而 equals 判断两个字符串的值是否相等. 除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法. 如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比

  • Java Map简介_动力节点Java学院整理

    Map简介 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序.某些映射实现可明确保证其顺序,如 TreeMap 类:另一些映射实现则不保证顺序,如HashMap 类. 注:将可变对象用作映射键时必须格外小心.当对

  • Java线程让步_动力节点Java学院整理

    yield()介绍 yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行! yield()示例 下面,通过示例查看它的用法. // YieldTest.java的源码 class ThreadA extends Thread{ public

随机推荐