结果集到分页

时间:2009-12-31 20:30:11

标签: java jsp jdbc pagination

如何将Resultset对象转换为JSP上的分页视图?

例如,这是我的查询和结果集:

pst = con.prepareStatement("select userName, job, place from contact");
rs = pst.executeQuery();

5 个答案:

答案 0 :(得分:39)

首先,您需要向JSP添加一个或两个额外的请求参数:firstrow和(可选)rowcountrowcount也可以保留,并完全在服务器端进行定义。

然后向JSP添加一堆分页按钮: next 按钮应指示Servlet增加firstrow的值,其值为{{1} }。 上一个按钮显然应减少rowcount的值,其值为firstrow。不要忘记正确处理负值和溢出!你可以借助rowcount

来做到这一点

然后触发特定的SQL查询以检索结果的子列表。但确切的SQL语法取决于使用的DB。在MySQL和PostgreSQL中,使用SELECT count(id)LIMIT子句很容易:

OFFSET

在Oracle中,您需要一个带有private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM" + " contact ORDER BY id LIMIT %d OFFSET %d"; public List<Contact> list(int firstrow, int rowcount) { String sql = String.format(SQL_SUBLIST, firstrow, rowcount); // Implement JDBC. return contacts; } 子句的子查询,它应该如下所示:

rownum

在DB2中,您需要OLAP函数private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM" + " (SELECT id, username, job, place FROM contact ORDER BY id)" + " WHERE ROWNUM BETWEEN %d AND %d"; public List<Contact> list(int firstrow, int rowcount) { String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount); // Implement JDBC. return contacts; }

row_number()

我不做MSSQL,但它在语法上与DB2类似。另请参阅this topic

最后,只需使用JSTL c:forEach以常规方式在JSP页面中显示子列表。

private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
    + " (SELECT row_number() OVER (ORDER BY id) AS row, id, username, job, place"
    + " FROM contact) AS temp WHERE row BETWEEN %d AND %d";

public List<Contact> list(int firstrow, int rowcount) {
    String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);

    // Implement JDBC.
    return contacts;
}

请注意,某些可能建议您需要<table> <c:forEach items="${contacts}" var="contact"> <tr> <td>${contact.username}</td> <td>${contact.job}</td> <td>${contact.place}</td> </tr> </c:forEach> </table> <form action="yourservlet" method="post"> <input type="hidden" name="firstrow" value="${firstrow}"> <input type="hidden" name="rowcount" value="${rowcount}"> <input type="submit" name="page" value="next"> <input type="submit" name="page" value="previous"> </form> 整个表并将SELECT保存在会话范围内并使用List#subList()进行分页。但这远远超过的内存效率,有数千行和多个并发用户。

对于那些对使用List<Contact>组件的JSF / MySQL上下文中的类似答案感兴趣的人,您可能会发现this article很有用。它还包含一些有用的语言无关数学,以使“类似Google”的分页很好地工作。

答案 1 :(得分:3)

这个Oracle示例是错误的。

是的,在外部选择具有良好的ROWNUM值,但它仍然是伪列,所以我们不能使用BETWEEN。我们还需要一个选择。

正确的sql代码是:

SELECT c.*
  FROM (SELECT c.*, ROWNUM as rnum
          FROM (SELECT id, username, job, place FROM contact ORDER BY id) c) c
 WHERE c.rnum BETWEEN 5 AND 10

同志们,使用solid sql string和Statement类是SLOOOW。每次执行时,Oracle都必须解析SQL。

//Slooow example
Satement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from my_table where id = 11");

使用PreparedStatement和绑定参数。

   //Faster example
   PreparedStatement ps = conn.getPrepareStatement("select * from my_table where id = ?");
   ps.setInt(1, 11);

最快的解决方案是将你的sql放在oracle存储过程中,并使用CallableStatement来调用它。

//Fastest example
CallableStatement cs = conn.prepareCall("{? = call my_plsql_function(?)}");
cs.setInt(1, 11);

答案 2 :(得分:2)

以下是您可以做的几件事:

  • 将结果集Marshall到某些对象/记录列表
  • 根据您所需的页面大小,根据结果集确定您将拥有的页数。
  • 根据要在页面上显示的项目数检查所需页面的请求参数和偏移量。因此,如果您在第4页上显示12,则偏移量为48。
  • 根据项目数确定总页数。

  • 根据您确定的偏移量显示您的项目(仅从第48项开始显示)

  • 根据您确定的总页数生成页面数量的分页。

=======

这是你的基本方法。你可以用以下方法调整它:

  • 确定限制查询到页面的方法(但这不会帮助您确定页面大小)
  • 奇特的分页方式
  • 等。

答案 3 :(得分:-1)

查找值列表模式,然后应用它。这通常是处理这类事情的最佳方式。

答案 4 :(得分:-1)

您可以将displaytag用于paigination或resultset,但是您可以从displattag

下载一些jar文件

首先创建一个servlet StudentList.java

public class StudentList extends HttpServlet 

{     public void service(HttpServletRequest request,HttpServletResponse response)抛出ServletException,IOException     {

        ArrayList al=new ArrayList();
        StudentDao stdo=new StudentDao(); // this is DAO Class (Data Acccess Object)

        try
        {
            al=stdo.getStudentList(); //getstudent list dao method
        }
        catch (SQLException e) 
        {
            e.printStackTrace();
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        request.setAttribute("al",al);

        RequestDispatcher rd=request.getRequestDispatcher("StudentPaging.jsp");
        rd.forward(request,response);

}

}

// dao method

public ArrayList getStudentList() throws SQLException,Exception
{
    ArrayList ai=new ArrayList();
    Connection con=null;
    Statement st=null;
    ResultSet rs=null;
    Date dt=new Date();
    SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
    StudentInformation sdata=null;

    con=MyConnection.creatConnection();
    if(con!=null)
    {
        st=con.createStatement();
        String select="select * from STUDENT";
        System.out.println(select);

        rs=st.executeQuery(select);
        if(rs!=null)
        {
            while(rs.next())
            {
                sdata=new StudentInformation();
                sdata.setSid(rs.getString("SID"));
                sdata.setFirstName(rs.getString("FIRSTNAME"));
                sdata.setMiddleName(rs.getString("MIDDLENAME"));
                sdata.setLastName(rs.getString("LASTNAME"));
                dt=rs.getDate("SDATE");
                sdata.setDateofbirth(sdf.format(dt));
                sdata.setGender(rs.getString("GENDER"));
                sdata.setAddress(rs.getString("ADDRESS"));
                sdata.setHigestQulification(rs.getString("HIQULIFICATION"));
                sdata.setLanguageKnow(rs.getString("LANGUAGE"));
                sdata.setHobby(rs.getString("HOBBY"));
                sdata.setTermCondition(rs.getString("TERMCON"));
                ai.add(sdata);
            }
        }
    }
    return ai;
}

enter image description here