一些关于分页查询和find的扩展

public class JHDbKit {

    /**
     * 获取总数时传入的标识
     */
    public static final String GET_COUNT_SIGN = "isGetCount";

    /**
     * 获取空分页
     */
    public static Page emptyPage(Integer pageNumber, Integer pageSize) {
    	return new Page(new ArrayList(0), pageNumber, pageSize, 0, 0);
    }

    /**
     * 创建page对象
     */
    public static Page<Record> page(List<Record> list, Integer pageNumber, Integer pageSize, Integer totalRow) {
    	if (totalRow == 0) {
            return emptyPage(pageNumber, pageSize);
	}
	int totalPage = (int) (totalRow / pageSize);
	if (totalRow % pageSize != 0) {
	    totalPage++;
	}
	if (pageNumber > totalPage) {
	    return new Page(new ArrayList<Record>(0), pageNumber, pageSize, totalPage, (int) totalRow);
	}
	return new Page(list, pageNumber, pageSize, totalPage, (int) totalRow);
    }

    /**
     * 创建page对象(不统计总数)
     */
    public static Page<Record> page(List<Record> list, Integer pageNumber, Integer pageSize) {
	return new Page(list, pageNumber, pageSize, 0, 0);
    }

    /**
     * 分页
     * 
     * @param func 数据处理
     */
    public static Page<Record> page(SqlPara totalSqlPara, SqlPara selectSqlPara, Integer pageNumber, Integer pageSize,
	    Consumer<Record> func) {
	int totalRow = Db.queryInt(totalSqlPara.getSql(), totalSqlPara.getPara());
	if (totalRow == 0) {
            return emptyPage(pageNumber, pageSize);
	}
	    List list = getPageList(selectSqlPara, pageNumber, pageSize, func);
	    return page(list, pageNumber, pageSize, totalRow);
    }

    /**
     * 分页(不统计总数)
     * 
     * @param func 数据处理
     */
    public static Page<Record> page(SqlPara selectSqlPara, Integer pageNumber, Integer pageSize,
	    Consumer<Record> func) {
	List list = getPageList(selectSqlPara, pageNumber, pageSize, func);
	return page(list, pageNumber, pageSize);
    }

    /**    
     * 分页
     * 
     * @param countTotal 是否统计总数量
     * @param func       数据处理
     */
    public static Page<Record> page(String key, Map data, Integer pageNumber, Integer pageSize, boolean countTotal,
	    Consumer<Record> func) {
	if (data == null) {
            data = new HashMap();
	}
	SqlPara selectSqlPara = Db.getSqlPara(key, data);
	if (countTotal) {
	    data.put(GET_COUNT_SIGN, true);
	    SqlPara totalSqlPara = Db.getSqlPara(key, data);
	    data.remove(GET_COUNT_SIGN);
	    return page(totalSqlPara, selectSqlPara, pageNumber, pageSize, func);
	} else {
	    return page(selectSqlPara, pageNumber, pageSize, func);
	}
    }

    /**
    * 分页
    * 
    * @param countTotal 是否统计总数量
    */
    public static Page<Record> page(String key, Map data, Integer pageNumber, Integer pageSize, boolean countTotal) {
        return page(key, data, pageNumber, pageSize, countTotal, null);
    }

    /**
    * 分页
    * 
    * @param func 数据处理
    */
    public static Page<Record> page(String key, Map data, Integer pageNumber, Integer pageSize, Consumer<Record> func) {
        return page(key, data, pageNumber, pageSize, true, func);
    }

    /**
    * 分页
    */
    public static Page<Record> page(String key, Map data, Integer pageNumber, Integer pageSize) {
        return page(key, data, pageNumber, pageSize, true, null);
    }

    /**
    * 分页
    * 
    * @param func 数据处理
    */
    public static Page<Record> page(String key, Integer pageNumber, Integer pageSize, Consumer<Record> func) {
    	return page(key, null, pageNumber, pageSize, func);
    }

    /**
    * 分页
    */
    public static Page<Record> page(String key, Integer pageNumber, Integer pageSize) {
        return page(key, null, pageNumber, pageSize, null);
    }

    /**
    * 获取分页列表
    * 
    * @param func 数据处理
    */
    public static List<Record> getPageList(SqlPara sqlPara, Integer pageNumber, Integer pageSize,
            Consumer<Record> func) {
        List<Record> list = new ArrayList<Record>();
	StringBuffer findSql = new StringBuffer(sqlPara.getSql());
	int offset = pageSize * (pageNumber - 1);
	findSql.append(" limit ").append(offset).append(", ").append(pageSize);
	Db.each((Record t) -> {
	    if (func != null) {
	        func.accept(t);
	    }
	    list.add(t);
	    return true;
	}, findSql.toString(), sqlPara.getPara());
	return list;
    }

    /**
    * 获取分页列表
    * 
    * @param func 数据处理
    */
    public static List<Record> getPageList(String key, Map data, Integer pageNumber, Integer pageSize,
	    Consumer<Record> func) {
	if (data != null) {
	    data = new HashMap();
	}
	SqlPara sqlPara = Db.getSqlPara(key, data);
	return getPageList(sqlPara, pageNumber, pageSize, func);
    }

    /**
    * 获取分页列表
    * 
    * @param func 数据处理
    */
    public static List<Record> getPageList(String key, Integer pageNumber, Integer pageSize, Consumer<Record> func) {
        return getPageList(key, null, pageNumber, pageSize, func);
    }

    /**
     * 查询列表
    * 
    * @param func 数据处理
    */
    public static List<Record> find(SqlPara sqlPara, Consumer<Record> func) {
	List<Record> list = new ArrayList<Record>();
	Db.each((Record t) -> {
	    if (func != null) {
	        func.accept(t);
	    }
	    list.add(t);
	    return true;
	}, sqlPara.getSql(), sqlPara.getPara());
	return list;
    }

    /**
     * 查询列表
     * 
    * @param func 数据处理
    */
    public static List<Record> find(String key, Map data, Consumer<Record> func) {
	if (data == null) {
            data = new HashMap();
	}
	SqlPara sqlPara = Db.getSqlPara(key, data);
    	return find(sqlPara, func);
    }

    /**
     * 查询列表
     * 
     * @param func 数据处理
     */
    public static List<Record> find(String key, Consumer<Record> func) {
        return find(key, null, func);
    }

}

分页的sql模版写法

select 
#if(isGetCount)
    count(*)
#else
    u.user_name,u.user_id,u.org_id,u.user_account,
    u.is_enable,
    o.org_name
#end
from sys_user u
#if(!isGetCount || org_name)
    left join sys_org o on u.org_id = o.org_id
#end
where 1 = 1 
#if(org_name)
    and o.org_name #like(org_name)
#end
#if(!isGetCount)
    order by u.create_time desc
#end



评论区

JFinal

2020-12-08 13:20

昨晚刚推送 jfinal 4.9.05,今天扩展就出来了,超赞

有几处改进建议,#if( isGetCount??false ) 这个与 #if( isGetCount ) 其实是等价的,因为 #if ( null ) 等价于 #if ( false )

同理 #if( !(isGetCount??false) ) 也可以改成 #if( !isGetCount )

hzh740053757

2020-12-08 13:24

@JFinal 好的,我优化下

山东小木

2020-12-09 14:27

@JFinal @hzh740053757 JFinal底层方言里分页不是自动去掉了orderby了吗 这里不用处理也能去掉呀

JFinal

2020-12-09 14:32

@山东小木 这个问题好像跟去掉 order by 无关

山东小木

2020-12-09 14:36

@JFinal #if(!isGetCount)
order by u.create_time desc
#end

山东小木

2020-12-09 14:37

@JFinal 加载sql模板 执行分页查询

山东小木

2020-12-09 14:38

@JFinal 即使写了orderby 在jfinal底层去分页查询 获取总数的时候也会去掉这个不是

JFinal

2020-12-09 15:53

@山东小木 这个分享主要是针对昨天新加的 Model.each API,关注这个就行

hzh740053757

2020-12-09 15:55

@山东小木 一些复杂的order by jfinal 底层去的不干净 用这个可以自己控制

hzh740053757

2020-12-09 16:24

@山东小木 在统计总数的时候,有些表可以不用关联也可以用 isGetCount 控制来提高速度

rocker18

2020-12-11 10:29

@JFinal 4.9.05哪里下载啊

SuperEric

2020-12-11 11:04

@rocker18 直接pom.xml中配置就好了。
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>4.9.05</version>
</dependency>

rocker18

2020-12-14 11:04

@SuperEric 已下,感谢!