📄 java分页大全.txt
字号:
这个文章共有 1 条评论,共 1 页
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$$$$$$$$$$$$$$$$JSP页面查询显示常用模式
1.直接使用ResultSet
2.Value Object
3.hashmap key,value
4.RowSet
------------------------
1.直接使用ResultSet
最大众化的方法,
原文中忽略了这一方法,偶给加上了
代码略
2.
使用Value Object。将每条记录均封装成JavaBean对象,把这些对象装入Collection传送给JSP显示
。这种方法的缺点是每一种查询都需要定义一个java class,并且将记录数据封装成java对象时也需要很
多额外的代码。
示例代码:
//查询数据代码
Connection conn = DBUtil.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try{
String sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
ResultSet rs = pst.executeQuery();
List list = new ArrayList();
Employee emp;
while (rs.next()){
emp = new Employee();
emp.setReakName(rs.getString(“real_name”));
emp.setEmpCode(rs.getString(“emp_code”));
…
list.add(emp);
}
return list;
}finally{
DBUtil.close(rs, pst ,conn);
}
//jsp显示部分代码
<%
List empList = (List)request.getAttribute(“empList”);
if (empList == null) empList = Collections.EMPTY_LIST;
%>
…
<table cellspacing="0" width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr>
<%
Employee emp;
for (int i=0; i< empList.size(); i++){
emp = (Employee) empList.get(i);
%>
<tr>
<td><%= emp.getEmpCode()%></td>
<td><%= emp.getRealName()%></td>
</tr>
<%
}// end for
%>
</table>
3.
使用hashmap作为数据容器。
具体做法:
1. 生成一个List对象(List list = new ArrayList() )。
2. 生成一个Map对象(Map map = new HashMap() )。使用Map封装一行数据,key为各字段名,value
为对应的值。(map.put(“USER_NAME”), rs.getString(“USER_NAME”))
3. 将第2 步生成的Map对象装入第1步的list对象中(list.add(map) )。
4. 重复2、3步直到ResultSet遍历完毕
在DBUtil. resultSetToList(ResultSet rs)方法中实现了上述过程(所有列名均使用大写),可参考使用。
HashMap map = null;
while(rs.next(){
map = new HashMap();
map.put("Field1",rs.getString("Field1"));
map.put("Field2",rs.getString("Field2"));
*****
map.put("fieldn",rs.getString("fieldn"));
}
以上是写死的,
可以使用ResultSetMetadata进行干净彻底的一次性封装,
可以取到rs中所有字段名
String name = null;
ResultSetMetaData rsmd = rs.getMetaData();
int num = rsmd.getColumnCount();
int i = 0;
while(rs.next()){
for(i=1;i<=num;i++){
name = rsmd.getColumnName(i);
map.put("name",rs.getString("rs"));
}/*end for*/
}/*end while*/
示例代码:
//查询数据部分代码:
…
Connection conn = DBUtil.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try{
String sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
rs = pst.executeQuery();
List list = DBUtil. resultSetToList(ResultSet rs);
return list;
}finally{
DBUtil.close(rs, pst ,conn);
}
//JSP显示部分代码
<%
List empList = (List)request.getAttribute(“empList”);
if (empList == null) empList = Collections.EMPTY_LIST;
%>
…
<table cellspacing="0" width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr>
<%
Map colMap;
for (int i=0; i< empList.size(); i++){
colMap = (Map) empList.get(i);
%>
<tr>
<td><%=colMap.get(“EMP_CODE”)%></td>
<td><%=colMap.get(“REAL_NAME”)%></td>
</tr>
<%
}// end for
%>
</table>
4.
使用RowSet。
RowSet是JDBC2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是
oracle.jdbc.rowset.OracleCachedRowSet。 OracleCachedRowSet实现了ResultSet中的所有方法,但与
ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭后仍然有效。
oracle的rowset实现在http://otn.oracle.com/software/content.html的jdbc下载里有,名称是
ocrs12.zip
示例代码:
//查询数据部分代码:
import javax.sql.RowSet;
import oracle.jdbc.rowset.OracleCachedRowSet;
…
Connection conn = DBUtil.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try{……
String sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
rs = pst.executeQuery();
OracleCachedRowSet ors = newOracleCachedRowSet();
//将ResultSet中的数据封装到RowSet中
ors.populate(rs);
return ors;
}finally{
DBUtil.close(rs, pst, conn);
}
//JSP显示部分代码
<%
javax.sql.RowSet empRS = (javax.sql.RowSet) request.getAttribute(“empRS”);
%>
…
<table cellspacing="0" width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr>
<%
if (empRS != null) while (empRS.next() ) {
%>
<tr>
<td><%= empRS.get(“EMP_CODE”)%></td>
<td><%= empRS.get(“REAL_NAME”)%></td>
</tr>
<%
}// end while
%>
</table>
适用场合:
1.ResultSet适合于短平快项目,纯JSP方案最适合
2.value object
使用于定制的查询操作,个人认为该方法比较SB,而许多人却乐此不疲,
如果使用struts,ibatis,hibernate等开发基本上属于此中模式,
使用value object其实还是一个比较重量级的方案,如果不使用
EJB或web sevice等分布式方案,确实没有使用value object的必要,
大家都倡导轻量级的解决方案,为何不更轻松些,使用方法1或3,
写一大堆value bean,无论是从开发工作量和维护上都是一个噩梦
3.HashMap充当数据容器
适用于多条查询语句或需要对查询结果进行处理的情况。
该方法比较不错,灵活机动,适用范围广,
纯JSP,EJB,WEB SERVICE均适用
4.RowSet
适合于单条查询语句,适用于快速开发。
RowSet本身就是一种数据容器,其功能与hashmap差不多,
方法3可以取代方法4
版权声明 本篇文章对您是否有帮助? 投票: 是 否 投票结果:
作者其它文章:
jdbc驱动导致的中文问题
在项目中使用Struts-menu
企业管理软件的需求描述方法
web开发中的多条件查询处理技巧1则
valuelist简介
作者全部文章
评论人:robornet 参与分: 636 专家分: 55 来自: 阳光岛
发表时间: 2005-04-26 08:41
??得不?,?何第二?方法?第三?方法的示例代?一?呢?
评论人:robornet 参与分: 636 专家分: 55 来自: 阳光岛
发表时间: 2005-04-26 08:42
总结得不错,为何第二种方法与第三种方法的示例代码一样呢?
评论人:giscat 参与分: 16832 专家分: 1787 发表时间: 2005-04-26 08:50
方法2,3不一样的把,
2要写valuebean
3使用hashmap充当数据容器,
把每条记录都放到一个hashmap中,然后把
hashmap放到list里
评论人:giscat 参与分: 16832 专家分: 1787 发表时间: 2005-04-26 09:03
改了一下
HashMap map = null;
while(rs.next(){
map = new HashMap();
map.put("Field1",rs.getString("Field1"));
map.put("Field2",rs.getString("Field2"));
*****
map.put("fieldn",rs.getString("fieldn"));
}
以上是写死的,
可以使用ResultSetMetadata进行干净彻底的一次性封装,
可以取到rs中所有字段名
String name = null;
ResultSetMetaData rsmd = rs.getMetaData();
int num = rsmd.getColumnCount();
int i = 0;
while(rs.next()){
for(i=1;i<=num;i++){
name = rsmd.getColumnName(i);
map.put("name",rs.getString("rs"));
}/*end for*/
}/*end while*/
这个文章共有 4 条评论,共 1 页
上一篇文章 返回〔JSP/Servlet/JSF〕
下一篇文章
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$$$$$$$$$$$$$$$$JSP分页技术实现
title: JSP分页技术实现
summary:使用工具类实现通用分页处理
author: evan_zhao
email: evan_zhao@hotmail.com
目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。
其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。
至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。
在oracle数据库中查询结果的行号使用伪列ROWNUM表示(从1开始)。例如select * from employee where rownum<10 返回前10条记录。但因为rownum是在查询之后排序之前赋值的,所以查询employee按birthday排序的第100到120条记录应该这么写:
[pre] select * from (
select my_table.*, rownum as my_rownum from (
select name, birthday from employee order by birthday
) my_table where rownum <120
) where my_rownum>=100
[/pre]
mySQL可以使用LIMIT子句:
select name, birthday from employee order by birthday LIMIT 99,20
DB2有rownumber()函数用于获取当前行数。
SQL Server没研究过,可以参考这篇文章:http://www.csdn.net/develop/article/18/18627.shtm
在Web程序中分页会被频繁使用,但分页的实现细节却是编程过程中比较麻烦的事情。大多分页显示的查询操作都同时需要处理复杂的多重查询条件,sql语句需要动态拼接组成,再加上分页需要的记录定位、总记录条数查询以及查询结果的遍历、封装和显示,程序会变得很复杂并且难以理解。因此需要一些工具类简化分页代码,使程序员专注于业务逻辑部分。下面是我设计的两个工具类:
PagedStatement 封装了数据库连接、总记录数查询、分页查询、结果数据封装和关闭数据库连接等操作,并使用了PreparedStatement支持动态设置参数。
RowSetPage 参考PetStore的page by page iterator模式, 设计 RowSetPage用于封装查询结果(使用OracleCachedRowSet缓存查询出的一页数据,关于使用CachedRowSet封装数据库查询结果请参考JSP页面查询显示常用模式)以及当前页码、总记录条数、当前记录数等信息, 并且可以生成简单的HTML分页代码。
PagedStatement 查询的结果封装成RowsetPage。
下面是简单的使用示例:
//DAO查询数据部分代码:
…
public RowSetPage getEmployee(String gender, int pageNo) throws Exception{
String sql="select emp_id, emp_code, user_name, real_name from employee where gender =?";
//使用Oracle数据库的分页查询实现,每页显示5条
PagedStatement pst =new PagedStatementOracleImpl(sql, pageNo, 5);
pst.setString(1, gender);
return pst.executeQuery();
}
//Servlet处理查询请求部分代码:
…
int pageNo;
try{
//可以通过参数pageno获得用户选择的页码
pageNo = Integer.parseInt(request.getParameter("pageno") );
}catch(Exception ex){
//默认为第一页
pageNo=1;
}
String gender = request.getParameter("gender" );
request.setAttribute("empPage", myBean.getEmployee(gender, pageNo) );
…
//JSP显示部分代码
<%@ page import = "page.RowSetPage"%>
…
<script language="javascript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -