从我的观点:
- 每个请求,可以在该基本上将持有的偏移和页大小的请求对象被封装;
- 每个响应可能被封装在基本上会有结果列表和总数的响应对象中,或者您可以保存用于构建响应的请求对象;
你的接口进行数据库的选择将类似于:
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
}
你当然可以也才能有你已经要求回答保持类型打了一下泛型,便于使用Response对象一样的:
public <T> PageResponse<T> getPage(PageRequest<T> pageRequest);
具有用于请求和响应等的对象:
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
}
不错的aproach.I想知道,这种类型的API是不是向客户端公开了大量的SQL层细节? – Jim 2012-08-02 06:18:32
这取决于你如何实现它。但是没有SQL细节会暴露出来,'PageRequest'会将参数保存为常规的java对象。 – 2012-08-02 06:44:44