jdbc通用sql分页封装

代码



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->    

    

    /**

     * 查询结果的总数,常用的地方就是查询分页时的总记录数

     * @param sql:原始sql语句!

     * @return 查询结果的总数

     * @throws SQLException

     */

    

    public int getsqlcount(String sql) throws SQLException{

        DataBase db = new DataBase();

        this.con = db.getCon();

        String nsql = "select count(*) from (" + sql + ")";

        System.out.println("查询总数的SQL:--->"+nsql);

        try {

            st = con.createStatement();

            rs = st.executeQuery(nsql);

            if (rs.next()) {

                return rs.getInt(1);

            } else {

                return 0;

            }

        } catch (SQLException e) {

            System.out.println("执行查询总数sql异常,不能执行!");

            throw new SQLException(e.toString());

        } finally {

            try {

                if(con!=null)

                    con.close();

                if(st!=null)

                    st.close();

                if(rs!=null)

                    rs.close();

                System.out.println("siyu--getsqlcount-->关闭连接成功!");

            } catch (Exception e) {

                e.printStackTrace();

                System.out.println("关闭数据连接有误!!");

            }

        }

    }



    /**

     * 查找分页的sql语句的数据

     * @param sql 原始sql语句!

     * @param currentpage 当前页

     * @param pagesize 每页大小

     * @return 返回满足该条件的结果集,以List<String[]> 形式返回

     */

    public List<String[]> getsqllistset(String sql, int currentpage, int pagesize) throws SQLException {

        if (currentpage <= 0) {

            currentpage = 1;

        }

        if (pagesize < 1 || pagesize > 100) {

            pagesize = 10;

        }

        int startrow = (currentpage - 1) * pagesize;

        String nsql = "select * from (select a.*, rownum r from (" + sql + ") a where rownum <= " + (startrow + pagesize) + ") where r > " + startrow;

        System.out.println("分页sql语句:" + nsql);

        try {

            DataBase db = new DataBase();

            this.con = db.getCon();

            st = con.createStatement();

            rs = st.executeQuery(nsql);

            ResultSetMetaData rsmd = rs.getMetaData();

            int numberOfColumns = rsmd.getColumnCount();

            System.out.println(numberOfColumns);

            List<String[]> list = new ArrayList<String[]>();

            while (rs.next()) {

                String[] str = new String[numberOfColumns - 1];

                for (int r = 1; r < numberOfColumns; r++) {

                    str[r - 1] = rs.getString(r);

                }

                list.add(str);

            }

            return list;

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("执行查询总数sql异常,不能执行!");

            throw new SQLException(e);

        } catch (Exception e) {

            e.printStackTrace();

            System.out.println("查询数据结果异常,不能执行!");

            return null;

        }

        finally {

            try {

                if(con!=null)

                    con.close();

                if(st!=null)

                    st.close();

                if(rs!=null)

                    rs.close();

                System.out.println("siyu--getsqllistset-->关闭连接成功!");

            } catch (Exception e) {

                System.out.println("关闭数据连接有误!!");

            }

        }

    }



    

    /**

     * 查找分页的sql语句的数据

     * @param sql 原始sql语句!

     * @param currentpage 当前页

     * @param pagesize 每页大小

     * @return 返回满足该条件的结果集,以List<<Map<String,Object>> 形式返回

     */

    public List<Map<String,Object>> getsqlmapset(String sql, int currentpage,int pagesize) throws SQLException {

        if (currentpage <= 0) {

            currentpage = 1;

        }

        if (pagesize < 1 || pagesize > 100) {

            pagesize = 10;

        }

        int startrow = (currentpage - 1) * pagesize;

        String nsql = "select * from (select a.*, rownum r from (" + sql + ") a where rownum <= " + (startrow + pagesize) + ") where r > " + startrow;

        System.out.println("分页sql语句:" + nsql);

        try {

            DataBase db = new DataBase();

            this.con = db.getCon();

            st = con.createStatement();

            rs = st.executeQuery(nsql);

            List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();

            ResultSetMetaData rsmd = rs.getMetaData();

            int numberOfColumns = rsmd.getColumnCount();

            while (rs.next()) {

                Map<String,Object> rsTree = new HashMap<String, Object>(numberOfColumns);

                for (int r = 1; r < numberOfColumns; r++) {

                    rsTree.put(rsmd.getColumnName(r), rs.getObject(r));

                }

                list.add(rsTree);

            }

            return list;

        } catch (SQLException e) {

            e.printStackTrace();

            System.out.println("执行查询总数sql异常,不能执行!");

            throw new SQLException(e);

        } catch (Exception e) {

            e.printStackTrace();

            System.out.println("查询数据结果异常,不能执行!");

            return null;

        }

        finally {

            try {

                if(con!=null)

                    con.close();

                if(st!=null)

                    st.close();

                if(rs!=null)

                    rs.close();

                System.out.println("siyu--getsqlmapset-->关闭连接成功!");

            } catch (Exception e) {

                System.out.println("关闭数据连接有误!!");

            }

        }

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1)该分页组件不依赖任何底层数据库实现,可以根据需要扩展子类进行动态替换;2)同时也不提供页面如何显示上页,下页等;内部提供了源代码实现,以及DEMO应用,实现分页非常简单;<br/>需要做的工作有三个地方<br/>1.继承实现分页的抽象类AbstractPage 的两个抽象方法;<br/>2.调用WebPageUtils.doAction方法传入参数即可<br/>3.直接获取需要满足条件的记录<br/><br/><br/>下面举了一个例子来说明使用方法:<br/><br/>package org.hgg.hq.test;<br/><br/>import java.util.ArrayList;<br/>import java.util.List;<br/><br/>import javax.servlet.http.HttpServletRequest;<br/>import javax.servlet.http.HttpServletRequestWrapper;<br/><br/><br/>import org.hqq.hq.impl.AbstractPage;<br/>import org.hqq.hq.impl.ActionTypes;<br/>import org.hqq.hq.impl.WebPageUtils;<br/><br/><br/>public class DemoPage extends AbstractPage {<br/>//根据要求返回从startRow开始的rowCount条记录,可以使用其他组件来实现或者 JDBC实现都可以<br/>protected List acPageData(int startRow, int rowCount) {<br/>List data=new ArrayList();<br/>//4*2四行二列<br/>String[][] rows={{"1","A"},{"2","B"},{"3","C"},{"4","D"}};<br/>for(int i=1;i<=rowCount&&i<=acTotalRows();i++){<br/>data.add(rows[startRow++]);<br/>}<br/>return data;<br/>}<br/>//返回满足条件的总记录条数<br/>protected int acTotalRows() {<br/><br/>return 4;<br/>}<br/><br/>public static void main(String[] args) {<br/><br/>//1.0得到一个实现的实例<br/>DemoPage page=new DemoPage();<br/>//2.0如果有必要,设置每页显示大小,这里设置每页显示3条记录<br/>page.setPageSize(3);<br/>//3.0 根据需要进行必要设置,这里是显示第2页数据<br/>//根据情况,该方法后面两个参数可以从request中获取<br/>WebPageUtils.doAction(page, ActionTypes.GO_SPECIAL_PAGE,2);<br/>//4.0获取当前页数据<br/>List data=page.getCurrentPageData();<br/><br/>for(Object t:data){<br/>System.out.println(((String[])t)[0]+" : "+((String[])t)[1]);<br/>}<br/><br/>}<br/><br/>}<br/><br/>如果是WEB页面上的分页可以直接使用<br/>List data=WebPageUtils.acPageData(request,DemoPage.class);<br/>就可以得到数据了,其中request中存放了ActionTypes中定义的各个动作;<br/>例如<br/><\% String first= request.getContextPath()+"/fwgl/fycx.do?"+WebPageUtils.ACTION_TYPE+"="+ActionTypes.GO_FIRST_PAGE;<br/>String next= request.getContextPath()+"/fwgl/fycx.do?"+WebPageUtils.ACTION_TYPE+"="+ActionTypes.GO_NEXT_PAGE;<br/><br/>%\><br/>\< \a href="javascript:window.location.href='<\%=first%\>'" class="List_operatelink"\>首页\<br/>\<\a href="javascript:window.location.href='<\%=next%\>'" class="List_operatelink"\>下页\<br/><br/><br/>页面上的显示实现不用做任何分页逻辑,只需简单定义 首页 上页 下页 到 页 即可,他们都在ActionTypes中定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值