基于spring JdbcTemplate改进版通用dao的使用及实现二:使用分页

分类: Spring 0人评论 1年前发布

注意:本组件已重构并全新发布,更加方便易于使用。代码全部开源,详情访问 Github仓库码云

在通用dao中,分页功能被封装的十分方便。

并且它可以和前面的各类查询、组合查询结合使用,完全不冲突。

另外,分页的封装是基于JdbcTemplate,也就是说你自己实现的其它各类dao也都可以使用它而非局限于默认提供的SuperDao。

你无须关心数据库类型,它会自动判断为你生成分页的sql查询,目前有oracle和mysql两种实现。

在你想要分页时,无须做任何修改,只要在前面添加一行PageControl.performPage(...),告诉通用dao需要分页就可以了。

见下面代码:

//方式一
User user = new User();
PageControl.performPage(user);
//将返回null,数据从PageControl中获取
superDao.queryList(user);
Pager pager1 = PageControl.getPager();
//方式二
PageControl.performPage(1, 10);
//将返回null,数据从PageControl中获取
superDao.queryList(User.class);
Pager pager2 = PageControl.getPager();

仍然是两种方式,传入实体或class对象。当然,这里的User继承了Pageable类,用来保存页面码等信息。

Pageable类主要有两个参数,页面和每页大小:

public class Pageable implements Serializable {
    /** 每页显示条数 */
    protected int             itemsPerPage     = 20;
    /** 当前页码 */
    protected int             curPage          = 1;
    ......
}

当使用分页后,原本dao调用的方法将返回null,之所以不返回数据是为了防止用户直接使用这个数据而忘记了分页的一些操作。

这样做的好处是可以强制用户从PageControl获取数据从而清空一些分页的信息,如页码、每页大小等,这是个好的习惯。

通过PageControl可以获取你想要的一切数据:

User user = new User();
PageControl.performPage(user);
//将返回null,数据从PageControl中获取
superDao.queryList(user);
Pager pager = PageControl.getPager();
//数据列表
List<?> users = pager.getList();
//可以这样直接完成转换,甚至直接转换到VO等其它对象
//List<User> list = pager.getList(User.class);
//总记录数
int itemsTotal = pager.getItemsTotal();
//总页数
int pages = pager.getPages();
//当前页
int curPage = pager.getCurPage();
//每页大小
int itemsPerPage = pager.getItemsPerPage();
//pager.get...

使用混合查询时,照样可以使用分页:

PageControl.performPage(1, 10);
superDao.include("userId").where("userName", "in", new Object[] { "liyd", "selfly" })
    .and("userId", ">=", new Object[] { 17L }).or("userId", "<=", new Object[] { 1L })
    .asc("userId").queryList(User.class);
Pager pager = PageControl.getPager();

有时候,你可能并不需要知道总的记录数,可以指定最后一个参数为false:

//方式一
User user = new User();
PageControl.performPage(user,false);
//将返回null,数据从PageControl中获取
superDao.queryList(user);
Pager pager1 = PageControl.getPager();
//方式二
PageControl.performPage(1, 10,false);
//将返回null,数据从PageControl中获取
superDao.queryList(User.class);
Pager pager2 = PageControl.getPager();

这样,就不会执行总记录数count的查询,减少一次数据库查询的次数。