Java通用分页
一. 要分页我们必须要有数据库,所以我们先准备下数据库,其数据库脚步如下:
Go
if exists(select * from sysdatabases where name='pagination')
drop database pagination
Go
create database pagination
Go
use pagination
Go
create table userInfo (
[userID] int identity(1,1) primary key not null,
[userName] nvarchar(50) not null,
[userPassword] nvarchar(50) not null,
)
Go
insert userInfo values('xuyesheng','8888')
insert userInfo values('jiaojiao','8888')
insert userInfo values('administrator','888')
insert userInfo values('xuyesheng1','123')
insert userInfo values('xuyesheng2','123')
insert userInfo values('xuyesheng3','123')
insert userInfo values('xuyesheng4','123')
insert userInfo values('xuyesheng5','123')
insert userInfo values('xuyesheng6','123')
Go
select * from userInfo
二: 通用分页的存储过程,如下:
---------------创建存储过程--------------
Go
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
------------------------------------
--
--用途:用于需要分页显示的数据
--时间:2009年08月22日
--描述:通用的存储过程分页程序
--
-------------------------------------
create PROCEDURE [dbo].[GetData]
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@OrderfldName varchar(255), -- 排序字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(500) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @OrderfldName +'] desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @OrderfldName +'] asc'
end
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from ['
+ @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '(['
+ @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @OrderfldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from ['
+ @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '(['
+ @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @OrderfldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end
if @IsCount != 0
begin
if @strWhere != ''
set @strSQL = 'select count(' + @OrderfldName + ') as Total from [' + @tblName + ']'+ ' where ' + @strWhere
else
set @strSQL = 'select count(' + @OrderfldName + ') as Total from [' + @tblName + ']'
end
exec (@strSQL)
--测试下
Go
----参数说明exec [GetData] '表明','查找的列名* 表示查找所有信息','主键',页大小,第几页,非
--表示返回记录数,[排序类型,非则降序排列],条件
--得到分页的数据
exec [GetData] 'userInfo','*','userID',5,1,0,0,null
--得到总共的条数
exec [GetData] 'userInfo','*','userID',5,1,1,0,null
--根据条件查询
exec [GetData] 'userInfo','*','userID',5,1,0,0,' userID like ''%2%'' '
存储过程我们有了我们只要给一下几个参数就OK了
@tblName varchar -- 表名
@fldName varchar -- 字段名
@OrderfldName -- 排序字段名
@PageSize int -- 页尺寸
@PageIndex int -- 页码
@IsCount bit -- 返回记录总数, 非 0 值则返回
@OrderType bit -- 设置排序类型, 非 0 值则降序
@strWhere varchar -- 查询条件 (注意: 不要加 where)
三 通用包
到这里我们先不用急,先将一下三个Java类(Pagination.java Call.java AutoSetData.java)封装一下,然后打成JAR包,以后我们直接导入JAR包即可
Pagination.java
存储过程我们有了我们只要给一下几个参数就OK了
@tblName varchar -- 表名
@fldName varchar -- 字段名
@OrderfldName -- 排序字段名
@PageSize int -- 页尺寸
@PageIndex int -- 页码
@IsCount bit -- 返回记录总数, 非 0 值则返回
@OrderType bit -- 设置排序类型, 非 0 值则降序
@strWhere varchar -- 查询条件 (注意: 不要加 where)
到这里我们先不用急,先将一下三个Java类(Pagination.java Call.java AutoSetData.java)封装一下,然后打成JAR包,以后我们直接导入JAR包即可
Pagination.java
- import java.util.List;
- public class Pagination {
- // 总共的数据量
- private int totle;
- // 每页显示多少条
- private int pageSize;
- // 共有多少页
- private int totlePage;
- // 当前是第几页
- private int index;
- // 数据
- private List data;
- // 连接路径
- private String path;
- public void setTotle(int totle) {
- this.totle = totle;
- }
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
- public void setIndex(int index) {
- this.index = index;
- }
- public void setPath(String path) {
- this.path = path;
- }
- public int getTotle() {
- return totle;
- }
- public int getPageSize() {
- return pageSize;
- }
- public int getTotlePage() {
- return (this.totle + this.pageSize - 1) / this.pageSize;
- }
- public int getIndex() {
- return index;
- }
- public List getData() {
- return data;
- }
- public void setData(List data) {
- this.data = data;
- }
- public String getPageDisplay() {
- StringBuffer displayInfo = new StringBuffer();
- if (index == 0 || pageSize == 0) {
- displayInfo.append("没有分页的信息!");
- } else {
- displayInfo.append("<div class='pager'>");
- displayInfo.append("共" + totle + "条记录每页<span style="color:#FF0000" mce_style="color:#FF0000">" + pageSize
- + "</span>条");
- displayInfo.append("第<span style="color:#FF0000" mce_style="color:#FF0000">" + index
- + "</span>页/共"
- + this.getTotlePage() + "页");
- // 判断如果当前是第一页 则“首页”和“第一页”失去链接
- if (index == 1) {
- displayInfo.append(" 首页 ");
- displayInfo.append("上一页 ");
- } else {
- displayInfo.append(" <a href="" + path
- + "index=1" mce_href="" + path
- + "index=1">首页</a> ");
- displayInfo.append("<a href="" + path + "index=" + (index - 1)
- + "" mce_href="" + path + "index=" + (index - 1)
- + "">上一页</a> ");
- }
- if (index >= this.getTotlePage()) {
- displayInfo.append("下一页 ");
- displayInfo.append("最后一页 ");
- } else {
- displayInfo.append("<a href="" + path + "index=" + (index + 1)
- + "" mce_href="" + path + "index=" + (index + 1)
- + "">下一页</a> ");
- displayInfo.append("<a href="" + path + "index="
- + this.getTotlePage() + "" mce_href="" + path + "index="
- + this.getTotlePage() + "">最后一页</a> ");
- }
- displayInfo.append("</div>");
- }
- return displayInfo.toString();
- }
- }
Pagination.java文件源码我们有了,下面的是Call.java类的源码:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
- import java.util.List;
- public class Call {
- private AutoSetData auto = new AutoSetData();
- public List execProcedure(String driver, String url, String userName,
- String pwd, Object[] ob, Class c) {
- try {
- Class.forName(driver);
- Connection conn = DriverManager.getConnection(url, userName, pwd);
- String sql = "exec GetData ?,?,?,?,?,?,?,null";
- List list = new ArrayList();
- // Ltest是我测试用类,实际操作请注入相关对象,支持set,get,is,read,writer为前缀数据对,更多请继续添加。
- Collection collection = auto.get(conn, c.newInstance().getClass(),
- sql, ob);
- for (Iterator it = collection.iterator(); it.hasNext();) {
- Object obj = c.newInstance();
- list.add(it.next());
- }
- return list;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
AutoSetData.java 自动将数据封装到实体类中
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Collection;
- public class AutoSetData {
- private Object[] beanMatch(Class clazz, String beanProperty) {
- Object[] result = new Object[2];
- char beanPropertyChars[] = beanProperty.toCharArray();
- beanPropertyChars[0] = Character.toUpperCase(beanPropertyChars[0]);
- String s = new String(beanPropertyChars);
- String names[] = { ("set" + s).intern(), ("get" + s).intern(),
- ("is" + s).intern(), ("write" + s).intern(),
- ("read" + s).intern() };
- Method getter = null;
- Method setter = null;
- Method methods[] = clazz.getMethods();
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
- // 只取公共字段
- if (!Modifier.isPublic(method.getModifiers()))
- continue;
- String methodName = method.getName().intern();
- for (int j = 0; j < names.length; j++) {
- String name = names[j];
- if (!name.equals(methodName))
- continue;
- if (methodName.startsWith("set")
- || methodName.startsWith("read"))
- setter = method;
- else
- getter = method;
- }
- }
- result[0] = getter;
- result[1] = setter;
- return result;
- }
- private void beanRegister(Object object, String beanProperty, String value) {
- Object[] beanObject = beanMatch(object.getClass(), beanProperty);
- Object[] cache = new Object[1];
- Method getter = (Method) beanObject[0];
- Method setter = (Method) beanObject[1];
- try {
- // 通过get获得方法类型
- String methodType = getter.getReturnType().getName();
- if (methodType.equalsIgnoreCase("long")) {
- cache[0] = new Long(value);
- setter.invoke(object, cache);
- } else if (methodType.equalsIgnoreCase("int")
- || methodType.equalsIgnoreCase("integer")) {
- cache[0] = new Integer(value);
- setter.invoke(object, cache);
- } else if (methodType.equalsIgnoreCase("short")) {
- cache[0] = new Short(value);
- setter.invoke(object, cache);
- } else if (methodType.equalsIgnoreCase("float")) {
- cache[0] = new Float(value);
- setter.invoke(object, cache);
- } else if (methodType.equalsIgnoreCase("double")) {
- cache[0] = new Double(value);
- setter.invoke(object, cache);
- } else if (methodType.equalsIgnoreCase("boolean")) {
- cache[0] = new Boolean(value);
- setter.invoke(object, cache);
- } else if (methodType.equalsIgnoreCase("java.lang.String")) {
- cache[0] = value;
- setter.invoke(object, cache);
- } else if (methodType.equalsIgnoreCase("java.io.InputStream")) {
- } else if (methodType.equalsIgnoreCase("char")) {
- cache[0] = (Character.valueOf(value.charAt(0)));
- setter.invoke(object, cache);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public Collection get(final Connection connection, final Class clazz,
- String sql,Object[] obj) {
- // 创建PreparedStatement
- CallableStatement ptmt = null;
- // 创建resultset
- ResultSet rset = null;
- // 创建collection
- Collection collection = null;
- try {
- // 赋予实例
- ptmt = connection.prepareCall(sql);
- for (int i = 1; i <= obj.length; i++) {
- ptmt.setObject(i,obj[i-1]);
- }
- rset = ptmt.executeQuery();
- collection = get(rset, clazz);
- } catch (SQLException e) {
- System.err.println(e.getMessage());
- } finally {
- try {
- // 关闭rs并释放资源
- if (rset != null) {
- rset.close();
- rset = null;
- }
- // 关闭ps并释放资源
- if (ptmt != null) {
- ptmt.close();
- ptmt = null;
- }
- } catch (SQLException e) {
- System.err.println(e.getMessage());
- }
- }
- return collection;
- }
- public Collection get(final ResultSet result, final Class clazz) {
- // 创建collection
- Collection collection = null;
- try {
- ResultSetMetaData rsmd = result.getMetaData();
- // 获得数据列数
- int cols = rsmd.getColumnCount();
- // 创建等同数据列数的arraylist类型collection实例
- collection = new ArrayList(cols);
- // 遍历结果集
- while (result.next()) {
- // 创建对象
- Object object = null;
- try {
- // 从class获得对象实体
- object = clazz.newInstance();
- } catch (Exception e) {
- }
- // 循环每条记录
- for (int i = 1; i <= cols; i++) {
- beanRegister(object, rsmd.getColumnName(i), result
- .getString(i));
- }
- // 将数据插入collection
- collection.add(object);
- }
- } catch (SQLException e) {
- System.err.println(e.getMessage());
- } finally {
- }
- return collection;
- }
- }
看这里我们引入了jstl.jar standard.jar sqljdbc.jar pagination.jar四个jar包 缺一不可奥。
下面我们创建一个实体类,代码如下:
- public class UserInfo {
- private int userID;
- private String userName;
- private String userPassword;
- public int getUserID() {
- return userID;
- }
- public void setUserID(int userID) {
- this.userID = userID;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getUserPassword() {
- return userPassword;
- }
- public void setUserPassword(String userPassword) {
- this.userPassword = userPassword;
- }
- }
实体类我们创建完毕,现在我们创建servlet:
- import java.io.IOException;
- 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 com.ant.util.Call;
- import com.ant.util.Pagination;
- import com.xuyesheng.entity.UserInfo;
- public class PageServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doPost(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //取得jsp页面传递来的页数,参数名 index 不可更改
- String index = request.getParameter("index");
- int num = 0;
- if (index == null) {
- num = 1;
- } else {
- num = Integer.parseInt(index);
- }
- //创建封装数据类的对象 call
- Call call = new Call();
- //创建数组存储 存储过程的参数
- Object obj[] = { "userInfo", "*", "userID", 5, num+"", 0+"", 0+"" };
- //调用执行存储过程的方法
- List li = call.execProcedure(
- "com.microsoft.sqlserver.jdbc.SQLServerDriver",
- "jdbc:sqlserver://localhost:1433;databaseName=pagination",
- "sa", "as", obj, UserInfo.class);
- //保存用户名
- List<String> list = new ArrayList<String>();
- //便利集合
- for (int i = 0; i < li.size(); i++) {
- UserInfo ui = (UserInfo) li.get(i);
- list.add(ui.getUserName());
- list.add(ui.getUserPassword());
- }
- //创建 分页对象
- Pagination p = new Pagination();
- //设置页数
- p.setIndex(num);
- //设置页大小
- p.setPageSize(Integer.parseInt(obj[3].toString()));
- //设置总共的条数
- p.setTotle(call.getTotle());
- //设置数据
- p.setData(list);
- //跳转的路径
- p.setPath("page.do?");
- request.setAttribute("page", p);
- request.getRequestDispatcher("index.jsp").forward(request, response);
- }
- }
到这里我们就差一个页面了:
页面代码如下:
- <%@ page language="java" pageEncoding="GBK"%>
- <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <html>
- <head>
- <title>java通用分页显示数据</title>
- </head>
- <body>
- <table width="507" height="160" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#999900">
- <tr>
- <td height="40" align="center" valign="middle" bgcolor="#FF9999"><h2>许业生用java实现通用分页功能</h2></td>
- </tr>
- <tr>
- <td height="35" align="center" valign="middle" bgcolor="#FF9999"><h3>用户名</h3></td>
- </tr>
- <c:forEach items="${requestScope.page.data}" var="li" >
- <tr>
- <td height="35" align="center" valign="middle" bgcolor="#CC99CC" >
- <c:out value="${li}"/>
- </td>
- </tr>
- </c:forEach>
- <tr>
- <td height="40" align="center" valign="middle" ><c:out value="${requestScope.page.pageDisplay}" escapeXml="false"/></td>
- </tr>
- </table>
- </body>
- </html>
其中web.xml文件中的servlet的路径配置如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <servlet>
- <description>通用分页Servlet</description>
- <servlet-name>PageServlet</servlet-name>
- <servlet-class>com.xuyesheng.servlet.PageServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>PageServlet</servlet-name>
- <url-pattern>/page.do</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
到这里我们的通用分页已经结束了,该怎么访问呢?
呵呵 大家肯定比我知道啦!http://localhost:8080/pagination/page.do
大功告成!谢谢给位光临!
然后我们将刚才的三个.java文件打成JAR包,下次我们用的时候直接导入这个jar包就行了
四:项目使用
现在我们新建一个项目测试一下如何使用:
在我们创建项目的时候给项目添加jstl标签支持,我们在页面会用到,项目框架如下:
Java通用分页的更多相关文章
- 用Java实现异构数据库的高效通用分页查询功能
不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...
- 通用分页jsp页面显示
注:本章内容都是在上一篇文章 通用分页后台显示:https://www.cnblogs.com/ly-0919/p/11058942.html 的基础上进行改进,所以有许多的类都在上一篇, 带来不便 ...
- 【转】java通用URL接口地址调用方式GET和POST方式
java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...
- PHP通用分页(Pager)类
三种不同展示方式 附上style~ 1. 效果图1 2.效果图2 3. 效果图3 4. 分页类主体 <?php /** * PHP通用分页类 * show(2) 1 ... 62 63 6 ...
- ReactJS实现的通用分页组件
大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果 ...
- SQL Server 2008 通用分页存储过程
1.alert USE [数据库名称] GO /****** Object: StoredProcedure [dbo].[dbTab_PagerHelper] Script Date: 08/22/ ...
- SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...
- 支持DISTINCT的通用分页存储过程(SQL2005)
/****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...
- ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页
一.实体类或属性名与数据库关键字冲突问题1.实体类名与数据库中的关键字冲突比如:实体表User与oracle中的系统表冲突解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等 ...
- MySql通用分页存储过程
MySql通用分页存储过程 1MySql通用分页存储过程 2 3过程参数 4p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4 ...
随机推荐
- jpa 查询 报错 EntityNotFoundException
背景: 使用JPA查询,串接到另外一张表时,由于没有实际在表格关系中指定外键,而是在实体类中指定外键 导致关联表中的数据被删除时,JPA查询时,报错EntityNotFoundException 方案 ...
- 第1章-JSP 简介
目录 什么是JSP 安装配置JSP运行环境 JSP页面 JSP页面简介 设置Web服务目录 JSP运行原理 JSP 与Java Servlet的关系 HTML与JavaScript 什么是JSP ★ ...
- AI图像放大工具,图片放大无所不能
AI图像放大工具,如ESRGAN,对于提高由Stable Diffusion生成的AI图像质量至关重要.它们被广泛使用,以至于许多Stable Diffusion的图形用户界面(GUI)都内置了支持. ...
- hook拼多多客服软件发消息,拼多多客服机器人代码,拼多多发消息代码
最近由于工作需要,逆向了拼多多客服平台,能调用消息监听.消息发送.根据订单号发起会话,是纯hook实现的,demo包括c++调用demo,c#调用demo.hook 的dll是c++编写的,有需要的人 ...
- vue项目自动导入components
开发项目中一般组件都放在 components 目录下,对于一些高频使用的组件我们需要在入口文件中设置为全局组件, 一个一个搞,很繁琐,这里通过webpack自动挂载components为全局组件. ...
- logisim学习感想(持续更新)
状态机类型 存在两种类型的状态机,分别为mealy型状态机和moore型状态机,在实验中,二者的大体实现如下: 其中从输入到输出的连线只有mealy状态机才有,而moore型则无此线. 区分两种类型的 ...
- word在原有的方框里打勾
按住键盘上的ALT键不放,然后在小键盘区输入"9745"这几个数字,最后松开 ALT 键,自动变成框框中带勾符号.
- 五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)
五,MyBatis-Plus 当中的 "ActiveRecord模式"和"SimpleQuery工具类"(详细实操) @ 目录 五,MyBatis-Plus 当 ...
- USB协议详解第2讲(协议核心学习要点)
USB协议详解第2讲(协议核心学习要点) 看了这么多概念,想必大家会问"我要学会USB协议,并且会编程,我具体要学习那些有关的内容?",这一篇我们将会讲解在学习USB协议中务必要掌 ...
- Failed to connect to github.com port 443: Connection refused问题解决
解决办法: 1.找到github的ip地址:查找链接 2.找到本地的hosts文件.我的hosts文件路劲为:C:\Windows\System32\drivers\etc 3.在hosts文件最后添 ...