您的位置:首页 > 其它

对回调函数的理解

2015-07-15 14:51 295 查看
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方法是两者互相使用的方法,可能就是回调方法了。

但是还是不明白回调函数的具体作用。不知道为什么要这样用。用其它的方式不可以吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: