请教DAO模式的问题?

nitworm 2005-01-14 04:26:22
我想在以后项目中使用hibernate;因此想把以前的东西修改,请高手帮忙!
模块采用工厂/接口的方式;和jive论坛采用的差不多
public abstract class BookFactory{
private BookFactory();
public static BookFactory createInstance();
public abstract Book createBook(String bookname String descripe); //创建图书,返回图书的接口
public abstract void deleteDomain(String bookname); //删除图书
public abstract Book getBook(String bookname)
public abstract String [] getAllBooks(); //得到所有的书
//其他业务逻辑
}
interface Book{
setName(String bookname); //修改书名,写入数据库
setDescripe(String descrip);
getName();
getDescrpe();
//其他业务逻辑
}
Customer,Order同以上
实现类略!
我用DBBookFactory去继承这个抽象类;去实现抽象方法;比如创建一个或得到一个book就返回Book接口!通过这个Book接口来进行book的修改等操作!
现在我想使用DAO模式;以后改为hibernate;但看了DAO模式还是不太清楚!
看了个范例把我的框架修改如下(参考 sun j2ee core pattern)
采用抽象工厂,利于以后扩展
public abstract class DAOFactory {

// List of DAO types supported by the factory
public static final int HIBERNATE = 1; 采用hibernate
public static final int SELFDAO = 2; 采用自定义dao

public abstract BookDAO getBookDAO();
public abstract CustomerDAO getCustomerDAO();
public abstract OrderDAO getOrderDAO();

public static DAOFactory getDAOFactory(
int whichFactory) {

switch (whichFactory) {
case HIBERNATE :
return new HibernateDAOFactory();
case SELFDAO :
return new SelfDAOFactory();
...
default :
return null;
}
}
}

继承类
public class SelfDAOFactory extends DAOFactory {
public CustomerDAO getCustomerDAO() {
return new SelfCustomerDAO();
}
public BookDAO getBookDAO() {
return new SelfBookDAO();
}
public OrderDAO getOrderDAO() {
return new SelfOrderDAO();
}
...
}
public interface CustomerDAO {
public int insertCustomer(...);
public boolean deleteCustomer(...);
public Customer findCustomer(...);
public boolean updateCustomer(...);
public RowSet selectCustomersRS(...);
public Collection selectCustomersVO(...);
...
}
//CustomerDAO的实现类略;
//值对象
public class Customer implements java.io.Serializable {
// member variables
int CustomerNumber;
String name;
String streetAddress;
String city;
...

// getter and setter methods...
...
以上是我照葫芦画瓢改的;但我想尽量不要动的太多!另外采用这种模式我的业务逻辑代码放到那里好!好象dao模式主要进行crud操作;对象Dao接口中不应该被放入更多的业务逻辑!那么其他业务逻辑放到那里好呢?是否还有更好的方法或更好的框架!小弟初学,请各位高手帮忙!谢谢!
...全文
965 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuquanyi 2005-06-29
  • 打赏
  • 举报
回复
学习!
密码测试 2005-06-29
  • 打赏
  • 举报
回复
study
xwmhmily 2005-06-20
  • 打赏
  • 举报
回复
DAO 上加多一层BO(Business Object),与前台交互,用于业务操作和调用DAO。也用工厂方法,接口,接口实现的方式。这样DAO就不参与业务了。
key_feng 2005-06-14
  • 打赏
  • 举报
回复
路過﹗
Czh_cz 2005-06-14
  • 打赏
  • 举报
回复
学习
laoji 2005-04-27
  • 打赏
  • 举报
回复
mark
discolt 2005-04-23
  • 打赏
  • 举报
回复
DAO只是一个数据访问对象,主要用来隔绝持久层数据库,适合用单例模式。

另没必要用一个DAOFactory ,因为它的意义上来说只是一个像Model Wrapper的对象。
thinviper 2005-04-21
  • 打赏
  • 举报
回复
DAO的主要目标:
1、隐藏持久层的物理细节。
2、抽象数据访问接口。
如果混合单例,注意多线程。最好是多实例,单线程。EJB,HIBERNATE都是这样的。
sjg008 2005-04-07
  • 打赏
  • 举报
回复
mark
vssivl 2005-04-06
  • 打赏
  • 举报
回复
帮顶
yuhui_jacky 2005-04-02
  • 打赏
  • 举报
回复
letsflytogether(恨!不能拥有天下所有的财富,然后平分)
我有一个疑问
就是在
是不是意味着就要进行多次实例化DAO
这样好么?
---------------------------------------------------------------------------
DAO层取出数据库连接
那就表明在该层也要负责关闭连接
举个例子:如果在business层的一个功能中如果需要10个DAO,那么是不是意味着这一次业务运算要进行10次数据库连接与关闭?对数据库的每一次连接开销是很大的,这样做好么?

偶目前business层的做法是:
connection=DBHelper.getConnection();
UserDAO userDAO=DAOFactory.getUserDAO(connection);
......
CustomerDAO customerDAO=DAOFactory.getCustomerDAO(connection);
......

请高手指点...
lmyabc 2005-02-22
  • 打赏
  • 举报
回复
mark
sclarkca810619 2005-02-17
  • 打赏
  • 举报
回复
这些知识是建立在广泛的基础知识上的,所以要多学习才能更好的领悟。
nitworm 2005-02-06
  • 打赏
  • 举报
回复
感谢各位讨论!
对于基本的crud操作是放在dao中;其他的业务弄个代理;但有个疑问?
比如;可以根据传入的不同参数来查询;如Order find(String name,String publish,String uid);
或删除void del(Sting name,String time)(删除某段时间)的对于这样的情况应该放到那里呢?我看处理都是Order find(OrderVO ),void del(OrderVO);
请大家帮我解答这个疑问!
javavc 2005-01-25
  • 打赏
  • 举报
回复
我再看dao模式例子得时候发现DAO对应一个DAOImp,这里我有个问题:

对于很多得表(项目中得表肯定不是一个),那么是不是每个表都要建立相应得DAO和DAOImp?


由于例子里面只有一个表,所以有点困惑得说.
kingxyz 2005-01-25
  • 打赏
  • 举报
回复
mark!
_chage 2005-01-25
  • 打赏
  • 举报
回复
DAO是细粒度的,只负责持久层存储,一般情形是一个DAO接口+实现类,这样是为了依赖于抽象而不依赖于具体,如果后面需要变更数据库,不会将这个变化扩散到业务层。具体的实现方式你要自己权衡。
babymon 2005-01-24
  • 打赏
  • 举报
回复
楼上的,没有问题;
楼主:业务逻辑当然不要放在DAO中,要不就失去了这种模式的意义。将业务逻辑放在中间件,称之为
代理(agent),是一些处理不同业务的servlet,然后通过agent调用DAO,得到的结果再由agent发送到前端
伍子V5 2005-01-24
  • 打赏
  • 举报
回复
我有一个疑问
就是在DAO层取出数据库连接
那就表明在该层也要负责关闭连接
那样的话如果在business层的一个功能中如果需要多个DAO
是不是意味着就要进行多次实例化DAO
这样好么?
_chage 2005-01-19
  • 打赏
  • 举报
回复
在struts和dao 间应该有个业务层,名字为bussiness 或 service之类的包,它来调度dao
加载更多回复(6)

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧