论坛首页 Java企业应用论坛

DAO的一个讨论问题

浏览 33964 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (8) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-05  
DAO的操作,现在我正在用的是javabean的动态反射机制实现的。建立一个Bean,字段对应数据库的字段,然后通过动态反射机制分别和数据库表进行关联。然后进行对象转换!这是个大概的思路。如果自己有时间可以自己写一个,或者参照Hibernate写!感觉Hibernate的多表关联还是比较有难度的。现在只是实现单表操作!
0 请登录后投票
   发表时间:2008-08-25  
个人认为这是不可取的。理由有4:
1)LZ所谓的整合DAO,其实是有悖于DAO的概念的,它本身就是对应一个库表的数据操作层
2)一个DAO只完成对一个表的操作,是为了重用性。将业务逻辑掺杂进去就破环了重用性
3)Service层(或叫Bussiness层)是用来体现业务逻辑的,将业务逻辑掺杂在更加靠后的DB层是不妥的
4)对于规范的工程,所有DAO都不该是程序员写的,而是有代码生成工具根据设计文档(如表定义书等)自动生成的。其中只是单纯的DB操作,不该也不能混入业务逻辑

以上只是个人观点,欢迎探讨
1 请登录后投票
   发表时间:2008-08-25  
可以把各个Dao通用的方法写在一个Dao里,然后各个Dao继承这个公共的Dao比如说save(Object o),这样做的话就节省了很多的代码
0 请登录后投票
   发表时间: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()。
以上是我的个人看法,请各位指点
0 请登录后投票
   发表时间:2008-08-28  
action  一个action对应一个servlet请求 可调用多个service

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

dao  一个dao对应一张表


目前我是这么做的 不同意的请拍砖
0 请登录后投票
   发表时间:2008-08-28  
我想分层主要目的是为了解耦
0 请登录后投票
   发表时间:2008-11-03  
你的意思是在dao上加了一层映射, 比如a.insert 调用 addp.insert然后 addp进行分析 调用相关的模型上的insert
 想法不错,可惜有个问题是,业务与数据是直接挂钩的,数据一变,业务照样得变, 没实际意义, 而且这样做可能需要写的代码更多 
不划算
0 请登录后投票
   发表时间:2009-05-08   最后修改: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)方法中,对于错误提示信息如何反馈给客户端呢?
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2009-05-09  
carrot 写道
最近的项目设计中,淡化dao层设计,dao层用泛型实现就可以了, 所有的实现都集中在业务层中,而且事务的提交也都是定义在Service层中。



这种不错 比以前的单独做个dao层觉得爽一点。。
0 请登录后投票
论坛首页 Java企业应用版

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