• 对回调函数的理解


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

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


  • 相关阅读:
    构建之法8,9,10章
    作业6
    通过处理器类型获得处理器对象
    面经
    C语言实现字符串替换
    计算机网络整理
    常见面试题
    数据库常见面试题
    redis常见知识整理
    项目总结
  • 原文地址:https://www.cnblogs.com/marineblog/p/16118865.html
Copyright © 2020-2023  润新知