场景:在购物网站中,有一级分类实体、二级分类实体、商品实体,对三个实体映射到数据库中的操作有:删除一条记 录、保存一条记录、根据id查找一条记录、修改记录等方法。如果我们不使用反射,按照一般的写法,那么我们 对应三个实体的DAO都要实现增删改查的操作。如果使用反射机制我们只需要定义一个基类泛型DAO,让其实现 所有的操作,然后使其他三个DAO分别继承该BaseDAO,然后通过反射去识别在运行过程具体实体类型,实现操 作。
BaseDao.java
import java.util.List;
public interface BaseDao<T> {
public void save(T t);
public void update(T t);
public void delete(T t);
public T findById(Integer id);
public T findById(String id);
public List<T> findAll();
}
CategoryDao .java
public interface CategoryDao extends BaseDao<Category>{}
CategorySecondDao .java
public interface CategorySecondDao extends BaseDao<CategorySecond>{}
ProductDao .java
public interface ProductDao extends BaseDao<Product>{
List<Product> findHotProduct(); //也可以有其他的方法
}
BaseDaoImpl.java
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
private Class clazz ;
public BaseDaoImpl() {
// 获得Class对象:
Class c = this.getClass();
System.out.println(c);
Type type = c.getGenericSuperclass();
ParameterizedType pType = (ParameterizedType) type;
System.out.println(pType);
Type[] types = pType.getActualTypeArguments();
this.clazz = (Class) types[0]; //获得具体的类型
}
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
@Override
public List<T> findAll() {
String hql = "from "+clazz.getSimpleName();
return this.getHibernateTemplate().find(hql);
}
@Override
public T findById(Integer id) {
return (T) this.getHibernateTemplate().get(clazz, id);
}
@Override
public T findById(String id) {
return (T) this.getHibernateTemplate().get(clazz, id);
}
@Override
public void save(T t) {
this.getHibernateTemplate().save(t);
}
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
CategoryDaoImpl .java
public class CategoryDaoImpl extends BaseDaoImpl<Category> implements CategoryDao {
}
CategorySecondDaoImpl .java
public class CategorySecondDaoImpl extends BaseDaoImpl<CategorySecond> implements CategorySecondDao {}
ProductDaoImpl .java
public class ProductDaoImpl extends BaseDaoImpl<Product> implements ProductDao {
public List<Product> findHotProduct() {
DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
criteria.add(Restrictions.eq("is_hot", 1));
criteria.addOrder(Order.desc("pdate"));
return this.getHibernateTemplate().findByCriteria(criteria, 0, 10);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013516966/article/details/46699347