`
wm920
  • 浏览: 80684 次
  • 性别: 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  
"为什么整个项目都写在一个文件里呢"

那会发生什么呢

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

相关推荐

    java 基于泛型与反射的通用 DAO

    本文将深入探讨如何结合这两种技术实现一个通用的DAO(Data Access Object)设计模式。 首先,我们来看“泛型”。泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和...

    数据库dao操作jdbc

    DAO设计模式的核心思想是创建一个接口或抽象类,代表特定的数据对象,然后实现这个接口或抽象类来处理与数据库的交互。在Java中,通常会为每个数据库表创建一个DAO类,用于执行CRUD(Create、Read、Update、Delete)...

    《J2EE核心模式》(DAO模式)

    它通过创建一个接口或抽象类来封装对数据库的访问操作,使得业务对象可以不直接与数据库进行交互,而是通过DAO对象来进行。这样,即使数据库的实现发生变化,只要接口或抽象类不变,业务层的代码就不需要修改,降低...

    java好用的dao

    "java好用的dao"这个标题暗示我们将讨论一个方便、高效的Java DAO实现,而"autodao"标签则指向了一个特定的库——AutoDAO,它自动为开发者生成DAO类,简化了开发过程。 AutoDAO是一个轻量级的开源Java库,它的主要...

    Factory(DAO).rar_Factory DAO_dao_dao facto_factory

    总的来说,Factory DAO模式是提高代码可扩展性和可维护性的一个有效工具,特别是在需要处理多种数据存储方式(如数据库、文件系统、Web服务等)的项目中。通过理解并正确运用这种模式,开发者能够更好地组织代码,...

    DAO-2.3.4.726

    DAO-2.3.4.726 可能是指DAO的一个特定版本,这在Java编程中常见,因为Java的DAO实现常常会以这种方式标记版本号。 iBATIS 是一个流行的数据持久层框架,它为Java应用提供了SQL映射框架。在iBATIS中,DAO(Data ...

    自动生成DAO源代码

    在本例中,我们可以创建一个JET模板来生成符合特定规范的DAO类,例如,模板可以包含接口定义、实现类以及相关的方法。JET模板使用一种类似Java的语法,可以通过变量和表达式动态地生成代码。 接下来,我们讨论...

    HibernateDao 通用

    在第一个周五的下午,团队会召开技术会议,讨论遇到的问题和技术解决方案。每天上午9:10,团队进行10分钟的站立会议,快速同步各自的工作进度。 开发环境配置包括使用JDK 1.6作为Java运行环境,Tomcat作为应用...

    hibernate4 通用dao,service

    由于没有具体的文件列表,我们无法详细讨论每个文件的内容,但根据标题和描述,我们可以推断这是一个关于使用Hibernate4创建通用DAO和Service的教程或资源,旨在帮助Java开发者理解和应用这种模式来提高开发效率。...

    Don’t repeat the DAO!

    1. **DAO模式概念**:DAO模式是一种设计模式,它定义了一个接口,用于封装对底层数据存储的访问,使得业务逻辑层可以与数据存储层分离。这样,即使数据存储方式改变,业务逻辑层也不需要修改。 2. **使用场景**:当...

    new_dao

    标题 "new_dao" 暗示我们关注的是与数据库操作相关的编程概念,可能是关于一个新的数据访问对象(DAO)的设计或实现。由于没有具体的描述,我们将基于标签 "源码" 和 "工具" 进行推测,并结合博客链接进行讨论。 在...

    dao.rar_dao

    DAO模式的核心思想是为每个数据表或数据库操作创建一个对应的DAO类,这样可以使得业务代码更加清晰,易于维护和测试。在这个"dao.rar_dao"的压缩包中,包含了一系列与DAO相关的Java源代码文件,它们分别是ItemDAO....

    dao设计模式视频教程

    DAO模式的主要目标是创建一个独立于数据库访问的接口层,使得业务对象可以不直接与数据库进行交互,而是通过调用DAO对象的方法来完成数据的增删改查操作。这样,如果数据库技术或者访问方式发生变化,只需要修改DAO...

    JavaScript语言教程基于autojs的Daodao for Android

    起初这还只是一个想法,直到主题群有小伙伴问到daodao(叨叨点啥)的搭建,讨论到了如何快捷发送daodao,原教程里只有ios版的,小伙伴就想着自己做一个,然后就有了daodao-bash。这版本是在pc端上用的,我就想着好像还...

    自动生成dao,service

    总的来说,自动生成DAO和Service代码是现代Java Web开发中的一个重要实践,它提高了开发效率,减少了错误,并保持了代码的整洁和一致性。通过理解和熟练运用这类工具,开发者可以更好地专注于业务需求,而不是基础...

    工厂模式很DAO模式实现购物车

    本项目“工厂模式很DAO模式实现购物车”是使用Java语言实现的一个购物车系统,旨在帮助初学者理解并运用这两种设计模式。 首先,我们来看**工厂模式**。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳...

    JSP+DAO和MVC+DAO(基于MySQL数据库分页)-v笔记

    **DAO的作用**在于提供一个抽象层,隔离业务逻辑和数据访问操作。在分页场景下,DAO会包含获取指定范围数据的接口,例如`getRecordsByPage(int pageNum, int pageSize)`。 **MVC+DAO分页** MVC模式是一种设计模式...

    StuDAO.rar_dao

    4. 模式优缺点:讨论DAO模式带来的好处,如解耦、提高可测试性,以及可能存在的问题,如过度封装可能导致的效率问题。 5. 框架集成:介绍如何将DAO模式与Spring等框架结合,利用框架的事务管理、AOP等功能进一步优化...

    spring hibernate 泛型DAO

    为了解决这个问题,我们可以使用泛型DAO。泛型DAO是一个通用的DAO实现,它使用Java的泛型特性,可以适用于任何继承自特定基类或者实现特定接口的数据实体类。这样,我们只需要编写一次DAO的通用实现,然后在需要的...

    分了dao service的ssm整合还附带分页功能

    在这个项目中,我们看到标题提到"分了dao service的ssm整合还附带分页功能",这表明项目不仅实现了SSM的基础整合,还在数据访问层(DAO)和服务层(Service)进行了分离,并且加入了分页功能,这对于新手来说是一个很好...

Global site tag (gtag.js) - Google Analytics