我习惯的封装方式是Hashtable+Vector的方式 Hashtable里面的key是数据库字段的名字,Vector就是这个字段的数据 要实现分页每次页面都要传参数给查询方法的,这样才可以知道取那些记录 这是我写的一个程序,有兴趣可以参考一下。 /** * 根据起SQL、始位置、记录数取得结果集 * @param sql SQL语句 * @param pageSize 页面大小,0表示不限制 * @param pageth 当前页数 * @return 装有结果集的Hashtable */ public Hashtable query(String sql, String pageSize, String pageth){ Hashtable resultH = new Hashtable(); resultH.put("rowNum","0"); SqlAccess dbOper = new SqlAccess(dsName); ResultSet rs = dbOper.prepareStatementQuery(sql); int rowNum = 0; try{ if(rs != null){ ResultSetMetaData rsmd = rs.getMetaData(); int max = rsmd.getColumnCount(); //建立存储结果信息的数据结构 for(int i = 0 ; i < max ; i++){ resultH.put(rsmd.getColumnName(i+1),new Vector()); } //处理分页信息 int iPageSize = Integer.parseInt(pageSize.trim()); int offset = 0; //要分页 if(iPageSize != 0){ int iPageth = Integer.parseInt(pageth.trim()); offset = iPageSize*(iPageth - 1); if(offset > 0){ rs.absolute(offset); } int rows = 0; //装数据 Debug.println(resultH.toString()); while(rs.next() && rows < iPageSize){ for(int i = 0 ; i < max ; i++){ ((Vector)resultH.get(rsmd.getColumnName(i+1))).add(rs.getString(i+1).trim()); } rows++; } if(rs.last()){ rowNum = rs.getRow(); resultH.put("rowNum",""+rowNum); } } //不要分页 else{ //装数据 while(rs.next()){ for(int i = 0 ; i < max ; i++){ ((Vector)resultH.get(rsmd.getColumnName(i+1))).add(moiaString.unConvert(rs.getString(i+1))); } } } } } catch(SQLException e){ e.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } finally{ dbOper.close(); } return resultH; }
to yeaker(易克方笑) “用Vector的效率不高,建议你采用其它方法” 那用什么效率高呀?可否探讨一下
用sql效率最高啊。这个话题很久就讨论过了。呵呵,查查以前的帖就有啊
用Vector的效率不高,建议你采用其它方法 方法一,用sql语句, select top PageItem * from table where table_id not in (select top (PageCount-1)*PageItem from table) 起思想就是取小于也数*每页数量的前(每页数量的结果),比如,取第三页20-30,就是取不再前20条的后面的10页。 方法二是用sun.jdbc.rowset.Cachedrowset来操作数据库记录,据说这个工具的功能非常强大。
给你几个函数参考 private static String[] resultSetLabels(ResultSet R) throws SQLException { ResultSetMetaData rsmd = R.getMetaData(); String S[] = new String[rsmd.getColumnCount()]; for (int i = 0; i < S.length; i++) { S[i] = rsmd.getColumnLabel(i + 1); } return S; } private static int resultSetColumnCount(ResultSet R) throws SQLException { ResultSetMetaData rsmd = R.getMetaData(); return rsmd.getColumnCount(); } private static String[] resultSetTypes(ResultSet R) throws SQLException { ResultSetMetaData rsmd = R.getMetaData(); String S[] = new String[rsmd.getColumnCount()]; for (int i = 0; i < S.length; i++) { S[i] = rsmd.getColumnTypeName(i + 1); } return S; } private static String[] resultRowValues(ResultSet R) throws SQLException { String S[] = new String[resultSetColumnCount(R)]; for (int i = 0; i < S.length; i++) { S[i] = R.getString(i + 1); } return S; } private static String[][] vectorToStringMatrix(Vector V) { // V is actually a vector of string-arrays. if (V == null || V.size() == 0) { String[][] R = new String[0][0]; return R; } String[][] R = new String[V.size()][]; for (int i = 0; i < R.length; i++) { R[i] = (String[]) (V.elementAt(i)); } return R; } private static String[][] resultRowsToStringMatrix(ResultSet R) { try { Vector V = new Vector(); // result // V.addElement(resultSetLabels(R)); // table header line while (R.next()) { V.addElement(resultRowValues(R)); } R.close(); return vectorToStringMatrix(V); } catch (SQLException E) { E.printStackTrace(); return null; } }
Hashtable里面的key是数据库字段的名字,Vector就是这个字段的数据
要实现分页每次页面都要传参数给查询方法的,这样才可以知道取那些记录
这是我写的一个程序,有兴趣可以参考一下。
/**
* 根据起SQL、始位置、记录数取得结果集
* @param sql SQL语句
* @param pageSize 页面大小,0表示不限制
* @param pageth 当前页数
* @return 装有结果集的Hashtable
*/
public Hashtable query(String sql, String pageSize, String pageth){
Hashtable resultH = new Hashtable();
resultH.put("rowNum","0");
SqlAccess dbOper = new SqlAccess(dsName);
ResultSet rs = dbOper.prepareStatementQuery(sql);
int rowNum = 0;
try{
if(rs != null){
ResultSetMetaData rsmd = rs.getMetaData();
int max = rsmd.getColumnCount();
//建立存储结果信息的数据结构
for(int i = 0 ; i < max ; i++){
resultH.put(rsmd.getColumnName(i+1),new Vector());
}
//处理分页信息
int iPageSize = Integer.parseInt(pageSize.trim());
int offset = 0;
//要分页
if(iPageSize != 0){
int iPageth = Integer.parseInt(pageth.trim());
offset = iPageSize*(iPageth - 1);
if(offset > 0){
rs.absolute(offset);
}
int rows = 0;
//装数据
Debug.println(resultH.toString());
while(rs.next() && rows < iPageSize){
for(int i = 0 ; i < max ; i++){
((Vector)resultH.get(rsmd.getColumnName(i+1))).add(rs.getString(i+1).trim());
}
rows++;
}
if(rs.last()){
rowNum = rs.getRow();
resultH.put("rowNum",""+rowNum);
}
}
//不要分页
else{
//装数据
while(rs.next()){
for(int i = 0 ; i < max ; i++){
((Vector)resultH.get(rsmd.getColumnName(i+1))).add(moiaString.unConvert(rs.getString(i+1)));
}
}
}
} }
catch(SQLException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
finally{
dbOper.close();
}
return resultH;
}
那用什么效率高呀?可否探讨一下
方法一,用sql语句,
select top PageItem * from table where table_id not in (select top (PageCount-1)*PageItem from table)
起思想就是取小于也数*每页数量的前(每页数量的结果),比如,取第三页20-30,就是取不再前20条的后面的10页。
方法二是用sun.jdbc.rowset.Cachedrowset来操作数据库记录,据说这个工具的功能非常强大。
ResultSetMetaData rsmd = R.getMetaData();
String S[] = new String[rsmd.getColumnCount()];
for (int i = 0; i < S.length; i++) {
S[i] = rsmd.getColumnLabel(i + 1);
}
return S;
} private static int resultSetColumnCount(ResultSet R) throws SQLException {
ResultSetMetaData rsmd = R.getMetaData();
return rsmd.getColumnCount();
} private static String[] resultSetTypes(ResultSet R) throws SQLException {
ResultSetMetaData rsmd = R.getMetaData();
String S[] = new String[rsmd.getColumnCount()];
for (int i = 0; i < S.length; i++) {
S[i] = rsmd.getColumnTypeName(i + 1);
}
return S;
} private static String[] resultRowValues(ResultSet R) throws SQLException {
String S[] = new String[resultSetColumnCount(R)];
for (int i = 0; i < S.length; i++) {
S[i] = R.getString(i + 1);
}
return S;
} private static String[][] vectorToStringMatrix(Vector V) {
// V is actually a vector of string-arrays.
if (V == null || V.size() == 0) {
String[][] R = new String[0][0];
return R;
}
String[][] R = new String[V.size()][];
for (int i = 0; i < R.length; i++) {
R[i] = (String[]) (V.elementAt(i));
}
return R;
} private static String[][] resultRowsToStringMatrix(ResultSet R) {
try {
Vector V = new Vector(); // result
// V.addElement(resultSetLabels(R)); // table header line
while (R.next()) {
V.addElement(resultRowValues(R));
}
R.close();
return vectorToStringMatrix(V);
}
catch (SQLException E) {
E.printStackTrace();
return null;
}
}
我现在取得的记录分为好几种,然后将这几种分别显示。我的做法是:对于每种,都对应不同的Vector。所以很罗嗦,而且每一种的记录数还不一样,到时候分也显示时就存在很多问题!
不知道各位还有什么好建议吗?
装载类的容器我习惯用 ArrayList,可以方便的使用 size() 属性得知里面有多少个对象,分页对象数量应该在生成 ArrayList 前进行限制,不应该把全部记录直接返回到页面上再分页。