从我的角度来看:
- 每个请求都可以封装在一个请求对象中,该对象基本上包含一个偏移量和一个页面大小;
- 每个响应都可以封装在一个响应对象中,该对象基本上会有一个结果列表和一个总数,或者您可以保存用于构建响应的请求对象;
您在数据库上执行选择的界面将类似于:
public PageResponse getPage(PageRequest pageRequest);
这种方法很容易扩展你的分页方法,想象在几个月后你需要对那个方法实现一个排序,你需要改变对它的每次调用。使用这种方法,您可以更改PageRequest
对象并提供默认排序,不会破坏任何内容,您可以仅在真正需要它的调用中自定义排序。
在此方法中,您将需要两个不同的数据库选择:
- 一个是为了检索选择列表(将由响应保存并通过属性 resultList 访问的列表),这可以使用每个数据库的特定功能来限制您的结果集(
top
对于 sybase,limit
对于 mysql 和 PG,rownum
对于 Oracle,这将因一个数据库而异);
- 另一种是在不分页的情况下获取所选记录的总数,以便在大数据集的情况下对数据执行分页。
您的问题的一个很好的参考是Spring Data,它们有Page和PageRequest这或多或少是您需要的。也许您可以使用他们的 API 来实现您的解决方案。
实际上,您的请求对象可能如下所示:
public class PageRequest {
private int offset;
private int pageSize;
// getters and setters and convenience constructors with the given fields
}
public class PageResponse {
private List<?> resultList;
private int total;
// getters and setters and convenience constructors with the given fields
}
当然,您也可以使用泛型来获得您已经请求的响应保存类型,从而促进响应对象的使用,例如:
public <T> PageResponse<T> getPage(PageRequest<T> pageRequest);
具有 Request 和 Response 的对象,例如:
public class PageRequest<T> {
private int offset;
private int pageSize;
// getters and setters and convenience constructors with the given fields
}
public class PageResponse<T> {
private List<T> resultList;
private int total;
// getters and setters and convenience constructors with the given fields
}