论坛首页 Java版 Spring

分享一个通用数据库分页方案

浏览 27257 次
该帖已经被评为良好帖
作者 正文
时间:2006-09-21 关键字: struts 模式
subversion地址如下:
https://svn.sourceforge.net/svnroot/powerstone/ps_paging
技术架构:
web层可以是任意的MVC框架,目前只实现了SpringMVC和Struts的版本(Struts版已经在weblogic7下跑通,tomcat5还不行);
dao层也没有任何限制,只要按照范例中的模式来做既可;
最终页面上用一个标签来显示翻页按钮等。
btw:谁有兴趣想写个webwork版本的,可以和我联系,或直接发个patch给我
---------------------------------
工作原理:想法很简单,就是应用设计模式里的"模板方法模式",把分页计算的逻辑封装在一个抽象父类(PagingController)里面,留下三个抽象方法:doHandleRequest(处理请求)、getTotalRecordsNumber(计算总记录数)、makeSearchCriteria(构造查询条件,可选)供子类型重写,使得子类型尽量的简单,让我们可以专注于业务逻辑而不需要处理分页逻辑。示例如下:
public class UserPagingController extends PagingController {
	private final Logger logger = Logger.getLogger(this.getClass());
	private UserDAO userDAO;
	protected ModelAndView doHandleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		Map map = super.getSearchCriteria(request);
		int beginNo = super.computeRecordsBeginNo(request);
		int recordsNumber = super.computeRecordsNumberToRead(request);
		List usersList = userDAO.findUsers(map, beginNo, recordsNumber);
		logger.debug(usersList);
		return new ModelAndView("usersList", "usersList", usersList);
	}
	protected int getTotalRecordsNumber(HttpServletRequest request) {
		int result = userDAO.countUsers(super.getSearchCriteria(request));
		logger.debug("users number================:" + result);
		return result;
	}
	protected Map makeSearchCriteria(HttpServletRequest request) {
		HashMap map = new HashMap();
		String firstName = request.getParameter("firstName");
		if (firstName != null && firstName.trim().length() > 0) {
			map.put("firstName", firstName);
		}
		logger.debug(map);
		return map;
	}
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
}

Struts版原理相同。
在页面显示翻页链接只需一行代码:
<page:pagebar url="/user_query.html?" bordercolor="#F4F9FF" bgcolor="#F4F9FF"/>
   
时间:2006-09-21
例子程序
   
0 请登录后投票
时间:2006-09-21
不错,看看先,不知道有多通用?
   
0 请登录后投票
时间:2006-09-21
楼主说说如何实现数据库间通用,又保证效率?
   
0 请登录后投票
时间:2006-09-21
Ivan Li 写道
楼主说说如何实现数据库间通用,又保证效率?

这个分页方案只是用“模板方法”模式把分页逻辑封装在了前端控制器,因为我发现分页最麻烦的地方就是在action里面算页数、记录数这些东西。
所以说,这个方案与数据库访问方法无关,自燃就在数据库间通用了。
和效率相关的地方是:每显示一页数据都至少访问两次数据库,分别是计算总记录数和查询当前页记录
   
0 请登录后投票
时间:2006-09-21
我认为分页封装在一个POJO里,最好!
层次定位在于PO,VO一个档次!
   
0 请登录后投票
时间:2006-09-21
有个问题
为什么必须查两次?
如果不知道总数会怎么样?
如果一个查询不需要总数可不可以完成?
   
0 请登录后投票
时间:2006-09-21
是的,需要查询2次,你可以把查询2次封装在一个方法里做啊!
写2个<select>后记下ID,传入方法!一个count,一个查询!
   
0 请登录后投票
时间:2006-09-21
抛出异常的爱 写道
有个问题
为什么必须查两次?
如果不知道总数会怎么样?
如果一个查询不需要总数可不可以完成?

不计算总数就没法计算总页数呀
   
0 请登录后投票
时间:2006-09-21
galaxystar 写道
是的,需要查询2次,你可以把查询2次封装在一个方法里做啊!
写2个<select>后记下ID,传入方法!一个count,一个查询!


邪恶的EJB???


PS:
有必要让别人看到总页数么?
个人认为除了统计以外
很少人会用到总页数这种东西
大家关心的大多是头1-3页的东西

总页数需求多少来自程序员的过度设计。。。。
如果总页数不要可以提高查询的20%速度并减少30%的代码量
十在是大浪费啊
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐