ssh架构困惑,高手解答

码农小小鸟 2010-09-10 10:59:10
为什么每个pojo都要对应一个DAO,如user.java--->userDao.java,org.java-->orgDao.java 我觉得直接用一个DAO就已经能够操作所有的pojo类了如:user.java,org.java。。。。。---->DAO.java,我觉得这样很简单,持久层变得很容易维护,也很容易更换。
这样做的好处是什么,怎样样体现出来,不要告诉我一些空话,提高系统灵活性,搞高可维护性,。。。。我要的是你说搞高了灵活性,那么是怎样搞高的,为什么能提高,不要空话。
...全文
222 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lp19890601 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dengzhangsong 的回复:]
注明一点,在这个问题中采用的持久化框架是hibernate
[/Quote]

就是hibernate这样设计的

这样是维护,和修改都很方便

并且互不影响


估计楼主没有做过二次开发或者,去修改别人的代码.......
码农小小鸟 2010-09-10
  • 打赏
  • 举报
回复
注明一点,在这个问题中采用的持久化框架是hibernate
licip 2010-09-10
  • 打赏
  • 举报
回复
其实,你不想要别人告诉你的空话就是原因。只有系统大了,要做这方面的工作了,你才会体味到的。
码农小小鸟 2010-09-10
  • 打赏
  • 举报
回复
我的意思是我的DAO层只用这样简单一个接口,一个实现类来实现如下:
public interface IDAOBase<T> {
/**
* 刷出并清空Session
*/
public void flushAndClearSession();

/**
* 保存实体
*/
public void save(T o) throws SQLException;

/**
* 更新实体
*/
public void update(T o) throws SQLException;

/**
* 更新或者保存实体
*/
public void saveorupdate(T o) throws SQLException;

/**
* 根据ID删除实体
*/

public void delete(String obj, String string) throws SQLException;

/**
* 根据ID查找实体
*/
public T findById(Class clazz, Serializable id) throws SQLException;

/**
* 根据条件查找所有实体且分页
*/
public List<T> findByCriteria(Class clazz, int currentpage, int rows, String s)
throws SQLException;

/**
* 根据字符串查找实体
*/
public List<T> findTo(String obj) throws SQLException;

/**
* 根据字符串查找实体且分页
*/
public List<T> findTopage(String obj, int currentpage, int rows)
throws SQLException;

/**
* 前台根据字符串查找实体且分页
*/
public List<T> findToweb(String obj, int currentpage, int rows)
throws SQLException;

/**
* 刷新缓存
*/
public void flush() throws SQLException;

/**
* 清除缓存
*/
public void clear() throws SQLException;

/**
* 得到所有数据
*/
public int getAllCount() throws SQLException;

/**
* 执行hql语句
*/
public void exesql(String sql) throws SQLException;

}
public class DAOImplBase<T> implements IDAOBase<T> {

.
.
.}
在service层我可以这样

pbulic Class userService{
DAOBase service通过spring注入以后,我就可以操作了
}
我的意思就是有没有必要在在定义一层UserDAO出来这样使用
pbulic Class userService{
UserDao userdao
}
因为在我看到的不管大大小小的项目中都这样使用,我老是觉得这样多太麻烦了,增加了很多类和接口,像我上面的做法不是很简单吗,而且符合开闭原则啊,
lp19890601 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dengzhangsong 的回复:]
如果对于事务的控制我交由spring管理,我没必要去涉足啊
如果方便service层调用,我直接一个公用的dao注入到service里面去,这样不是更方便吗?我没必要每一个类都得注入一个对应的dao啊
[/Quote]

這樣的話,你的一個公用的dao,會有很多的方法內容,增加該類的代碼量 ,加載這個類的時候耗時更長

[Quote=引用樓主 dengzhangsong 的回复:]
这样做的好处是什么,怎样样体现出来,不要告诉我一些空话,提高系统灵活性,搞高可维护性,。。。。我要的是你说搞高了灵活性,那么是怎样搞高的,为什么能提高[/Quote]

每一個實體類,對應一個dao,每一個dao又對應每一個service

這樣一對一的關係很清晰,並且,每個業務層的業務不同,這就要求dao裏面實現的方法不同。

而每個dao有針對於一個實體類,對其專門的管理,如果你把所有的業務方法都放到一個dao裏面

維護起來那麼多代碼,不方便找。更不方便後來人員的對其維護,

這樣的框架,把bean ---dao----service----action分層聯繫起來

線路清晰,按照這個規則--------無論是你,或者是後序人員更改和修改程序都有據可循

另外,如果只有一個dao,每次維護都有更改該類,不方便版本控制

一般都是一個人負責一個模塊,把這些分開,分層,無論你維護那一個業務層,都不會影響到其他的業務方法

按照你的想法,把所以的業務方法都放在一個dao裏面,試問,維護其中某一個也為方法,勢必影響其他業務方法
他們在同一個dao裏面。

把業務方法,分層,分開,就是為了,方便後期維護,

希望你能明白。
hattie019425 2010-09-10
  • 打赏
  • 举报
回复
按照你的想法所有的Service都可以做成一个Service.java注射到Action里;所有的Action也可以做成一个Action.java。。。。。。。。。。
这样会方便么???功能再拓展怎么办???
OOAD中的一个目标就是要把类的职能单一化。类的职能单一后,才能真正达到对拓展开放,对修改关闭。

不知道这样说你能明白不。
weiguoxin 2010-09-10
  • 打赏
  • 举报
回复
Dao主要是定义一个接口,然后有不同的实现类操作不同的数据库,比如 UserImplByMySql,UserImplBySQL
,这样只要在Service里定义一个Dao就可以了,如果要更改数据库的话,在beans里更改Dao的实现类就可以了.
如果不跨库的话没必要定义接口,直接实现就行.

不知道我解释清楚没.
码农小小鸟 2010-09-10
  • 打赏
  • 举报
回复
如果对于事务的控制我交由spring管理,我没必要去涉足啊
如果方便service层调用,我直接一个公用的dao注入到service里面去,这样不是更方便吗?我没必要每一个类都得注入一个对应的dao啊
tracyXiaoAi 2010-09-10
  • 打赏
  • 举报
回复
每一个POJO所需的持久性功能并不是完全相同的,但是可以把公用部分(如基本的CUDE)抽出来。
一个POJO对应一个DAO,这样做也方便开发人员查看代码呀。
madFatso 2010-09-10
  • 打赏
  • 举报
回复
并非每一个POJO都得对应一个DAO

你完全可以按照功能拆分对应DAO

这样写只是方便Service层引用 事务提交
angelcaoxian 2010-09-10
  • 打赏
  • 举报
回复
并没有硬性规定一个po对应一个dao,只是在程序设计上,为了清晰。易于管理,把一个po对应于相应的dao.
同时你也可以把一些公共的方法都放到一个DAO中,让其他子类的dao都继承这个父类。这样可以简化开发
soseasky 2010-09-10
  • 打赏
  • 举报
回复
dao 是专门用来 和数据库打交道 ,他只负责数据库采取CRUD操作 只是单纯的数据库操作,不对结果数据进行 逻辑处理 ,逻辑处理部分交给 service来处理 这样代码 就会很清晰,也方便维护 也符合OOP 和mvc 。如果是小规模应用 根本没有必要 分什么 DAO 等等 直接JSP+javabean+servlet也OK
SDY-小五 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dengzhangsong 的回复:]
我的意思是我的DAO层只用这样简单一个接口,一个实现类来实现如下:
public interface IDAOBase<T> {
/**
* 刷出并清空Session
*/
public void flushAndClearSession();

/**
* 保存实体
*/
public void save(T o) throws SQLException;

/**
*……
[/Quote]




怎么就不懂嫩,就那么简单的事10楼说的很详细了

你记住,你用一个共同的IDao 接口,用Spring 去注入是很方便。

但是如果你以后的项目有变动,需要修改。或者你的项目别人要去修改,

你用个IDAO 去注入,Spring能找到,但是别人能那么快的速度找到么?

看来看去就晕了,主要就是一个那种分成方式很清晰。别人修改你的代码,直接就可以了解跟踪

你的逻辑。



hattie019425 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 liujun5515008 的回复:]
如果按照楼主的意思,在项目中只需要一个Dao和一个service,如果这个项目很大的话,估计你这个类的容量是相当客观的,光编译一次估计都要花费很长时间,更不说提高性能了。
[/Quote]
不太赞同你的观点。这是设计和性能没关系。编译时间的确是增加了,但是运行时性能不一定差。
如果都写到一个类里面性能还可能提高呢,至少层次少了完成同一个功能调用的方法少了。
OOAD不是为了解决性能问题的,相反有时还会影响性能。比如J2ME开发时,就要尽量少用OOAD。
vblueskyq1 2010-09-10
  • 打赏
  • 举报
回复
是为了方便维护,扩展,公用1个DAO,很可能造成改一处而动全身。
liujun5515008 2010-09-10
  • 打赏
  • 举报
回复
如果按照楼主的意思,在项目中只需要一个Dao和一个service,如果这个项目很大的话,估计你这个类的容量是相当客观的,光编译一次估计都要花费很长时间,更不说提高性能了。
冰山6 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lihailing1987 的回复:]
lz 要单枪匹马完成这个系统的开发和维护的话要怎做都可以。
[/Quote]
up
lihailing1987 2010-09-10
  • 打赏
  • 举报
回复
lz 要单枪匹马完成这个系统的开发和维护的话要怎做都可以。
hattie019425 2010-09-10
  • 打赏
  • 举报
回复
为什么要有Dao层呢
Data Access Object
就是要完全屏蔽数据库的底层操作,上层Service根本不用关心数据库的类型及表结构(甚至于底层到底是不是一个真正的数据库,比如只是一个简单的配置文件)。
hattie019425 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dengzhangsong 的回复:]
我的意思是我的DAO层只用这样简单一个接口,一个实现类来实现如下:
public interface IDAOBase<T> {
/**
* 刷出并清空Session
*/
public void flushAndClearSession();

/**
* 保存实体
*/
public void save(T o) throws SQLException;

/**
*……
[/Quote]
你这个类是持久化层的工具类。是供每个Dao来使用的,而不是直接让Service来使用。
你总不能在逻辑控制层去写hql语句吧,大哥。
加载更多回复(2)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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