- 前言
以前用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,这样以来,我们不但可以重用公共的代码,还可以将满足需求的特殊的方法写在子类里面。