`
wm920
  • 浏览: 77391 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DAO的一个讨论问题

阅读更多
总结:今天在对Action的业务类的方法实现时候,想了又想,为什么在一个Action里面写那么多实现方法对数据库的操作(select,update.....)而且每一个Action都要对应一个DAO的实现方法,每一个DAO的实现方法对对应的数据库的中唯一的一张表,为何不可把Action的对数据库的操作方法写在一个整合的DAO里面呢,在这个整合的DAO里面有的Action对数据库操作的各类的方法,而Action就做全面的数据的转发和JSP页面的跳转工作,当每次对JSP页面操作的时候,(select,update等)都会向整合的DAO执行操作,这个整合的DAO通过产生临时的ID字段负责的全程的对数据库的操作<select,update等>,整合的DAO进行逻辑的判断,进行相关的业务操作,在向不同的DAO的转发,然后在通过不同的DAO对映的数据库表进行操作。请问有人想个这个方法么,就是多张表,每一张表对应的一个DAO的实现类,在通过一个整合DAO实现方法对每个DAO的实现方法的整合,也就是1:n的关系(dao对多个dao的整合)通过整合dao的进行判断执行相关的操作,假如是表关联的话,通过临时字段的ID号判断,要进行那个DAO的操作(表),这样从而减少了Action里面有很多的业务实现方法,对数据库而言,就只有一次性的操作。从而大大的提高数据库的性能效率,有人这样做过么·? 请那个大人物指点下!谢谢
分享到:
评论
61 楼 li445970924 2009-05-10  
我每次做项目是就只用了一个Dao   用的Spring框架的DI就可以了啊 也不是很麻烦 
60 楼 iKing 2009-05-10  
引用
form提交的数据校验应该是放在action中进行校验的
比如Jsp->Action->Service->Dao->PO


如果是业务验证(暂且叫业务验证吧,即指验证业务的逻辑是否正确)呢

假设一个业务逻辑:添加一个部门的部门主管时,这个人必须是该部门的上级部门中的职员

那你觉得这个验证是应该在Action中呢,还是在Service层的Dept.addCharge(User)方法中呢
如果在Action中的话,会发现很多属于业务验证渗透到Action中,并且很可能导致Service的Dept.addCharge(User)方法的业务逻辑不完整(即缺少了对User是否属于Dept上级部门人员的验证)
59 楼 arafat 2009-05-09  
carrot 写道
最近的项目设计中,淡化dao层设计,dao层用泛型实现就可以了, 所有的实现都集中在业务层中,而且事务的提交也都是定义在Service层中。



这种不错 比以前的单独做个dao层觉得爽一点。。
58 楼 lzg3267373 2009-05-08  
iKing 写道
<div class="quote_title">Nick_HF 写道</div><div class="quote_div"><pre name='code' class='java'>Action&lt;-Service&lt;-Dao&lt;-DB
贴段代码,可能就比较清楚了
service Interface:
public interface SpaScoreDAOService {
	public  List getSpaScoreSupInfo(String supItems);
....
}


DAO:(IBatis)
public class SpaScoreDAO extends SqlMapClientDaoSupport {
public List getSpaScoreSupInfo(String supItems) {
		return this.getSqlMapClientTemplate().queryForList("getSpaScoreSupInfo",supItems);
	}


Service implement:
public class SpaScoreDAOImp implements SpaScoreDAOService {
	SpaScoreDAO spaScoreDAO;
public List getSpaScoreSupInfo(String supItems) {
	 ...业务逻辑	
             return spaScoreDAO.getSpaScoreSupInfo(supItems);
	}
public SpaScoreDAO getSpaScoreDAO() {
		return spaScoreDAO;
	}

public void setSpaScoreDAO(SpaScoreDAO paScoreDAO){
		this.spaScoreDAO = spaScoreDAO;
	}

	
Action:
public class SpaScoreAction extends Action{

private SpaScoreDAOService spaScoreDAOService;
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
//调用业务逻辑
List supitemList = spaScoreDAOService.getSpaScoreSupInf(supItems);
......
		
}

public SpaScoreDAOService getSpaScoreDAOService() {
		return spaScoreDAOService;
}

public void setSpaScoreDAOService(SpaScoreDAOService spaScoreDAOService) {
      this.spaScoreDAOService = spaScoreDAOService;
}
</pre>
<p> </p></div><br/>


请问对form提交的数据的验证是放在Action中还是在Service的getSpaScoreSupInfo(String supItems)方法中,如果是在getSpaScoreSupInfo(String supItems)方法中,对于错误提示信息如何反馈给客户端呢?

form提交的数据校验应该是放在action中进行校验的
比如Jsp->Action->Service->Dao->PO
57 楼 iKing 2009-05-08  
<div class="quote_title">Nick_HF 写道</div><div class="quote_div"><pre name='code' class='java'>Action&lt;-Service&lt;-Dao&lt;-DB
贴段代码,可能就比较清楚了
service Interface:
public interface SpaScoreDAOService {
	public  List getSpaScoreSupInfo(String supItems);
....
}


DAO:(IBatis)
public class SpaScoreDAO extends SqlMapClientDaoSupport {
public List getSpaScoreSupInfo(String supItems) {
		return this.getSqlMapClientTemplate().queryForList("getSpaScoreSupInfo",supItems);
	}


Service implement:
public class SpaScoreDAOImp implements SpaScoreDAOService {
	SpaScoreDAO spaScoreDAO;
public List getSpaScoreSupInfo(String supItems) {
	 ...业务逻辑	
             return spaScoreDAO.getSpaScoreSupInfo(supItems);
	}
public SpaScoreDAO getSpaScoreDAO() {
		return spaScoreDAO;
	}

public void setSpaScoreDAO(SpaScoreDAO paScoreDAO){
		this.spaScoreDAO = spaScoreDAO;
	}

	
Action:
public class SpaScoreAction extends Action{

private SpaScoreDAOService spaScoreDAOService;
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
//调用业务逻辑
List supitemList = spaScoreDAOService.getSpaScoreSupInf(supItems);
......
		
}

public SpaScoreDAOService getSpaScoreDAOService() {
		return spaScoreDAOService;
}

public void setSpaScoreDAOService(SpaScoreDAOService spaScoreDAOService) {
      this.spaScoreDAOService = spaScoreDAOService;
}
</pre>
<p> </p></div><br/>


请问对form提交的数据的验证是放在Action中还是在Service的getSpaScoreSupInfo(String supItems)方法中,如果是在getSpaScoreSupInfo(String supItems)方法中,对于错误提示信息如何反馈给客户端呢?
56 楼 gavin.zheng 2008-11-03  
你的意思是在dao上加了一层映射, 比如a.insert 调用 addp.insert然后 addp进行分析 调用相关的模型上的insert
 想法不错,可惜有个问题是,业务与数据是直接挂钩的,数据一变,业务照样得变, 没实际意义, 而且这样做可能需要写的代码更多 
不划算
55 楼 elminstre 2008-08-28  
我想分层主要目的是为了解耦
54 楼 pengsky2002 2008-08-28  
action  一个action对应一个servlet请求 可调用多个service

service 一个service对应一个事务操作 可调用多个dao 其共享一个connection

dao  一个dao对应一张表


目前我是这么做的 不同意的请拍砖
53 楼 lailai_yyl 2008-08-25  
楼主说的整合DAO应该指的是增加service层吧。
我对此的见解如下:
我不欣赏DAO--SERVICE--ACTION的结构设计(尽管它是经典的)。
首先,service层会很大,方法很多。
第二,试想,所有DAO都有增删改查四个基本方法。假设在DAO层(如StudentDAO.java)里student.add(),student.delete().student.update(),student.query()。
而如果应用增加了service层(如ApplictionServiceImpl.java),需要在service层中加上
applicationService.addStudent(),deleteStudent(),updateStudent(),queryStudent()四个方法。
这时你需要更新service层的接口类ApplicationService.Java,加上这四个方法。然后再更新service层的实现类ApplicationServiceImpl,加上这四个方法,最后你发现这四个方法每个方法里都只有一句话(以addStudent()为例)
public int addStudent(Student student){
    return student.add();
}
这样是不是太傻了点,还不如在action中直接调用StudentDAO中的student.add()。
以上是我的个人看法,请各位指点
52 楼 abang8506 2008-08-25  
可以把各个Dao通用的方法写在一个Dao里,然后各个Dao继承这个公共的Dao比如说save(Object o),这样做的话就节省了很多的代码
51 楼 sunwinds1900 2008-08-25  
个人认为这是不可取的。理由有4:
1)LZ所谓的整合DAO,其实是有悖于DAO的概念的,它本身就是对应一个库表的数据操作层
2)一个DAO只完成对一个表的操作,是为了重用性。将业务逻辑掺杂进去就破环了重用性
3)Service层(或叫Bussiness层)是用来体现业务逻辑的,将业务逻辑掺杂在更加靠后的DB层是不妥的
4)对于规范的工程,所有DAO都不该是程序员写的,而是有代码生成工具根据设计文档(如表定义书等)自动生成的。其中只是单纯的DB操作,不该也不能混入业务逻辑

以上只是个人观点,欢迎探讨
50 楼 yuminglong 2008-08-05  
DAO的操作,现在我正在用的是javabean的动态反射机制实现的。建立一个Bean,字段对应数据库的字段,然后通过动态反射机制分别和数据库表进行关联。然后进行对象转换!这是个大概的思路。如果自己有时间可以自己写一个,或者参照Hibernate写!感觉Hibernate的多表关联还是比较有难度的。现在只是实现单表操作!
49 楼 wanwok 2008-07-30  
搂主的想法是对的,其实就是应该在设置一个业务逻辑层
比如Jsp->Action->Bussiness->Dao->PO

这样还不能满足楼主的要求吗?建一个业务逻辑层,完成对所有持久化类的访问.不就所说的"一个整合DAO".
48 楼 Nick_HF 2008-07-27  
<pre name='code' class='java'>Action&lt;-Service&lt;-Dao&lt;-DB
贴段代码,可能就比较清楚了
service Interface:
public interface SpaScoreDAOService {
public  List getSpaScoreSupInfo(String supItems);
....
}


DAO:(IBatis)
public class SpaScoreDAO extends SqlMapClientDaoSupport {
public List getSpaScoreSupInfo(String supItems) {
return this.getSqlMapClientTemplate().queryForList("getSpaScoreSupInfo",supItems);
}


Service implement:
public class SpaScoreDAOImp implements SpaScoreDAOService {
SpaScoreDAO spaScoreDAO;
public List getSpaScoreSupInfo(String supItems) {
...业务逻辑
             return spaScoreDAO.getSpaScoreSupInfo(supItems);
}
public SpaScoreDAO getSpaScoreDAO() {
return spaScoreDAO;
}

public void setSpaScoreDAO(SpaScoreDAO paScoreDAO){
this.spaScoreDAO = spaScoreDAO;
}


Action:
public class SpaScoreAction extends Action{

private SpaScoreDAOService spaScoreDAOService;
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
//调用业务逻辑
List supitemList = spaScoreDAOService.getSpaScoreSupInf(supItems);
......

}

public SpaScoreDAOService getSpaScoreDAOService() {
return spaScoreDAOService;
}

public void setSpaScoreDAOService(SpaScoreDAOService spaScoreDAOService) {
      this.spaScoreDAOService = spaScoreDAOService;
}
</pre>
<p> </p>
47 楼 zhaoqiangster 2008-07-26  
现在的spring或者mvc董事采用的三层模式,action--manager---dao
每个层次之间都有明显的分工
  action是用来处理参数,调用对应的业务逻辑,控制页面跳转方向,
  manager则是编写业务逻辑的层次,所谓的业务逻辑就是把对数据库的单元操作组装起来,并作数据的逻辑处理,简化就是说  每个方法要做一件事情
  dao则是对数据库的单元操作,每个方法都是对数据库的一个基本操作。
楼主说的数据表结构变动的问题,我觉得如果严格按照这个层次来分的话,并且接口设计的合理的话,应该不需要频繁的变动的,如果数据库表结构变动的话,可能只需要变动的是action中获取参数的时候,还有dao的对应方法
 
46 楼 。。。 2008-07-25  
laiseeme 写道
一直用一个basedao  不过用的是hibernate,一个通用的dao里面包括了一些基本的查询,添加修改删除等等,各个模块dao继承这个basedao,有这个模块相对个性的查询就写到这里面,通用的查询等等就调用basedao里面的方法


我记得Eclipse有个Hibernate的插件,就提供BaseDAO这样风格的代码的自动生成~~以前某个项目中用过
45 楼 carrot 2008-07-25  
最近的项目设计中,淡化dao层设计,dao层用泛型实现就可以了, 所有的实现都集中在业务层中,而且事务的提交也都是定义在Service层中。

44 楼 风雪涟漪 2008-07-25  
考虑问题简单了点。做系统要考虑的是可扩展,controller->dao 。。把复杂的业务也写到dao了?到时候,如果添加功能需要aop 你怎么办。。。估计还要把 controller里的 dao 抽出来个service层了 。对service进行AOP。。。根据你的业务状况仔细想想吧。。
43 楼 athene11 2008-07-25  
有人说过,使用JAVA解决某问题如果觉得所设计的框架/代码太复杂时,解决办法就是“加入更多的层次和更多的类”。
关键是看是不是适合自己做的系统了。如果你的应用中不止有关系数据库做为dao,还有xml文件和webservice接口等做为dao,那么它确实是必不可少的。
42 楼 privatemiao 2008-07-25  
"为什么整个项目都写在一个文件里呢"

那会发生什么呢

维护、权限控制、业务变化 等等 又怎么办呢。

相关推荐

    DAO编程模式

    在最近的18个月,我和一个优秀的软件开发团队一起工作,开发定制基于WEB的供应链管理应用程序.我们的应用程序访问广泛的持久层数据,包括出货状态,供应链制度,库存,货物发运,项目管理数据,和用户属性等.我们使用JDBC ...

    Common JDBC DAO组件系统库及帮助手册

    CommonJDBCDAO组件则是由国人自主开发实现的基于JDBC API的数据访问组件,保留有O/R Mapping工具的简便性,也具有JDBCTemplate的灵活性,对JDBC API进行彻底的封装和简化,而且使用简单,...技术讨论QQ群:298829674

    treasury-dao:财政部 DAO 的所有形成文件和工具

    财政部 DAO 这是存放财政部 DAO 的所有形成文件、脚本和工具的地方。 宪法 去做 行为守则 去做 放样快照 质押快照是对所有用户质押和委托数量进行快照... 关键部分是治理论坛的链接,该链接将链接他们的讨论身份和其他

    JAVA_DAO 事务界定 异常处理,日志记录

    数据访问对象,事务界定。在本文中,Java 开发人员 Sean C. Sullivan 讨论了 DAO 编程中三个常常被忽略的方面:事务界定、异常处理和日志记录。

    java底层代码:泛型DAO+SSH+Proxool连接池+国际化语言

    1、基于ssh的底层代码,可以用于开发各种web系统。 2、采用Jsp-&gt;Action-&gt;Service-&gt;Dao的编码方式,封装了HibernateUtil、SpringUtil、HqlUtil等工具...本人是初学者,代码能力有限,有什么好的意见或想法可以大家讨论。

    去中心化自治组织:发展现状、分析框架与未来趋势

    分布式自治并非一个新的概念,自然界中的自组织现象、互联网上的动态网民群体组织以及分布式人工智能等均可视作其早期表现形式。近年来,区块链技术的快速发展催生了去中心化自治组织(DAO),它是一种将组织的管理...

    NHibernate in Action by Christian Bauer

    我们在本章中讨论一个业务模型及实例来展示如何自动进行版本控制和锁控制(locking)。缓存是NHibernate的核心,你也会在本章中了解一级缓存和二级缓存大量内容。 第六章介绍了NHibernate的类型系统以及如何引入...

    iBatis介绍文档.rar

    iBATIS 包括 for Java 和 for .NET 两个版本,for Java 版提供了SQL Maps 和 DAO 框架,for .NET 只提供了 SQL Maps 框架。从现在开始我们只对 for Java 版的SQL Maps 展开讨论。 你可以在 http://www.ibatis.com ...

    Java宠物商店(增删改查)

    Java宠物商店增删改查,常用的增删改查的实现之dao层,宠物信息:宠物ID,宠物类别,宠物名字,宠物性别,宠物年龄,宠物入库日期 ,这是前几天的习题,是一个宠物管理系统,就是对宠物的信息进行管理的一套系统宠物信息...

    ExtJs单用户Blog系统后台源码

    DAO层使用的泛型DAO,只需要一个DAO接口即可,不需要写具体的实现。 后台具有以下功能: 写新日志 分类管理 日志内容管理 传照片 分类管理 照片管理 评论管理 用户管理 友情连接管理 Blog属性设置 系统文档 该...

    iBATIS实战

    书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的大部分知识点,可以作为iBATIS学习和Web开发的经典案例,非常值得深入研究。 本书既可为广大的开发人员(不仅仅是Web应用程序开发人员)...

    employees:JDBC类的员工项目

    员工-JDBC类的项目 介绍 该资源库提供了有关如何... 编写一个程序,该程序将创建一个新部门-IT-并向其中添加两名员工,包括一名员工作为其经理。 DTO和DAO 为部门,就业,薪资实体编写DTO 编写一个在上述DTO上运行的

    Spring面试题

    但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。 基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件 8. ...

    Common JDBC DAO组件系统库-开源

    CommonJDBCDAO组件则是由国人自主开发实现的基于JDBC API的数据访问组件,保留有O/R Mapping工具的简便性,也具有JDBCTemplate的灵活性,对JDBC API进行彻底的封装和简化,而且使用简单,...技术讨论QQ群:298829674

    权力下放的自治组织和治理问题-研究论文

    分散自治组织(DAO)代表了组织设计方面的一项创新,它强调计算机化的规则和合同,但是DAO的结构和功能也引发了治理问题。 本讨论文件列举了这些问题,以鼓励对DAO和治理进行进一步的研究。

    SeimiCrawler文档离线版

    写一个DAO ◾5.8.3.开始使用DAO ◦5.9.分布式 ◦5.10.通过http服务接口操作 ◾5.10.1.Request必填参数 ◾5.10.2.SpringBoot(推荐) ◾5.10.3.直接运行 ◾5.10.3.1.发送抓取请求 ◾5.10.3.2.接口描述 ◾5.10...

    java设计模式CatalogDAOFactory是典型的工厂方法

     * 本方法制定一个特别的子类来实现DAO模式。  * 具体子类定义是在J2EE的部署描述器中。  */  public static CatalogDAO getDAO() throws CatalogDAOSysException {  CatalogDAO catDao = null;  try {  ...

    api3-docs:API3项目的文档

    它由一个分散的自治组织(DAO)监管,其代码是开源的,并且其操作是透明的。API3论文声明分散式应用程序需要的绝大多数外部集成都是针对传统企业为将其数据和服务货币化而构建的商业Web API。 因此,在实践中,...

    Delphi最新三层源码

    其实就相当于客户端和中间层的一个简单的协议,客户端发一个boname,一个服务名,这都是约定的。也就是不变的。以后该业务要变,就十分方便,只需要在中间层的定位器,配置一下就可以了,如果采用XML或文件配置,不...

Global site tag (gtag.js) - Google Analytics