泛型DAO

示例代码:
public interface HibernateTemplateAware {
 public void setHibernateTemplate(HibernateTemplate template);
}
abstract public class BaseDAO<T> implements HibernateTemplateAware {
 
 private Class<T> entityClass;
 
 private HibernateTemplate template;
 
 @Override
 public void setHibernateTempate(HibernateTemplate template) {
  this.template = template;
 }
 @SuppressWarnings("unchecked")
     public BaseDAO() {
         ParameterizedType type = (ParameterizedType)(getClass().getGenericSuperclass());
         entityClass =(Class<T>) type.getActualTypeArguments()[0];
 }
 @SuppressWarnings("unchecked");
 public T get(java.io.Serializable id) {
  T o = (T)getHibernateTemplate().get(entityClass, id);
 }
 
 public void save(T t) {
  getHibernateTemplate().save(t);
 }
 
 public void saveOrUpdate(T t) {
         getHibernateTemplate().saveOrUpdate(t);
     }
   
     public void update(T t) {
         getHibernateTemplate().update(t);
     }
 
 protected void getHibernateTemplate() {
  return template;
 }
}

调用的时候:假设域实体对象为Entity
public class EntityDAOImpl extends BaseDAO<Entity> {
....
}
then, 构建一个EntityDAOImpl的方法通过正常构建途径即可,此时通过子类get方法得到的均不再需要强制转换。
缺点:代码编译兼容性不好,必须在5.0以上版本的JDK进行编译。其中构造函数是关键位置,通过反射取出参数化类型的索引为0的Class作为entityClass
通过非泛型同样可以实现DAO基础代码共用,并且对1.4的环境也是友好的,但是无论如何get方法得到的东西都要进行强制转换。孰优孰劣,还需要结合具体的上下文环境做出取舍

你可能感兴趣的:(DAO,jdk)