BeetlSql 也推出了翻页接口,总的来说,跟其他Dao工具差不多,通过传入一个PageQuery,包含了查询参数,以及当前页数,来获得web翻页需要各种输出,如
1 查询结果总数
2 当前查询结果
3 总共有多少页
4 当前在第几页
5 是否是第一页,是否是最后一页
PageQuery query = new PageQuery();
sqlManager.pageQuery("user.allUser", User.class, query);
System.out.println(query.getTotalPage());
System.out.println(query.getTotalRow());
System.out.println(query.getPageNumber());
List<User> list = query.getList();
其他Dao工具也有类似功能,但在实现上略有区别,可以说BeetlSql 提供了更好的翻页实现。这是因为BeetlSql 尽量减少手写sql,在翻页这点上也比例外。
BeetlSql 允许用一个sql语句进行查询,求总数俩个操作,如下:
allUser
===
* 查询所有用户
select
@pageTag(){
id,name,age
@}
from user
where ....
如上sql语句,查询列在标签函数pageTag里,如果是求查询结果总数,则pageTag标签函数会输出成 count(1),如果是求查询结果集,标签函数pageTag则输出 标签体,因此,对已翻页的操作,实际上变成俩个sql,如下:
select count(1) from user where ....
select id,name,age from user where ... limit ?, ?
BeetlSql 也可以使用函数page来简化,如
select #page("*")# from user where ....
生成的语句是
select count(1) from user where ....
select * from user where ... limit ?, ?
page函数接受一个字符串,在查询结果sql里原样输出,在查询总数的时候输出count(1)
那么,为什么说BeetlSql 比其他Dao框架的翻页好呢,有的框架只需要提供一个sql语句便能翻页,如同样是user查询,类似如下调用
Page page = XXXDaoTool.query("select * from user where",1,10);// 其他Dao工具
这种框架同样会用来俩个sql来完成,分别是如下
其他Dao工具输出
select count(1) from (select * from user where ...) x
select * from user where ... limit ?,?
如果你对sql执行计划有些了解,你就会发现第一条sql会先全表扫描(没有where,通常web页面刚进入没有任何条件),然后取出结果集后,然后求总数,性能非常低,不如
select count(1) from user where ,这仅仅求一个索引总数,性能非常快
由此可见,对于这种Dao工具,尽量要避免查询总数,尤其是避免不输入任何条件的查询
BeetlSQL的PageQuery 也提供了更为高效的翻页查询,因为有的时候,确实用俩个sql来分别查询总数和查询结果集更为高效。比如,当用一个sql存在排序的时候,如果还用这个语句来查询结果总数,效率就会差一些,用俩个Sql是更好的选择。如下
allUser
===
select * from user where .... order by id desc
allUser$count
===
select count(1) from user where ....
这样,如果执行
sqlManager.pageQuery("user.allUser", User.class, query);
则BeetlSql 总会优先查询allUser 和 allUser$count,如果没有 allUser$count,才会认为sql语句里有pageTag.
总的来说,BeetSql 翻页比传统的Hibernate,MyBatis能更快的开发,完成翻页操作,也比其他一些Dao 工具更为高效。