对回调函数的理解
hibernate中的分页,使用的是回调方法查询,首先自定义类A来实现HibernateCallback接口,然后重写其中的DoInHibernate方法在其中实现具体的分页逻辑,
然后在A中调用B类的方法(getHibernateTemplate.execute(callback))把实例后的A对象以参数的方式传入其中,最后在execute的内部调用A类的doInHibernate方法实现最终的分页输出。
以下是部分代码:
class hibernatePaginateSqlListCallBack implements HibernateCallback {
private String querySQL; //查询SQL语句
private String totalCountSQL; //查询总记录数SQL语句
private int currentPage; //当前页数
private int pageSize; //每页显示记录数
private int maxPage = 1;
private List<Object> paramlist; //条件参数的集合
public hibernatePaginateSqlListCallBack(String querySQL, String totalCountSQL, int currentPage, int pageSize, List<Object> paramlist) {
this.querySQL = querySQL;
this.totalCountSQL = totalCountSQL;
this.currentPage = currentPage;
this.pageSize = pageSize;
this.maxPage = maxPage;
this.paramlist = paramlist;
}
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
Map<String, Object> result = new HashMap<String, Object>();
List<HashMap<Object, Object>> list = new ArrayList<HashMap<Object, Object>>();
/********************* totalCount start *********************/
int totalCount = 0;
SQLQuery sqlQuery = session.createSQLQuery(this.totalCountSQL);
List<Object> totalCountList = sqlQuery.list();
if(!totalCountList.isEmpty()){
totalCount = Integer.valueOf(totalCountList.get(0).toString());
}
//判断当前页是否超出总页
if(0 != totalCount){
maxPage = (totalCount / this.pageSize);
if( 0 != (totalCount % this.pageSize) ){
maxPage = maxPage + 1;
}
if(this.currentPage > maxPage){
this.currentPage = maxPage;
}
}else {
this.currentPage = 1;
maxPage = 1;
}
/********************* totalCount end *********************/
/********************* querySQL start *********************/
sqlQuery = session.createSQLQuery(this.querySQL);
if (null != paramlist && !this.paramlist.isEmpty()) {
int paramLen = this.paramlist.size();
for (int i = 0; i < paramLen; i++) {
sqlQuery.setParameter(i, this.paramlist.get(i));
}
}
sqlQuery.setFirstResult( (this.currentPage-1) * (this.pageSize) );
sqlQuery.setMaxResults(this.pageSize);
sqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List<HashMap<Object, Object>> resultList = sqlQuery.list();
/* //将大写的关键字改成小写
int len = resultList.size();
for (int i = 0; i < len; i++) {
HashMap<Object, Object> hMap = new HashMap<Object, Object>();
HashMap<Object, Object> obj = resultList.get(i);
Iterator iterator = obj.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
String key = (String) entry.getKey();
Object value = entry.getValue();
hMap.put(key.toLowerCase(), value);
}
list.add(hMap);
} */
/********************* querySQL end *********************/
result.put("totalCount", totalCount); //总记录数
result.put("list", resultList); //查询结果
result.put("currentPage", this.currentPage); //当前页码
result.put("pageSize", pageSize); //每页记录数
result.put("maxPage", maxPage);
return result;
}
}
protected Map<String, Object> findPaginateSqlList(String querySQL, String totalCountSQL, int currentPage, int pageSize, List<Object> paramlist) {
HibernateCallback callback = new hibernatePaginateSqlListCallBack(querySQL, totalCountSQL, currentPage, pageSize, null);
Map<String, Object> result = (Map<String, Object>) this.getHibernateTemplate().execute(callback);
return result;
}
总结:现在对回调函数的理解还是很肤浅,只知道是A类a方法,B类b方法,在A类中调用b方法并以A类为参数,然后在b方法中就可以随意使用传入的A对象的a方法,意思可能就是A调B,B也能反过来调用A中的a方法。a方法是两者互相使用的方法,可能就是回调方法了。
但是还是不明白回调函数的具体作用。不知道为什么要这样用。用其它的方式不可以吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)