对回调函数的理解

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方法是两者互相使用的方法,可能就是回调方法了。

但是还是不明白回调函数的具体作用。不知道为什么要这样用。用其它的方式不可以吗?


posted @ 2022-04-08 18:02  oceanyang  阅读(36)  评论(0编辑  收藏  举报