Java分页(支持多种数据库)

来源:互联网 发布:奶粉进口数据 编辑:程序博客网 时间:2024/05/16 19:20

最近研究了下分页,做个总结。

1)数据库操作类,做简单封装 DB.java

package Test;

import java.sql.*;

public class DB {
 
 // 加载驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动加载出错");
        }
    }

 // 获取数据库连接

 public static Connection getConn() {
  Connection conn = null;
  try {
   conn = DriverManager.getConnection("jdbc:mysql://localhost/userinfo?user=root&password=abcd");
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return conn;
 }
 // 关闭数据库连接
 public static void closeConn(Connection conn) {
  try {
   if(conn != null) {
    conn.close();
    conn = null;
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
 // 关闭Statement
 public static void closeStmt(Statement stmt) {
  try {
   if(stmt != null) {
    stmt.close();
    stmt = null;
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
 // 关闭ResultSet 
 public static void closeRs(ResultSet rs) {
  try {
   if(rs != null) {
    rs.close();
    rs = null;
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
}
*******************************************************

2)初始化数据类 initData.java

package Test;

import java.sql.*;

public class initData {

 private static Connection conn = null;

 private static PreparedStatement pstmt = null;
 
 private static Statement stmt = null;

 private static String sql = "insert into userinfo(id,username,age) values(?,?,?)";
 // 总条数
 private static int allCount = 10000;
 // 分批条数
 private static int preCount = 1000;
 // 计数器
 private static int count = 0;

 public static void main(String[] args) {
    CleanData();// 清除数据
    InsertData();// 插入数据
   }

 /**
  * DDL语句 建表语句
  * create table userinfo ( id int(20) not null, username
  * varchar(255), age varchar(255), primary key (id) )
  */

  /**
  * 插入数据 用addBatch()方法
  * 当数据量达到1000时 提交一次
  */
 private static void InsertData()  {
  try {
   conn = DB.getConn();
   pstmt = conn.prepareStatement(sql);
   conn.setAutoCommit(false);
   long start = System.currentTimeMillis();
   for (int i = 1; i <= allCount; i++) {
    pstmt.setInt(1, i);
    pstmt.setString(2, "java" + i);
    pstmt.setString(3, "20");
    pstmt.addBatch();
    if ((i % preCount) == 0) {
     pstmt.executeBatch();
     System.out.println("当前进行完毕===>" + (++count) * preCount
       + "条");
    }
   }
   long end = System.currentTimeMillis();
   System.out.println("数据插入成功!所用时间为: " + (end - start) + " ms");
  } catch (Exception e) {
   e.printStackTrace();
   try {
    conn.rollback();
   } catch (SQLException e1) {
    e1.printStackTrace();
   }
   System.out.println("数据出错,已进行回滚");
  } finally {
   try {
    conn.commit();//提交数据
   } catch (SQLException e) {
    e.printStackTrace();
   }
   DB.closeStmt(pstmt);
   DB.closeConn(conn);
  }
 }
  /**
  * 清除数据
  */
 private static void CleanData() {
  try {
   conn = DB.getConn();
   String sql = "delete from  userinfo";
   stmt = conn.createStatement();
   stmt.executeUpdate(sql);
   System.out.println(sql);
   System.out.println("清除数据成功!");
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   DB.closeStmt(stmt);
   DB.closeConn(conn);
  }
 }
}
*****************************************************

3)分页核心类 Pager.java

package Test;

import javax.servlet.http.*;

public class Pager {
 private int totalRows; // 总行数
 private int pageSize = 20; // 每页显示的行数
 private int currentPage = 1; // 当前页号
 private int totalPages; // 总页数
 private int startRow; // 当前页在数据库中的起始行

 // 构造方法1
 private Pager()
 {
 }
 
 // 构造方法2 带参数_totalRows
 private Pager(int _totalRows) {
  totalRows = _totalRows;
  totalPages = totalRows / pageSize;
  int mod = totalRows % pageSize;
  if (mod > 0) {
   totalPages++;
  }
  currentPage = 1;
  startRow = 0;
 }
 
 // 设置当前页在数据库中的起始行
 public void setStartRow(int startRow) {
  this.startRow = startRow;
 }
 // 获取当前页在数据库中的起始行
 public int getStartRow() {
  return startRow;
 }
 // 设置总页数
 public void setTotalPages() {
  totalPages = totalRows / pageSize;
  int mod = totalRows % pageSize;
  if (mod > 0) {
   totalPages++;
  }
 }
 // 获取总页数
 public int getTotalPages() {
  return totalPages;
 }
 // 设置当前页码
 public void setCurrentPage(int currentPage) {
  this.currentPage = currentPage;
 }
 // 获取当前页码
 public int getCurrentPage() {
  return currentPage;
 }
 // 设置总行数
 public void setTotalRows(int totalRows) {
  this.totalRows = totalRows;
 }
 // 获取总行数
 public int getTotalRows() {
  return totalRows;
 }
 // 设置每页显示行数
 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }
 // 获取每页显示的行数
 public int getPageSize() {
  return pageSize;
 }
 // 首页
 public void first() {
  currentPage = 1;
  startRow = 0;
 }
 // 前一页
 public void previous() {
  if (currentPage == 1) {
   return;
  }
  currentPage--;
  startRow = (currentPage - 1) * pageSize;
 }
 // 下一页
 public void next() {
  if (currentPage < totalPages) {
   currentPage++;
  }
  startRow = (currentPage - 1) * pageSize;
 }
 // 最后一页
 public void last() {
  currentPage = totalPages;
  startRow = (currentPage - 1) * pageSize;
 }
 // 刷新页码
 public void refresh(int _currentPage) {
  currentPage = _currentPage;
  if (currentPage > totalPages) {
   last();
  }
 }
 
 /**
  * 获得下一页的页码 如果当前页码+1大于等于最大页数,
  * 则下一页的页码为最大页数 否则下一页的页码为当前页码+1
  */
 public int getNext() {
  if (currentPage +1 >= totalPages) {
   return totalPages;
  } else {
   return currentPage+1 ;
  }
 }
 
 // 获取前一页的页码
 public int getPrevious() {
  if (currentPage - 1 <= 1) {
   return 1;
  } else {
   return currentPage - 1;
  }
 }

 // 判断是否存在下一页
 public boolean hasNext() {
  return currentPage < getTotalPages();
 }

 // 判断是否存在上一页
 public boolean hasPrevious() {
  return currentPage > 1;
 }

 // 判断是否是第一页
 public boolean isFirst() {
  return currentPage == 1;
 }

 // 判断是否是最后一页
 public boolean isLast() {
  return currentPage == getTotalPages();
 }
 
 
 /**
  * 产生js代码
  *
  * @param url
  * @return
  */
 public static String getJavascript(String url) {
  StringBuffer sb = new StringBuffer();
  sb.append("function goPage(pageNumber)/r/n");
  sb.append("{/r/n");
  sb.append("      window.self.location='" + url
    + "?pageNumber='+pageNumber+'&pageSize='+pageSize.value+'';/r/n");
  sb.append("}/r/n");
  return sb.toString();

 }

 /**
  * 产生html代码
  * @param total
  * @return
  */
 public String getNavigate(){
  
  setTotalPages();
   
  StringBuffer buf = new StringBuffer();

  buf.append("<font color='#365f91'>共"+ totalRows+ "条记录&nbsp;"+ pageSize+ "条/页&nbsp;&nbsp;");
  buf.append("第"+ currentPage+ "页/共"+ totalPages+ "页&nbsp;&nbsp;");
  
  // 判断 "首页" 链接是否显示
  if(isFirst()){
   buf.append("[首页]&nbsp;"); 
   }
  else{
   buf.append("[<a href='javascript:goPage(1)' target='_self'>首页</a>]&nbsp;");
  }

  // 判断 "上一页" 链接是否显示
  if (hasPrevious()) {
   buf.append("[<a href='javascript:goPage(" + getPrevious()
     + ")' target='_self'>上一页</a>]&nbsp;");
  } else {
   buf.append(" [上一页]&nbsp;");
  }

  // 判断 "下一页" 链接是否显示
  if (hasNext()) {
   buf.append("[<a href='javascript:goPage(" + getNext()
     + ")' target='_self'>下一页</a>]&nbsp;");
  } else {
   buf.append("[下一页]&nbsp;");
  }

  // 判断 "尾页" 链接是否显示
  if(isLast()){
   buf.append("[尾页]&nbsp;转到"); 
  }
  else{
   buf.append("[<a href='javascript:goPage(" + totalPages
    + ")' target='_self'>尾页</a>]&nbsp;转到");
  }
  
  // 转到第几页选择框
  // 用onchange方法轻松搞定转向
  buf.append("<select name=select' onchange='javascript:goPage(this.options[this.selectedIndex].value)'>");

  for (int x = 1; x <= getTotalPages(); x++) {
   buf.append("<option value=" + x +"");
   if (currentPage == x) {
    buf.append(" selected ");
   }
    buf.append(">第" + x + "页</option>");
  }
  buf.append("</select>");
  buf.append("每页");
  buf.append("<input type=text size=4 style='text-align:center;height:17px' class=text name=pageSize " +
        "value='"+pageSize+"'  >&nbsp;&nbsp;</font>");
  
  return buf.toString();
 }
 
 
 public static Pager getInstance(HttpServletRequest request,int total){
  Pager cPager = new Pager();
  String pNum = request.getParameter("pageNumber");
  if (pNum == null||pNum == "") pNum = "1";
  int intpNum = Integer.parseInt(pNum);
  
  
  String pSize = request.getParameter("pageSize");  
  if (pSize == null||pSize == "") pSize = "25";
  int intpSize = 0;
  try{
   intpSize = Integer.parseInt(pSize);
  }catch (NumberFormatException nfe){
   intpSize = 20;
   //nfe.printStackTrace();
  }
  cPager.currentPage = intpNum;
  cPager.pageSize = intpSize;
  cPager.totalRows = total;
  
  return cPager;
 }
}

***************************************************************

4)UserDAO.java

package Test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class UserDAO {

 /**
  * 根据指定的页码范围查找数据
  * @param pageSize
  * @param pageNumber
  * @return
  */
 public static ArrayList<UserInfo> getUsers(int pageSize, int pageNumber) {
  

// SQL Server写法
//  String sql = "select top " + pageSize + " * from userinfo"
//    + " where id not in " + "(select top "
//    + ((pageNumber - 1) * pageSize)
//    + " id from userinfo order by id)" + " order by id";

//  oracle写法   
//  String sql1 ="select * from " +
//    "(select rownum r,userinfo.* from userinfo  " +
//    "where rownum < "+((pageNumber - 1) * pageSize + pageSize)+"t2 where t2.r >= "+((pageNumber - 1) * pageSize)+"";

 

  if(((pageNumber - 1) * pageSize)<0)
   return null;
  
  String sql = "select * from userinfo order by id asc limit "
    + (pageNumber - 1) * pageSize + "," + pageSize;

  ArrayList<UserInfo> UserInfoList = new ArrayList<UserInfo>();

  Connection conn = null;
  Statement st = null;
  ResultSet rs = null;

  try {
   conn = DB.getConn();
   System.out.println(sql);
   st = conn.createStatement();
   rs = st.executeQuery(sql);
   
   while (rs.next()) {
    UserInfo user = new UserInfo();
    user.setId(rs.getInt("id"));
    user.setUsername(rs.getString("username"));
    user.setAge(rs.getString("age"));
    UserInfoList.add(user);
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   DB.closeRs(rs);
   DB.closeStmt(st);
  }
  return UserInfoList;
 }

 /**
  * 返回总记录数
  * @return
  */
 public static int getCount() {
  String sql = "select count(*) from userinfo";
  int count = 0;

  Connection conn = null;
  Statement st = null;
  ResultSet rs = null;

  try {
   conn = DB.getConn();
   st = conn.createStatement();
   rs = st.executeQuery(sql);

   while (rs.next()) {
    count = rs.getInt(1);
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   DB.closeRs(rs);
   DB.closeStmt(st);
  }
  System.out.println("sql记录数:"+count);
  return count;
 }

}
***************************************************************
5)jsp页面 pageTest.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
 pageEncoding="GB18030"%>
<%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="Test.*"%>
<%@ page import="java.util.*"%>
<%
 int total = UserDAO.getCount();
 Pager pager = Pager.getInstance(request,total); 
 String htmlcode = pager.getNavigate();
 String pageNum = request.getParameter("pageNumber");
 int pageNumber = 1;
 if (pageNum == null || pageNum=="" ) {
  pageNumber = 1;
 } else {
  pageNumber = Integer.parseInt(pageNum);
 }
 
 ArrayList<UserInfo> al = UserDAO.getUsers(pager.getPageSize(),pageNumber);
 request.setAttribute("users", al);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
  <script type="text/javascript">
<%=Pager.getJavascript(request.getRequestURI())%>
</script>
 <style>
        <!--
            body{
                .p{
                    PADDING-LEFT: 18px; FONT-SIZE: 14px; WORD-SPACING: 4px
                }
            }
        -->
        </style>
<title>Page Test5</title>
 </head>
 <body>
  <!-- 在列表数据为空的时候,要显示的提示信息 -->
  <c:if test="${empty users}">
   <tr>
    <td colspan="7">
     <font color="red">没有找到相应的记录</font>
    </td>
   </tr>
  </c:if>
  <!-- 列表数据不为空的时候,要显示的数据 -->
  <c:if test="${!empty users}">
   <table border="1">
   <tr>
   <td>
   id
   </td>
   <td>
   name
   </td>
   <td>
   age
   </td>
   </tr>
    <c:forEach items="${users}" var="user">
     <tr>
      <td>
       <c:out value="${user.id }"></c:out>
      </td>
      <td>
       <c:out value="${user.username }"></c:out>
      </td>
      <td>
       <c:out value="${user.age }"></c:out>
      </td>
     </tr>
    </c:forEach>
   </table>
   <br>
   <%=htmlcode%>
  </c:if>
 </body>
</html>

 

 

原创粉丝点击