从struts的ActionForm的自动填充想到的分页方法

funcreal 2005-05-25 05:42:48
前日看到网上有帖子,可以利用java的反射机制来进行ActionForm的自动填充。感觉不错,为程序员省了大力气了。下面结合分页的一些思想和技巧来谈谈这种应用。提出来大家批评:
和上次一样,我只说思想和简单的代码。新手不要试图从这里找到一个现成的分页。

先说说目标吧:
1。告别代码的混沌时代。
2。提高访问数据库效率,减少内存占用量。
3。对连接的使用更合理,存取完数据即关闭连接。
4。数据对象化,强调类型安全。
缺点:
对象类型化了,但是它的所有的字段都需要是String类型的(有个方法可以解决)。

开始:
1。这一点可以通过使用MVC框架来解决,就算不用框架,你也完全可以把分页代码提取出来,放到类中去执行。不要写在页面上,那样你只是在复制代码,不是在复用。
2。用存储过程来读取数据,建议写一个专门的分页存储过程(网上可以下到),让他只读取当前页的数据,这样比你把数据都读进程序,再用程序选择当前页数据快得多的多得多,内存省得多的多得多。插一句,据我观察,虽然Hibernate可以很好的支持分页,但是在对sqlserver进行读取的时候,她好像不是只读取当前页,而是读取当前页最后一行之前的所有纪录,然后通过程序来读取当前页。所以就算你用hibernate,还是建议你写个存储过程。
3。读出数据后,把数据放到List里面,马上关闭连接,然后页面从List里面读取数据。好多人不这样写不是因为考虑效率,而是因为写很多bean出来还得使用好多set方法来设置属性值,麻烦!
4。你当然不希望从List里读到的仅仅是无类型的bean,那么我们就说说开头的方法了。
写一个标准的Bean先,要求各个属性名称必须和数据库的列相同。然后想象有这样一个方法:
public static List selectBeans(Class beanClass, Connection conn, String sql) throws SQLException
他返回的是你的Bean类型的对象组成的List,多美妙阿。你将省去多少代码?利用反射就可以实现的。
我建议大家表把conn放到方法里面去声明,那样增加了耦合性。下面是一个是一个示意性的实现:
package com.funcreal.db;

import java.util.*;
import java.sql.*;
import java.lang.reflect.*;

public class DBBeanUtil {
public static void main(String[] args) {

}

public static List selectBeans(Class beanClass, Connection conn, String sql) throws Exception {
List beans = new ArrayList();
PreparedStatement st = null;
ResultSet rs = null;
try {
st = conn.prepareStatement(sql);
rs = st.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
Object bean = beanClass.newInstance();
for (int i = 1; i <= columnCount; i++) {
String value = rs.getString(i);
Method m = bean.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)), new Class[] {String.class});//取得bean的一个set方法
m.invoke(bean, new Object[] {value});//执行这个set方法
}
beans.add(bean);
}
} finally {//这里你自己判断空最好rs可能为空
rs.close();
st.close();
conn.close();
}
return beans;
}

public static String getSetMethodName(String columnName) {
return "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
}
}
到这里,似乎和分页还没有关系。那么继续吧:
写一个用来分页的类,它至少应该有这些字段:
private int rowCount = 0; //行数
private int pageCount; //页数
private int pageNum; //当前页数
private int pageSize; //每页行数
private List datas = new Vector();
其中pageNum和pageSize应该留给使用者设置,其他的应该是由这个类来计算了。
那么还必须提供一个getDatas方法,这个方法返回当前页的数据。你可以利用前面的那个类来完成这个操作。稍微需要动动脑子的地方可能就是如何获取总行数了,不管你是在这个类外面获得也好,还是在这个类里面读取也好,随你便了。
那么页面到底是什么样的?
...全文
272 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Times2001 2005-05-26
  • 打赏
  • 举报
回复
没看懂:

1。告别代码的混沌时代。》》用struts不就是这个目的嘛?和分页有关系嘛
2。提高访问数据库效率,减少内存占用量。》》我怎么没见你用存储过程啊?
3。对连接的使用更合理,存取完数据即关闭连接。》》大家不都是这样嘛?没人把rs返回到页面吧?
4。数据对象化,强调类型安全。》》应该的!

自动填充?在哪里用到了??
wwwtom 2005-05-26
  • 打赏
  • 举报
回复
思想比较乱,页面最好别出现SQL,
su27007 2005-05-26
  • 打赏
  • 举报
回复
-------------------------------------------------------------------------
对象类型化了,但是它的所有的字段都需要是String类型的(有个方法可以解决)。
-------------------------------------------------------------------------
这个问题你提出来了,不过没有提供解决方法啊,可以讲得详细一些吗?
funcreal 2005-05-26
  • 打赏
  • 举报
回复
根hibernate没什么关系的,只不过我的实现用了他,但我没用它来分页
zhangsheng791 2005-05-26
  • 打赏
  • 举报
回复
代码好乱啊!!没有说明第一部代码到底怎么使用啊!!
第二部还是用了hibernate啊!!对了借帖子问一下哪里有hibernate的书籍俺想学一下?
loveyousomuch 2005-05-26
  • 打赏
  • 举报
回复
呵呵,不错不错
coolcoal 2005-05-26
  • 打赏
  • 举报
回复
mark!!
wzy19514 2005-05-26
  • 打赏
  • 举报
回复
qingzhuang 2005-05-26
  • 打赏
  • 举报
回复
看了一下,觉得把HQL 放在jsp 中不好看
MARS.nEIL 2005-05-26
  • 打赏
  • 举报
回复
学习..
funcreal 2005-05-26
  • 打赏
  • 举报
回复
你们这帮家伙,看没看就顶?
crazer2003 2005-05-26
  • 打赏
  • 举报
回复
感觉好像还不错
funcreal 2005-05-26
  • 打赏
  • 举报
回复
2。提高访问数据库效率,减少内存占用量。》》我怎么没见你用存储过程啊?
我都说了是个示意性的实现,且不完整,表吹毛求疵。
3。对连接的使用更合理,存取完数据即关闭连接。》》大家不都是这样嘛?没人把rs返回到页面吧?
好像没那么理想吧,很多提问的新手不都是直接在页面写rs吗?
funcreal 2005-05-26
  • 打赏
  • 举报
回复
时间比较紧,写的是挺乱的。


对象类型化了,但是它的所有的字段都需要是String类型的(有个方法可以解决)。

可以根据rsmd.getColumnClassName();来得到列对应的java的类型。这同时需要你的每个字段必须和数据库类型定义的相同。
s_phoenix 2005-05-26
  • 打赏
  • 举报
回复
描写是有点混乱
kaleon 2005-05-25
  • 打赏
  • 举报
回复
好想法,顶一下。
querlang 2005-05-25
  • 打赏
  • 举报
回复
有收获,楼主加油
飞行的兔子 2005-05-25
  • 打赏
  • 举报
回复
先mark一下,有空再k看!
onlyxu 2005-05-25
  • 打赏
  • 举报
回复
mark,有空来看
funcreal 2005-05-25
  • 打赏
  • 举报
回复
顶就有分。大家支持。如果有好的分页心得大家都拿出来分享,我会作一个总结的
加载更多回复(1)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧