例子是根据博友的例子改的。保留原作者名。并留以自用!
(项目:spring2.1 + struts1.2 + hibernate3.2 的文件上传下载,源码请下载附件)
1.1. 基类:扩展HibernateDaoSupport
扩展一下HibernateDaoSupport,可以添加自己的辅助方法,以使下面的泛型实现类代码更简洁清晰。
package com.ssh.core.dao.support;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
@SuppressWarnings("unchecked")
public class HibernateGenericDao extends HibernateDaoSupport {
//……
}
1.2. 接口:GenericDao
定义泛型接口:
package com.ssh.core.dao;
import java.io.Serializable;
import java.util.List;
public interface GenericDao<T> {
public void save(Object o);
void delete(Object o);
void deleteById(Serializable id);
public void update(Object o);
public void saveOrUpdate(Object o);
public T getById(Serializable id);
public List<T> findAll(Class<T> entityClass);
public List<T> findByExample(Object o);
//...
}
1.3. 实现:GenericDaoImpl
定义泛型类的实现:
package com.ssh.core.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.springframework.util.Assert;
import com.ssh.core.dao.GenericDao;
import com.ssh.core.dao.support.HibernateGenericDao;
@SuppressWarnings("unchecked")
public class GenericDaoImplHibernate<T> extends HibernateGenericDao implements GenericDao<T>{
protected Class<T> entityClass;
public GenericDaoImplHibernate() {
entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
protected Class<T> getEntityClass() {
return entityClass;
}
public List<T> findAll(Class<T> entityClass) {
return getHibernateTemplate().loadAll(entityClass);
}
public List<T> findAll(Class<T> entityClass, String orderBy,
boolean isAsc) {
Assert.hasText(orderBy);
if (isAsc)
return getHibernateTemplate().findByCriteria( DetachedCriteria.forClass(entityClass).
addOrder(Order.asc(orderBy)));
else
return getHibernateTemplate().findByCriteria(
DetachedCriteria.forClass(entityClass).
addOrder(Order.desc(orderBy)));
}
public List<T> findByExample(Object o) {
return getHibernateTemplate().findByExample(o);
}
public T getById(Serializable id) {
return (T)getHibernateTemplate().get(entityClass, id);
}
public void deleteById(Serializable id) {
delete(getById(id));
}
public void delete(Object o) {
getHibernateTemplate().delete(o);
}
public void save(Object o) {
getHibernateTemplate().save(o);
}
public void saveOrUpdate(Object o) {
getHibernateTemplate().saveOrUpdate(o);
}
public void update(Object o) {
getHibernateTemplate().update(o);
}
//其他方法自己加喏,以后有空再补完整
}
1.4. 一个实体的Dao例子
1:接口
package com.ssh.file.dao;
import com.ssh.core.dao.GenericDao;
import com.ssh.model.file.File;
public interface FileDao extends GenericDao<File> {
}
2:类
package com.ssh.file.dao.impl;
import com.ssh.core.dao.impl.GenericDaoImplHibernate;
import com.ssh.file.dao.FileDao;
import com.ssh.model.file.File;
public class FileDaoImpl extends GenericDaoImplHibernate<File> implements FileDao{
//如果需要的方法在GenericDaoImplHibernate中都有的话,这里是可以不写任何代码的
}