讨论泛型DAO的问题

data_source 2011-08-15 03:41:09
想写个泛型DAO
public interface CommonDaos <T ID extends Serializable>

想问下 这种DAO 跟BaseDao真正的本质在哪?
意义在哪?
有没有必要的非得用泛型DAO
...全文
94 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu_chunyang 2012-04-25
  • 打赏
  • 举报
回复
我在List<T> findAll()中写了 session.createQuery("from" + entityClass.getName());
为什么会抛出 node to traverse cannot be null 的异常?
我用的是Hibernate当中的 HQL 查询。
zl3450341 2011-08-15
  • 打赏
  • 举报
回复
算了,来点实际的例子吧。。申明:非SSH的



public class RYTBaseDao<T> extends LibraDaoSupport {

Class<T> entityClass;

@SuppressWarnings("unchecked")
public RYTBaseDao() {
entityClass = (Class<T>) ((ParameterizedType) this.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}

public Integer save(T t) throws Exception {
return this.getSession().save(t);
}

public Integer update(T t) throws Exception {
return this.getSession().update(t);
}

public Integer delete(T t) throws Exception {
return this.getSession().delete(t);
}

public List<T> queryAll() {
return this.getSession().queryAll(entityClass);
}
}


特别要注意,queryAll()方法,他传的是一个class

以及构造函数。。



如果只是掉用save,delete这些你可能还没有感觉

但是现在如果baseDao的一个子类,调用queryAll,你想想,如果没有泛型,你怎么实现?

是不是每个子类都要去重写queryAll方法,然后传Xxx.class?



现在这么设计。子类承受了父类的entityClass,
在构造子类的时候,会调用父类的构造函数。
entityClass = (Class<T>) ((ParameterizedType) this.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];

一句话,你完成了entityClass的赋值。。。

假设说:有:public class NoticeCategoryDao extends RYTBaseDao<NoticeCategory>

那么你在构造NoticeCategoryDao 的时候,entityClass 就已经是NoticeCategory.class了

所以你的NoticeCategoryDao 可以放心的使用queryAll方法,而不必再进行重写。。


这明显就是优点吧?省不了不少代码吧。

像hibernate的delete语句就是: delete(Class claaz,Serilizable id)

如果用到class的方法一多起来,优势不是很明显么?
hepeng_8 2011-08-15
  • 打赏
  • 举报
回复
可以用也可以不用,泛型的话不用桩换了,方便了点
ollim 2011-08-15
  • 打赏
  • 举报
回复
哎 程序的设计是程序之魂
大多数的java程序 都是本着继承 封装 多态出发的。。

我要做20个dao 里面有很多所有方法是通用的
这样我就做了一个 BaseDao 封装了这几个方法

其他的dao继承这个 例如 WofanzhengxinleDao 继承 BaseDao
但是WofanzhengxinleDao 最终是要操作 Wofanzhengxinle对象的(特别是在ORM)
我要得到一个 WofanzhengxinleDao 来操作Wofanzhengxinle 对象而不是 Nixinbuxin对象
这样就要在 WofanzhengxinleDao 中加入 方法
public String getObjectName(){return "tdb.dc.gotodie.Wofanzhengxinle"}
来表示当前dao所操作的对象 这是很早以前惯用的方法。

使用泛型操作哪个对象只需要
public class WofanzhengxinleDao extends BaseDao<Wofanzhengxinle,Money>
后面的一般都是 orm对象的主键 这样舒服多了。
原先的做法现在看起来有点傻。


飓风zj 2011-08-15
  • 打赏
  • 举报
回复
为了以后 来回转换的麻烦 还是可以需要的 泛型很方便的
softroad 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zl3450341 的回复:]

没有必要非使用泛型Dao,

使用泛型dao以后,有很多东西就很方便处理,你也可以用Object 替换啊,但是有了泛型以后,他可以更精确,可以提供编译期的检查
[/Quote]

以后不需要类型转换了。
zl3450341 2011-08-15
  • 打赏
  • 举报
回复
没有必要非使用泛型Dao,

使用泛型dao以后,有很多东西就很方便处理,你也可以用Object 替换啊,但是有了泛型以后,他可以更精确,可以提供编译期的检查

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧