一直以来ibatis的分页都是通过滚动ResultSet实现的,应该算是逻辑分页吧。逻辑分页虽然能很干净地独立于特定数据库,但效率在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分利用了特定数据库的分页机制,效率相对较高。
网上已有《使ibatis支持hibernate式的物理分页》等类似的文章以继承SqlExecutor的方式实现了物理分页,但是侵入性非常强,还得实现数据库方言,方法非常复杂。同时SqlExecutor不是接口,对它的方法继承也不能保证版本稳定。本文中将介绍的方式是实现queryWithSqlHandler方法,在查询前将通过SqlHandler接口把sql传给调用者,再用处理后的sql进行最终查询,从而实现物理分页等功能:
//用queryWithSqlHandler方法实现物理分页的例子:
public Page queryPage(String statementId, param, final Page page){
final int pageNum = page.getPageNum();
final int pageSize = page.getPageSize();
List list = queryWithSqlHandler(statementId, param, new SqlHandler() {
@Override
public String handle(String sql, Object[] params) throws SQLException {
//查询总记录数
int total = getJdbcTemplate().queryForInt(