《Hibernate》--------单表查询的功能封装

- 前言

以前用JDBC的时候,我们利用参数化查询将查询的方法封装起来,这样有利于我们的重用,当我们利用hibernate的Hql语句,使用查询功能的时候,我们同样可以将一些公共常用的查询方法封装起来,然后将此类抽象成一个公共的类,让所有的Dao来继承此类。

实现步骤

1、封装CommonDao接口

public interface CommonDao<T> {

    /*
     * keyValues:条件
     * orderName:排序字段
     * flag:是否升序
     */
    public List<T> getEntriesByCondition(Map<String,Object> keyValues,String orderName,Boolean flag);

}

2、封装CommonDaoImpl


public class CommonDaoImpl<T> implements CommonDao<T> {
    private Class classt;
    private ClassMetadata classMetadata;

    public CommonDaoImpl() {
        ParameterizedType type = (ParameterizedType) this.getClass()
                .getGenericSuperclass();
        this.classt = (Class) type.getActualTypeArguments()[0];
        /*
         * classt就是代表持久化类的class形式
         */
        this.classMetadata = HibernateUtils.sessionFactory
                .getClassMetadata(classt);
    }

    @Override
    public List<T> getEntriesByCondition(Map<String, Object> keyValues,
            String orderName, Boolean flag) {
        StringBuffer buffer = new StringBuffer();
        Query query = null;
        buffer.append("from " + this.classt.getName());
        buffer.append(" where 1=1 ");
        for (Entry<String, Object> entry : keyValues.entrySet()) {
            /*
             * from Classes where cid=:cid and name=:name
             */
            buffer.append("and " + entry.getKey() + "=:" + entry.getKey());
        }
        Session session = HibernateUtils.sessionFactory.openSession();

        if (!StringUtils.isNullOrEmpty(orderName)) {
            buffer.append(" order by ");
            buffer.append(orderName);
            if (flag) {
                buffer.append(" Asc");
            } else {
                buffer.append(" Desc");
            }
            query = session.createQuery(buffer.toString());

        } else {
            query = session.createQuery(buffer.toString());
        }

        // 拼接参数,给参数赋值
        for (Entry<String, Object> entry : keyValues.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
        }
        return query.list();
    }
}

3、封装具体的Dao类

public class ClassesDao extends CommonDaoImpl<Classes> {
    //这里写属于ClassDao特有的一些方法,公共方法都抽到CommonDaoImpl中去了
}
  •  

4、执行单元测试

public void testQeryByCondition() {
        ClassesDao classesDao = new ClassesDao();
        Map<String, Object> keyValues = new HashMap<String, Object>();
        keyValues.put("name", "1班");
        List<Classes> classes = classesDao.getEntriesByCondition(keyValues,"cid",false);
        for (Classes classes2 : classes) {
            System.out.println(classes2.getDescription());
        }

        System.out.println(classes.size());
    }

小结

  • 这是一个浅面的Dao层设计,写一个共同的CommonDao接口,一个共同的CommonDaoImpl,我们将那些公共的Dao的CRUD封装在CommonDaoImpl中,然后让子类去继承CommonDaoImpl,这样以来,我们不但可以重用公共的代码,还可以将满足需求的特殊的方法写在子类里面。
爱编程-编程爱好者经验分享平台

文章评论

  

版权所有 爱编程 © Copyright 2012. w2bc.com. All Rights Reserved.
闽ICP备12017094号-3