JDBC实现分页查询,同时使用动态数据源

方法是通过jdbc来实现分页的,这样做的目的是可以实现多数据库的情况下,都能使用的方法。
但是这个方法貌似会存在性能问题,因为结果集会全部数据查询出来…

public JSONObject query(JSONObject object, int pageIndex, int pageSize) {
    JSONObject result = new JSONObject();
    if(object == null || object.getBoolean("success") == false) {
        result.put("success", false);
        if(object == null) {
            result.put("msg", "没有成功获取到基本对象");
        } else if(object.getString("msg") != null) {
            result.put("msg", object.getString("msg"));
        }
    } else {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        //Statement statement = null;
        ResultSet rs = null;
        try {
            connection = createConnection(object.getString("className"), object.getString("url"), object.getString("user"), object.getString("pwd"));
            String sql = object.getString("sql");
            System.out.println(sql);
            preparedStatement = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            if(pageIndex == 1 && pageSize == 1) {
                rs = preparedStatement.executeQuery();
            } else {
                preparedStatement.setMaxRows(((pageIndex - 1) * pageSize) + pageSize);//查询的最大行数
                //preparedStatement.setMaxRows(pageSize);
                rs = preparedStatement.executeQuery();
                //rs.first();
                rs.absolute((pageIndex - 1) * pageSize + 1);//利用绝对定位定位到结果集的每页第二条数据
                rs.relative(-1);//利用结果集的相对定位定位到每页的第一条数据
            }
            JSONArray datas = new JSONArray();
            JSONArray data = null;
            ResultSetMetaData metaData = null;
            int colnumCount = 0;
            String colnumName = null;
            Object tmp = null;
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Reader reader = null;
            BufferedReader bufferedReader = null;
            char[] chbTmp = null;
            StringBuffer sb = new StringBuffer();
            while(rs.next()) {
                //获取数据
                data = new JSONArray();
                metaData = rs.getMetaData();
                colnumCount = metaData.getColumnCount() + 1;
                for (int i = 1; i < colnumCount; i++) {
                    colnumName = metaData.getColumnName(i);
                    tmp = rs.getObject(colnumName);
                    if(tmp == null) {
                        data.add("");
                    } else {
                        if(tmp.getClass() == Timestamp.class) {
                            data.add(dateFormat.format(tmp));
                        } else if(tmp.getClass() == CLOB.class) {
                            chbTmp = new char[20];
                            reader = rs.getClob(colnumName).getCharacterStream();
                            bufferedReader = new BufferedReader(reader);
                            bufferedReader.read(chbTmp);
                            sb.delete(0, chbTmp.length);
                            sb.append(chbTmp);
                            data.add(sb.toString() + "...");
                        } else {
                            data.add(tmp);
                        }
                    }
                }
                datas.add(data);;
            }
            JSONArray colnums = new JSONArray();
            if(datas.size() > 0) {
                //获取列名
                metaData = rs.getMetaData();
                colnumCount = metaData.getColumnCount() + 1;
                for (int i = 1; i < colnumCount; i++) {
                    colnumName = metaData.getColumnName(i);
                    colnums.add(colnumName);
                }
            } else {
                colnums.add("没有成功获取列的信息");
            }
            result.put("colnum", colnums);
            result.put("datas", datas);
            result.put("success", true);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            result.put("success", false);
            result.put("msg", e.getMessage());
        } catch (SQLException e) {
            e.printStackTrace();
            result.put("success", false);
            result.put("msg", e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            result.put("success", false);
            result.put("msg", e.getMessage());
        } finally {
            close(connection, preparedStatement, rs);
        }
    }
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值