HibernateTemplate回调函数的使用以及条件语句的拼接

一:查询框架流程(架构)
为了实现查询代码复用的效率,因此需要给所有的查询写一个抽象类BaseQuery,因此在将来收到页面的查询条件数据,就以BaseQuery的格式传递,action到serrvice层以BaseQuery的格式传递,service传到dao的数据也以BaseQuery的格式传递,在BaseQuey里边有一个map类型的属性,查询条件的拼接都在调用basequery.buildWhere的时候拼接好了,

这个架构应该是项目的一个亮点应为如何根据用户输入的条件来查询具体的数据,这个架构大大的提高了代码的复用率

BaseQuery是一个基础的约束类,这个类用于获取到用户在页面输入的查询条件,并且将查询条件进行封装,封装成map的形式,然后再后台查询的时候进行hql语句的拼接,hql语句的拼接也是其中的一个亮点

package cn.edu.nwsuaf.GYL.query;

import java.util.HashMap;
import java.util.Map;

//两个功能
//1:提供一个抽象方法,把具体页面上的表单元素封装成map,
//2:提供一个map,供子类使用
public abstract class BaseQuery {
    //把页面上表单中的表单元素封装成map结构
    private Map<String, Object> keyValues = new HashMap<String, Object>();
     //当前页码,初始化的值为1
    private int currentPage = 1;
   //一页显示的条数
    private int pageSize = 2;

    //把页面上的查询条件进行封装,封装成一个map(String ,object)类型
    //并且进行返回
    public abstract  Map<String, Object> buildWhere();

    public Map<String, Object> getKeyValues() {
        return keyValues;
    }

    public void setKeyValues(Map<String, Object> keyValues) {
        this.keyValues = keyValues;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }



}

条件语句的拼接类,这个类使用到了hibernateTemplate的回调函数,在页面数据查询的时候,回调函数扮演者极为重要的作用,所以这个地方的重点是回调函数的使用,下面以查询某张表的记录的总的条数为例子来展示

    @Override
    public int getCount(final BaseQuery baseQuery) {
        //hibernate的回调函数
        return this.hibernateTemplate.execute(new HibernateCallback<Integer>() {

            @Override
            public Integer doInHibernate(Session session) throws HibernateException,
                    SQLException {
            //
                StringBuffer stringBuffer = new StringBuffer();
                stringBuffer.append("select count(*) from Department");
                stringBuffer.append(" where 1=1 ");

                //获取所有的查询条件
                Map<String, Object> keyValues = baseQuery.buildWhere();
                //拼接查询条件,也就是拼接where条件语句,这个语句是条件的拼接
                for(Entry<String, Object> entry:keyValues.entrySet())
                {
                    stringBuffer.append("and "+entry.getKey()+"=:"+entry.getKey());
                }
                Query query =  session.createQuery(stringBuffer.toString());//存放一个hql语句
                System.out.println("拼接的条件语句是:"+stringBuffer.toString());
                //接下来进行值的拼接,把where条件中的参数传递值的过程
                for(Entry<String, Object> entry:keyValues.entrySet())
                {
                    query.setParameter(entry.getKey(),entry.getValue());
                }
                //获取记录的条数
                Long count = (Long) query.uniqueResult();


                return count.intValue();
            }


        });

    }
发布了42 篇原创文章 · 获赞 24 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/zhang245754954/article/details/54949697