素材网 素材网

今天无意中看到一篇关于Java实现分页代码【上】

xw素材网
0

一. 要分页我们必须要有数据库,所以我们先准备下数据库,其数据库脚步如下:

--以下是创建数据库和数据库表以及向数据库插入数据  use master  

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类的源码:

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;  
    }  
}

查看下篇点击这里http://www.xwcms.net/a/jspzszl/57014.html

@ 2013 xwcms.net . All Rights Reserved. xw素材网 | 备案号:晋ICP备13005902号 联系管理员
×

邮箱订阅

什么是邮箱订阅?

邮箱订阅是xw素材网为jquery爱好者与web程序员提供一项以邮箱的方式发送最新jquery资源与素材资源的模式,用户只需在左侧填写正确的邮箱用户名与邮箱地址我们将每天推荐最新优质资源到用户邮箱。当然每份邮箱都会有一个取消订阅按钮,当用户点击取消按钮时我们将会停止对用户发送邮箱资源推送。再次感谢大家对xw素材网的支持与关注。