泛型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方法得到的东西都要进行强制转换。孰优孰劣,还需要结合具体的上下文环境做出取舍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值