`
ASDF1982
  • 浏览: 18244 次
  • 性别: Icon_minigender_1
  • 来自: dalian
社区版块
存档分类
最新评论

关于DAO设计的一个问题 (讨论)

阅读更多
假设有两个实体模型User 和 account .
那么在设计DAO的时候:
   UserDAO里面放只涉及到User信息的数据库操作,AccountDAO里面放只涉及到Account的信息,
   涉及到User和Account共同的信息全部放到UserAccountDAO里面.
   不知道大家是怎么样设计的
分享到:
评论
20 楼 ASDF1982 2007-03-16  
谢谢楼上的,
首先MVC只是个表示层模式而已
再次越是频繁变动的系统越应该分层,正因为分层了,引入了一些接口辅助模式,才不会改一处牵全身.
包括你说的开闭原则的理解也有问题哈,分层引入接口模式不正式为了符合开闭原则么?
你说的话完全反了,不太理解...

我的问题是怎样在jdbc的情况下没有Spring等容器,怎么设计实现spring所提供的事物管理 比如怎样设计自己 的组建!

19 楼 giscat 2007-03-16  
分层,MVC即可
至于其他的分层,设计的好,完全可以达到同样的效果

对于频繁变动,更不宜分层太多
  一个修改,要去改N个地方,用struts/webwork/spring+hibernate/ibatis做系统的朋友肯定经历过
       其实这样的架构,这样的设计不见得好
  设计上有一个很重要的原则:扩展开放,修改封闭
      一处修改,扩散污染到其他层(层次很深)的设计不见得好
  水平方向的分层可细一些,垂直方向上的分层,要控制好层次
  (绝不是越多越好)
    MVC的垂直分层粒度已经比较适用了
       
18 楼 ASDF1982 2007-03-16  
java是语言,但考虑到java企业应用是面象规范的,考虑到不同的产品很多.分层隔离虽然有点繁琐,但是在大项目中的时候,需要很多人合作编程的时候,需求可能变动的时候,还是必要的.
17 楼 giscat 2007-03-16  
ASDF1982 写道
看不太明白楼上的代码,有几个问题呀
1.这里的Action是否和struts等框架的action一样起到控制流程的作用,如果是这样的话那不太好吧,数据库的操作不应该和ation发生关系吧
2. 在哪里用的代理?
3. connection的创键和销毁怎样做才能不和dao以及service绑死呢
   (有没有什么办法能象spring那样教给容器处理),提供一个组建呢代替spring的事务控制


  
   设计上是不合理,实践效果确很好

       j2ee讲模式讲分层,理论上很上层次上境界
       实战效果确输给ROR(这个东东可不管啥分层不分层的)

      dao,service,action 呀,搞得一堆一堆
       合久必分,分久必合
        统统合并掉,啥烦恼都不会有了
          唯一不能合的是mvc 三个部分分开(无论是物理上的还是逻辑上的分离)
              维护性,扩展性自然而然就会上去
      事情变得简单了,工作轻松了,质量上去了,成本下来了,票票进来了,老板也开心了

个人意见,仅供参考
          
   
16 楼 ASDF1982 2007-03-16  
看不太明白楼上的代码,有几个问题呀
1.这里的Action是否和struts等框架的action一样起到控制流程的作用,如果是这样的话那不太好吧,数据库的操作不应该和ation发生关系吧
2. 在哪里用的代理?
3. connection的创键和销毁怎样做才能不和dao以及service绑死呢
   (有没有什么办法能象spring那样教给容器处理),提供一个组建呢代替spring的事务控制
15 楼 giscat 2007-03-16  
ASDF1982 写道
继续...connection采用从哪里创建 从哪里关闭!


可组合使用 command,template,proxy,decorator,filter,chain等设计模式
   
       一个简单的实现思路,供参考     (可参考webwork,struts,spring等设计思路)
      更具体的可参考上楼的上楼的俺的小破文,见笑拉

public class Action{
 Connection cn = null;

  public void preHandler(){

  }

  public void postHandler(){

  }

  public void exceptionHandler(Exception e){

  }


  Connection getConn(){
        
           if(cn==null){cn = DBUtil.getConn();}
  }

  
  void closeConn(){
            return DBUtil.close(cn);
  }

  public void run(){
           try{
             preHandler();
           getConn();
           execute();
           postHandler();
           }catch(Exception e){
              exceptionHandler(e);
           }finally{closeConn();}
  }

    public void execute(){
         
  }

}




public class BaseAction extends Action{

        //这里可实现 preHandler,postHadler,exceptionHandler   等方法  
          //连接获取和关闭由getConn()和closeConn()实现
}





           XAction extends BaseAction{

               //实现业务方法execute
        }




Action action = new XAction();
        action.run();



14 楼 ASDF1982 2007-03-16  
继续...connection采用从哪里创建 从哪里关闭!
13 楼 weiqingfei 2007-03-15  
ASDF1982 写道

目的二是:
   用直接用jdbc操作数据库不采用第三方框架的时候(如Spring)大家是怎么控制事物的,connection是在哪里创建的
   象我这个例子有什么不好么,应该怎么做好些呢?


java的开发我不是很清楚,.net里面,一般分为

表现层,facade层,业务逻辑层,数据访问层,后面就是sqlhelper一类用jdbc直接操作数据库。

一般,事务和连接都是在业务逻辑层创建,然后一层层向后传的。
12 楼 giscat 2007-03-15  
dao,service可以合并
dao,service,action也可以合并
      connection的打开关闭操作可交给父类做

   一个DIY的框架,供参考,献丑了
  
  超级简单的mvc框架ajf(agile java framework)

  http://www.iteye.com/topic/38847
11 楼 yiding_he 2007-03-15  
从业务逻辑上看第一种方式比较自然。

jdbc 的数据库连接当然是从 DriverManager 得到的。处理事务的话,如果把 Connection 传来传去容易乱套,不传又影响了代码的重用,哈哈
10 楼 ASDF1982 2007-03-06  
写这个例子有两个目的:
目的一是:

是大家碰到象这样的一对多(一个User可以对应多过Account)或者
多对多的时候,会建例几个实体模型我想到两种方式
1.建立一个User对象,一个Account对象
  user里面包含List accounts;
  account里面包含 userId;
2.建立一个User对象,一个Account对象,
  在建立一个UserAccount关联对象(里面包含所有的user对象和account对象的属性);

目的二是:
   用直接用jdbc操作数据库不采用第三方框架的时候(如Spring)大家是怎么控制事物的,connection是在哪里创建的
   象我这个例子有什么不好么,应该怎么做好些呢?
9 楼 ASDF1982 2007-03-06  
Client客户端调用程序

/*
 * Created on Mar 6, 2007
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package com.java.client;
import com.java.service.UserService;
/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class Client 
{

	public static void main(String[] args)
	 {
	 	//定义用户Id
	 	int userId = 100;
	 	UserService userService = new UserService();
	 	userService.delUser(userId);
	 	
	}
}
8 楼 ASDF1982 2007-03-06  
DaoFactory
/*
 * Created on Mar 6, 2007
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package com.java.dao;

import java.sql.Connection;

 

/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class DaoFactory 
{
   public static UserDAO getUserDAO(Connection connection)
   {
	return new UserDAOImpl(connection);
   	
   }
   public static AccountDAO getAccountDAO(Connection connection)
   {
   	 return new AccountDAOImpl(connection);
   }
}


UserService 类

/*
 * Created on Mar 6, 2007
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package com.java.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import com.java.db.Account;
import com.java.db.User;
import com.java.dao.AccountDAO;
import com.java.dao.DaoFactory;
import com.java.dao.UserDAO;


/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class UserService 
{  
	private Connection connection;
	private Connection getConnection()
	{   
		//to-do  open a connection form the dbPool
		this.connection =null; 
		return connection;
	}
	public  User findUser(int userId)
	{   
		User user = null ;
		try
		{
		 getConnection();
		 UserDAO userDAO = DaoFactory.getUserDAO(this.connection);
		 user = userDAO.findUserById(userId);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try {
				connection.close();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		return user;
		 
	}
	public void delUser(int userId)
	{
		
				try
				{
				 getConnection();
				 connection.setAutoCommit(false);
				 
				 AccountDAO accountDao = DaoFactory.getAccountDAO(this.connection);
				 UserDAO userDao =DaoFactory.getUserDAO(this.connection);
				 List list = userDao.findAccountByUserId(userId);
				 int[] accounts = new int[list.size()]; 
				 for(int i = 0;i<list.size();i++)
				 {
				 	Account account =(Account)list.get(i);
				 	accounts[i]= account.getAccountId();
				 }
				 accountDao.batchDelAccount(accounts);
				 userDao.delUser(userId);
				 connection.commit();
				 
				}
				catch(Exception e)
				{
					e.printStackTrace();
					try 
					{
						connection.rollback();
					} catch (SQLException e1)
					 {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
				finally
				{
					try 
					{
						connection.close();
					} catch (SQLException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
				
	}

}
7 楼 ASDF1982 2007-03-06  
AccountDao


/*
* Created on Mar 6, 2007
*
* To change the template for this generated file go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
package com.java.dao;

import java.util.List;

import com.java.db.Account;
import com.java.db.User;

/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public interface AccountDAO 
{
   public int saveAccount(Account account)throws Exception;
   public boolean delAccount(int accountId)throws Exception;
   public void updateAccount(Account account)throws Exception;
   public Account findAccountByID(int id)throws Exception;
   public User findUserByAccountId(int accountId)throws Exception;
   public List findAllAccount()throws Exception;
   public boolean batchDelAccount(int[] accountId)throws Exception;
}



AccountDaoImpl


/*
 * Created on Mar 6, 2007
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package com.java.dao;

import java.sql.Connection;
import java.util.List;

import com.java.db.Account;
import com.java.db.User;

/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public class AccountDAOImpl implements AccountDAO {

	private Connection connection =null;
	public AccountDAOImpl(Connection connection) {
		this.connection =connection;
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#saveAccount(com.java.db.Account)
	 */
	public int saveAccount(Account account) {
		// TODO Auto-generated method stub
		return 0;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#delAccount(int)
	 */
	public boolean delAccount(int accountId) {
		// TODO Auto-generated method stub
		return false;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#updateAccount(com.java.db.Account)
	 */
	public void updateAccount(Account account) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#findAccountByID(int)
	 */
	public Account findAccountByID(int id) {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#findUserByAccountId(int)
	 */
	public User findUserByAccountId(int accountId) {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#findAllAccount()
	 */
	public List findAllAccount() {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#batchDelAccount(int[])
	 */
	public boolean batchDelAccount(int[] accountId) throws Exception {
		// TODO Auto-generated method stub
		return false;
	}

}


UserDAO 类

/*
 * Created on Mar 6, 2007
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package com.java.dao;

import java.util.List;

import com.java.db.User;

/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public interface UserDAO 
{
	
	public int saveUser(User user)throws Exception;
	public boolean delUser(int userId) throws Exception;
	public void updateUser(User user) throws Exception;
	public User findUserById(int userId) throws Exception;
	public List findUserByName(String userName) throws Exception;
	public List findAllUser()throws Exception;
	public List findAccountByUserId(int userId)throws Exception;

}


UserDAOImpl类


/*
 * Created on Mar 6, 2007
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package com.java.dao;

import java.sql.Connection;
import java.util.List;

import com.java.db.Account;
import com.java.db.User;

/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public class AccountDAOImpl implements AccountDAO {

	private Connection connection =null;
	public AccountDAOImpl(Connection connection) {
		this.connection =connection;
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#saveAccount(com.java.db.Account)
	 */
	public int saveAccount(Account account) {
		// TODO Auto-generated method stub
		return 0;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#delAccount(int)
	 */
	public boolean delAccount(int accountId) {
		// TODO Auto-generated method stub
		return false;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#updateAccount(com.java.db.Account)
	 */
	public void updateAccount(Account account) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#findAccountByID(int)
	 */
	public Account findAccountByID(int id) {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#findUserByAccountId(int)
	 */
	public User findUserByAccountId(int accountId) {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#findAllAccount()
	 */
	public List findAllAccount() {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see com.java.dao.AccountDAO#batchDelAccount(int[])
	 */
	public boolean batchDelAccount(int[] accountId) throws Exception {
		// TODO Auto-generated method stub
		return false;
	}

}

6 楼 ASDF1982 2007-03-06  
User 类

	/*
	 * Created on Mar 6, 2007
	 *
	 * To change the template for this generated file go to
	 * Window>Preferences>Java>Code Generation>Code and Comments
	 */
	package com.java.db;
	
	import java.io.Serializable;
	
	/**
	 * @author asdf
	 *
	 * To change the template for this generated type comment go to
	 * Window>Preferences>Java>Code Generation>Code and Comments
	 */
	public class User implements Serializable 
	{
		
		private int userId;
		private String userName;
		private String firstName;
		private String lastName;
		private String nickName;
		private String email;
		
	}



Account类
  
/*
 * Created on Mar 6, 2007
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package com.java.db;

import java.io.Serializable;
import java.util.Date;

/**
 * @author asdf
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class Account implements Serializable 
{
	private int accountId;
	private int userId;
	private String accountType;
	private Date createDate;
	private Date updateDate;
	

}


省略get/set方法
5 楼 ASDF1982 2007-03-06  
包结构为
com.java.client
  Client.java
com.java.dao
  AccountDao.java
  AccountDaoImpl.java
  UserDao.java
  UserDaoImpl.java
  DaoFactory.java
com.java.db
  Account.java
  User.java
com.java.service
  UserService.java


************************************
 
4 楼 ASDF1982 2007-03-06  
一对多写了几行代码;改改吧
3 楼 刑天战士 2007-03-06  
涉及到共同的信息?难道User和Account是多对多的?不合常理阿?如果你指的是数据库方面的多个操作,应该写成Service
2 楼 hgq0011 2007-03-06  
方法:
1)在上面添加一个service层
2)直接在某个DAO中操作。
1 楼 hgq0011 2007-03-06  
方法:
1)在上面添加一个service层
2)直接在某个DAO中操作。

相关推荐

    设计之道.pdf

    在软件开发领域,“设计之道”不仅是关于如何创建高效、灵活的系统结构,更关乎如何在不断变化的需求和技术环境中保持竞争力。本书《设计之道》深入探讨了软件设计的各种方法论、模式及其在实际项目中的应用案例。接...

    程序设计之道(程序设计中的秘籍)

    总的来说,《程序设计之道》不仅是一本关于编程的技术书籍,更是一本启发思考、引导程序员悟道的智慧之书。它教会我们,成为一名优秀的程序员不仅仅是技术的积累,更是对编程哲学的理解和领悟。通过阅读此书,读者...

    设计之道(pdf)

    针对“过度设计”与“简单设计”的讨论,书中提出了一个有趣的观点:简单并不意味着功能上的妥协,而是在满足当前需求的同时,保持足够的灵活性和扩展性。Kent Beck提出的“最简单的可行解决方案”(Do the simplest ...

    设计之道 PDF

    10. 性能优化:对于任何软件设计,性能都是一个关键考量因素。书中可能提供了关于.NET性能调优的技巧,包括内存管理、并发处理、数据库优化等方面。 总的来说,《设计之道》是一本深度结合.NET设计框架的书籍,不仅...

    2003集训队100道讨论题

    《2003集训队100道讨论题》是一个专门为ACM(国际大学生程序设计竞赛)集训队员设计的挑战性习题集。这个压缩包包含了100道精心挑选的难题,旨在帮助参赛者提升算法设计、问题解决和编程能力。ACM竞赛是一项全球性的...

    轨道交通设计总体总包管理系统的设计.pdf

    城市轨道交通是一个系统性的综合工程,设计过程中涉及多个专业和设计单位,需要设计总包对设计过程中的人员、合同、计划、公文、会议、联系单、考核、文件审查、资料归档等进行全过程管理。为此,需要建立一套...

    基于三菱PLC的城市主干车道按钮式人行道交通灯控制系统设计.pdf

    本篇文档主要讨论了利用三菱PLC(可编程逻辑控制器)来设计一个适用于车流量大、人流量相对较小的城市主干车道按钮式人行道交通灯控制系统。以下是根据文档内容提炼出的知识点: 1. 交通信号灯的背景与挑战 城市...

    广工操作系统课程设计-多道批处理两级调度模拟

    总的来说,这个课程设计是一个全面了解和实践操作系统核心概念的绝佳平台,它涵盖了多道批处理系统、两级调度和常见调度算法等多个方面。通过这个项目,学生将深入理解操作系统如何高效地管理资源,以及如何优化调度...

    JAVA web模式设计之道.zip

    通过确保一个类只有一个实例,并提供全局访问点,可以减少资源消耗并简化管理。 2. **工厂模式**:在Java Web中,工厂模式用于创建对象,比如Servlet容器会使用ServletFactory来创建Servlet实例。它隐藏了对象创建...

    卫星六个轨道根数的c++程序

    总的来说,这个C++程序提供了一个工具,能够帮助研究人员和工程师分析卫星在二体问题中的运动,对于卫星轨道设计、控制和监测具有实际意义。通过理解和运用这个程序,我们可以更好地理解和模拟天体在引力场中的运动...

    和我一起用STM32做12通道发射接收机

    该设计中讨论了如何设计一个低成本的 PCB,满足 12 通道发射接收机的需求。 电路图设计 在该设计中,讨论了电路图设计的相关问题。电路图是一种图形化的电路设计方法,广泛应用于嵌入式系统设计中。该设计中讨论了...

    编程之道-IOS设计模式解析[www.xiandoudou.com]

    附带的资源中,"Objective-C编程之道IOS设计模式解析.url"可能是指向该主题的其他相关资料,"一步一步学习 iOS 6 编程(第四版).url"可能提供了关于iOS早期版本的编程教程,而"iPhone开发视频教程 iOS开发Objective-C...

    C#设计之道

    综上所述,《C#设计之道》不仅是一本关于软件设计的技术书籍,更是引导读者思考如何在软件开发过程中做出明智决策的重要指南。通过对设计理论的深入剖析和具体模式的实例应用,本书旨在帮助读者提升设计能力,更好地...

    2014年国赛一等奖A嫦娥三号软着陆轨道设计与控制策略-浙江工业大学-论文.rar数学建模

    这篇论文深入探讨了嫦娥三号月球探测器的软着陆轨道设计及其控制策略,这是航天工程中的一个重要课题。 在航天领域,软着陆是指航天器以足够低的速度在目标天体表面降落,以避免撞击造成的破坏。对于嫦娥三号这样的...

    软件设计师之道ppt

    在设计原则部分,可能会提到“单一职责原则”(SRP),它要求每个类或模块只负责一个功能,保持职责清晰;“开闭原则”(OCP),即软件实体应对扩展开放,对修改关闭,保证系统的灵活性;“里氏替换原则”(LSP),...

    数电电子课程设计设计电路设计,十字路口主干道

    本文将详细讨论如何利用数字电路技术设计一个十字路口主干道的交通灯控制系统。 首先,该设计的主要技术指标包括主干道绿灯45秒,支干道绿灯25秒,黄灯作为过渡时间5秒,以及红、黄、绿三种颜色的LED信号灯的显示。...

Global site tag (gtag.js) - Google Analytics