论坛首页 Java企业应用论坛

一次关于简化DAO设计的初步思考!

浏览 40558 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-10-10  
potian 写道
DAO本身的目的有两个:
1。提供统一的存取层,以便外部框架和机制针对这一层进行特别的处理,或者外部可以提供这一层次上的超类为你服务,你可以在一个明确的层次上重用别人的工作,但这不是专门针对DAO,而是分层结构自动带来的好处。

2。而DAO本身的目的就是为了封装数据存取的差异性,如果你直接用这种方法来做的话,DAO有什么用,根本不需要了
List users=(List);getDao.find("findUserWithFullName",parameters);;

如果DAO改成 JDBC实现,这算什么?

呵呵,确实如此。颠覆了DAO的根本原则。我错了,大错特错。
0 请登录后投票
   发表时间:2004-10-10  
potian 写道

2。而DAO本身的目的就是为了封装数据存取的差异性,如果你直接用这种方法来做的话,DAO有什么用,根本不需要了
List users=(List);getDao.find("findUserWithFullName",parameters);;

如果DAO改成 JDBC实现,这算什么?


用JDBC当然也可以用这样一个parameters的map来传递, 而且偶在实际项目中就是这样做的.
public class JDBCDao implements IDAO{
public List find(String namedQuery, Map parameters);{
  getConnection();;
  getObjectFromMap(parameters);;
  createStatment(namedQuery);;
  setupParameters(pramaeters);;
  return result;
}
}


把findUserWithFullName这个对应的query写在配置文件里面, 其实有点像iBatis的做法了
0 请登录后投票
   发表时间:2004-10-10  
因为我的queryObject的设计依赖于hibernate的Session
find("findUsersByFullName",set ps)
而我传进来的name参数是为了寻找queryObject。
如果换成JDBC的实现的话,至少我这里的设计就失去了意义,至少需要重新修改queryObject以让他充当封装DAO具体实现的代理。从整体意义来说,我思考是逻辑错误的。
0 请登录后投票
   发表时间:2004-10-10  
firebody 写道
因为我的queryObject的设计依赖于hibernate的Session
find("findUsersByFullName",set ps)
而我传进来的name参数是为了寻找queryObject。
如果换成JDBC的实现的话,至少我这里的设计就失去了意义,至少需要重新修改queryObject以让他充当封装DAO具体实现的代理。从整体意义来说,我思考是逻辑错误的。


没有注意到你的QueryObject里面竟然有一个session....., 杀......
0 请登录后投票
   发表时间:2004-10-10  
Readonly 写道
firebody 写道
因为我的queryObject的设计依赖于hibernate的Session
find("findUsersByFullName",set ps)
而我传进来的name参数是为了寻找queryObject。
如果换成JDBC的实现的话,至少我这里的设计就失去了意义,至少需要重新修改queryObject以让他充当封装DAO具体实现的代理。从整体意义来说,我思考是逻辑错误的。


没有注意到你的QueryObject里面竟然有一个session....., 杀......


 
本来想让它方便产生Criteria ,Query对象的。   
0 请登录后投票
   发表时间:2004-10-10  
不现实
NamedQuery findUserWithFullName是hibernate特有的,外部Service调用的方式就是
List users=(List);getDao.find("findUserWithFullName",parameters);;

你要变成 JDBC的DAO,不能影响这一点
createStatment(namedQuery);; 

你怎么从findUserWithFullName去创建出你的SQL语句,除非内部实现一套类似于Hibernate的NamedQuery机制

还有最重要的是DAO方法名字的意义和明确的参数,到时候大家都不知道要放什么参数了,放几个参数了,而到底一个DAO提供哪些功能,也不知道,因为接口只有一个方法,而到底返回什么东东,是一个列表还是一个对象,对象是什么类型,也不知道,这样的代码怎么维护和扩展
0 请登录后投票
   发表时间:2004-10-10  
potian 写道
不现实
NamedQuery findUserWithFullName是hibernate特有的,外部Service调用的方式就是
List users=(List);getDao.find("findUserWithFullName",parameters);;

你要变成 JDBC的DAO,不能影响这一点
createStatment(namedQuery);; 

你怎么从findUserWithFullName去创建出你的SQL语句,除非内部实现一套类似于Hibernate的NamedQuery机制

还有最重要的是DAO方法名字的意义和明确的参数,到时候大家都不知道要放什么参数了,放几个参数了

如果硬是要讲错就错的话,我会重新设计QueryObject以封装Hibernate或者JDBC实现。不过这样的设计就显得无味了而且无聊拉。至于Name,基本的概念就是一个查找查询对象的作用,至于明确参数的意义,还是可以通过一套验证机制来检查参数的合法性,包括name的检查。 不过确实失去了OO的本意。
0 请登录后投票
   发表时间:2004-10-10  
偶前面说过了用配置文件, 而且偶的配置文件很简单:
NamedSQL.properties

findUserWithFullName=select user_id, full_name from user where full_name = $fullName

createStatment(namedQuery)要做的工作就是从这个配置文件里面找出这句话, 然后把占位符号替换成?
0 请登录后投票
   发表时间:2004-10-10  
我认为在这里,显示的DAO接口就是一份可以验证的,明确说明的数据存取文档,这样的文档我们还是有必要维护的,何况还有移植性的好处
0 请登录后投票
   发表时间:2004-10-10  
Readonly 写道
偶前面说过了用配置文件, 而且偶的配置文件很简单:
NamedSQL.properties

findUserWithFullName=select user_id, full_name from user where full_name = $fullName

createStatment(namedQuery)要做的工作就是从这个配置文件里面找出这句话, 然后把占位符号替换成?

同意,复杂的查询我会选择你的方式。也可以提供一个比较统一的实现。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics