- 抛出异常的爱
- 等级:
- 性别:
- 文章: 13663
- 积分: 2762
- 来自: 北京
|
tczengjin 写道 抛出异常的爱 写道 管理方便 ,找文件不用debug 仅此而已吗?能稍微详细点吗?另外看过你在javaeye上的回帖,一般回的第一帖精简的很,如果不是我继续看你以后的回帖,恐怕偶目前还理解不了其中的深意 另外我这样dao每个方法打开session进行一次crud操作后关闭,那Session的缓存基本上利用不上了是不???
你又高看我了,
crud这里面cud三个是非常重复的劳动
由session.save(o)
就可以完成的东西不应该写在每个DAO中如果想要写也要写到公共的DAO中以减少代码重复
根据ID找实例的过程也被合谐了(就是sql:seclect XXX from x_table where id = ?)
所以dao里只要放一些非常不一般的查询语句,
并给这些查询方法定义一个好贴切好理解的名子就可以了.
或在注释中把这个东西用在某处的场景写好
到要改时不用从action -> service ->dao 这样找过去
只要简简单单的用全文搜索找到这样的注释
或新加dao 或 修改dao全看对这个方法的引用来决定了.
以上是工作方法中的方便之处.
可以提高工作效率300%左右
PS:看robbin以前的贴子,对查询的优化缓存,不以session开关为终点.好像是cache机制,不过我还没有感受过
tczengjin 写道 xuejianshan 写道 偶也正在学习之中,如果你在看看spring我想你会恍然大悟的。
但是当你学习这方面的东西时,头脑里必须有一个概念---面象接口编程。
具体它为什么这样分,当然会有它的道理,如果你还是不明白的话,那只能说你对它的思想还不够深入,我建议多读代码,和别人讨论一下。 我其实还是懂一点spring的,能够理解面向接口编程。如果说Dao接口可以不让降低我们对数据库访问接口的依赖,Service接口主要可以降低我们对于什么的依赖呢?如果大家略举一例,不胜感激!!!另外我目前写的程序与Hibernate耦合并没有关系,在这样的情况下,大家认为省去Dao是不是一个更好的选择,我一开始就不介意与Hibernate偶和,故均没有写Service接口和Dao接口,但写了Service 和 Dao的一个具体的实现(出于自己一想简化开发省了接口,又惯性使然写了这两个层),请问在这样的情况,大家能否给个建议,Service和Dao的取舍问题,谢谢!
对事务的范围的依赖.
如果你所有的业务都是简单的crud一个表,
那 么service就是摆设
但只要你的service包含多个表的操作
那么就要以service的每个方法作为事务的边界
让spring可以以这个为边界来自动补充事务.
再PS:这些在以前有过很详细的讨论. 还谈到了充血模型的问题.搜一下
|
返回顶楼 |
|
|
- skzr.org
- 等级:
- 性别:
- 文章: 459
- 积分: 150
- 来自: 长沙
|
个人感觉分清楚各个层还是很有必要的
目前公司的项目中:也和楼主的情形差不多,实际上每一层都只是对下层的方法的简单封装
也就是上面的Service.add(User)-->DAO.add(user) -包含-> Hibernate.save(User)
感觉很冗余,不过我也发现了,随着应用规模的扩展,在很多地方出现了重复的代码
对于分层封装来说如果前期没有规划好,会带来不必要的麻烦的
目前公司打算明年整合产品呢,底层开发尽然使用相同的接口来实现(公司的产品现在存在多个,但是他们底层所要操作的数据基本上都是一致的,目前出现了每个产品都需要实现一次它自己的底层操作,实际上那些操作在明年打算完全由一个组来提供一个接口来整合)
个人愚见:
1。根据规模,和将来来判断分层架构,至于方法的冗余实现,那是业务没有划分好导致的,未区分业务方法和持久化方法
2。至于说的数据库使用了ORM依然可以使用JDBC的,Hibernate还是提供了JDBC 原生SQL的阿,还有实在不行还可以获取Connection吖——这是jdbc的开始^-^ 有了Connection就可以做任何事情了
|
返回顶楼 |
|
|
- tczengjin
- 等级: 初级会员
- 文章: 63
- 积分: 40
- 来自: ...
|
[quote="qmy"]先谢谢tczengjin的回复 :)
我再想了想之前用JDBC时的DAO所做的工作,只是封装了SQL语句。
比如DAO有个insert(User)的方法,封装的是insert into t_user values(?,?,?.....)的操作,Service只要调用DAO的这个insert方法就好了。
可是Hibernate提供了save(user)这样的方法,已经封装了SQL语句,也就是说它已经实现了DAO的功能,没必要再写DAO了。如果为了解耦合,只有写一个Hibernate提供的这些api的抽象,然后如果想切换到JDBC,就另外写一个譬如JDBC的DAO实现。
还是我的菜菜的理解……望指点[/quote]
楼上其它人的回复也就是这个意思,另外抛出异常的爱的回复的确是经验之谈,结合以前看了点的spirngside关于EntityDao和HibernateEntityDao HibernateGenericDao这三个类的封装目的完全和抛出异常的爱说的一致,而在springside2 bookstore例子中省略了dao,service继承HibernateEntityDao<T>,如果需要复杂的查询的话,正如楼上所说,此时可以在写Dao继承HibernateEntityDao<T>封装查询操作,然后供service继承。在bookstore例子中没有Dao这一层,可见一般情况下可以省略Dao了。如果你需要使用其它orm解决方案可以可以继承springside 比如IbatisEntityDao<T> 它们均实现了EntityDao接口,这也正是接口的作用。这里把springside关于Hibernate的封装帖出来,供你参考吧,呵呵,今天算开窍了。
java 代码
- package org.springside.core.dao;
-
- import java.io.Serializable;
- import java.util.List;
-
- import org.hibernate.Criteria;
- import org.hibernate.criterion.Criterion;
- import org.springside.core.utils.GenericsUtils;
-
-
-
-
-
-
-
-
-
-
-
-
-
- @SuppressWarnings("unchecked")
- public class HibernateEntityDao<T> extends HibernateGenericDao implements EntityDao<T> {
-
- protected Class<T> entityClass;
-
-
-
-
- public HibernateEntityDao() {
- entityClass = GenericsUtils.getSuperClassGenricType(getClass());
- }
-
-
-
-
- protected Class<T> getEntityClass() {
- return entityClass;
- }
-
-
-
-
-
-
- public T get(Serializable id) {
- return get(getEntityClass(), id);
- }
-
-
-
-
-
-
- public List<T> getAll() {
- return getAll(getEntityClass());
- }
-
-
-
-
-
-
- public List<T> getAll(String orderBy, boolean isAsc) {
- return getAll(getEntityClass(), orderBy, isAsc);
- }
-
-
-
-
-
-
- public void removeById(Serializable id) {
- removeById(getEntityClass(), id);
- }
-
-
-
-
-
-
- public Criteria createCriteria(Criterion... criterions) {
- return createCriteria(getEntityClass(), criterions);
- }
-
-
-
-
-
-
- public Criteria createCriteria(String orderBy, boolean isAsc, Criterion... criterions) {
- return createCriteria(getEntityClass(), orderBy, isAsc, criterions);
- }
-
-
-
-
-
-
-
- public List<T> findBy(String propertyName, Object value) {
- return findBy(getEntityClass(), propertyName, value);
- }
-
-
-
-
-
-
-
- public List<T> findBy(String propertyName, Object value, String orderBy, boolean isAsc) {
- return findBy(getEntityClass(), propertyName, value, orderBy, isAsc);
- }
-
-
-
-
-
-
-
- public T findUniqueBy(String propertyName, Object value) {
- return findUniqueBy(getEntityClass(), propertyName, value);
- }
-
-
-
-
-
-
-
- public boolean isUnique(Object entity, String uniquePropertyNames) {
- return isUnique(getEntityClass(), entity, uniquePropertyNames);
- }
-
-
-
-
-
- public void evit(Object entity){
- getHibernateTemplate().evict(entity);
- }
- }
java 代码
- package org.springside.core.dao;
-
- import java.io.Serializable;
- import java.util.List;
-
-
-
-
-
-
- public interface EntityDao<T> {
-
- T get(Serializable id);
-
- List<T> getAll();
-
- void save(Object o);
-
- void remove(Object o);
-
- void removeById(Serializable id);
-
-
-
-
- String getIdName(Class clazz);
- }
java 代码
- package org.springside.core.dao;
-
- import java.io.Serializable;
- import java.lang.reflect.InvocationTargetException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
-
- import org.apache.commons.beanutils.PropertyUtils;
- import org.hibernate.Criteria;
- import org.hibernate.Query;
- import org.hibernate.criterion.CriteriaSpecification;
- import org.hibernate.criterion.Criterion;
- import org.hibernate.criterion.DetachedCriteria;
- import org.hibernate.criterion.Order;
- import org.hibernate.criterion.Projection;
- import org.hibernate.criterion.Projections;
- import org.hibernate.criterion.Restrictions;
- import org.hibernate.impl.CriteriaImpl;
- import org.hibernate.metadata.ClassMetadata;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import org.springframework.util.Assert;
- import org.springframework.util.ReflectionUtils;
- import org.springside.core.dao.support.Page;
- import org.springside.core.utils.BeanUtils;
-
-
-
-
-
-
-
-
-
-
-
- @SuppressWarnings("unchecked")
- public class HibernateGenericDao extends HibernateDaoSupport {
-
-
-
- public <T> T get(Class<T> entityClass, Serializable id) {
- return (T) getHibernateTemplate().load(entityClass, id);
- }
-
-
-
-
- public <T> List<T> getAll(Class<T> entityClass) {
- return getHibernateTemplate().loadAll(entityClass);
- }
-
-
-
-
- public <T> List<T> getAll(Class<T> entityClass, String orderBy, boolean isAsc) {
- Assert.hasText(orderBy);
- if (isAsc)
- return getHibernateTemplate().findByCriteria(
- DetachedCriteria.forClass(entityClass).addOrder(Order.asc(orderBy)));
- else
- return getHibernateTemplate().findByCriteria(
- DetachedCriteria.forClass(entityClass).addOrder(Order.desc(orderBy)));
- }
-
-
-
-
- public void save(Object o) {
- getHibernateTemplate().saveOrUpdate(o);
- }
-
-
-
-
- public void remove(Object o) {
- getHibernateTemplate().delete(o);
- }
-
-
-
-
- public <T> void removeById(Class<T> entityClass, Serializable id) {
- remove(get(entityClass, id));
- }
-
- public void flush() {
- getHibernateTemplate().flush();
- }
-
- public void clear() {
- getHibernateTemplate().clear();
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public Query createQuery(String hql, Object... values) {
- Assert.hasText(hql);
- Query query = getSession().createQuery(hql);
- for (int i = 0; i < values.length; i++) {
- query.setParameter(i, values[i]);
- }
- return query;
- }
-
-
-
-
-
-
- public <T> Criteria createCriteria(Class<T> entityClass, Criterion... criterions) {
- Criteria criteria = getSession().createCriteria(entityClass);
- for (Criterion c : criterions) {
- criteria.add(c);
- }
- return criteria;
- }
-
-
-
-
-
-
- public <T> Criteria createCriteria(Class<T> entityClass, String orderBy, boolean isAsc, Criterion... criterions) {
- Assert.hasText(orderBy);
-
- Criteria criteria = createCriteria(entityClass, criterions);
-
- if (isAsc)
- criteria.addOrder(Order.asc(orderBy));
- else
- criteria.addOrder(Order.desc(orderBy));
-
- return criteria;
- }
-
-
-
-
-
-
- public List find(String hql, Object... values) {
- Assert.hasText(hql);
- return getHibernateTemplate().find(hql, values);
- }
-
-
-
-
-
-
- public <T> List<T> findBy(Class<T> entityClass, String propertyName, Object value) {
- Assert.hasText(propertyName);
- return createCriteria(entityClass, Restrictions.eq(propertyName, value)).list();
- }
-
-
-
-
- public <T> List<T> findBy(Class<T> entityClass, String propertyName, Object value, String orderBy, boolean isAsc) {
- Assert.hasText(propertyName);
- Assert.hasText(orderBy);
- return createCriteria(entityClass, orderBy, isAsc, Restrictions.eq(propertyName, value)).list();
- }
-
-
-
-
-
-
- public <T> T findUniqueBy(Class<T> entityClass, String propertyName, Object value) {
- Assert.hasText(propertyName);
- return (T) createCriteria(entityClass, Restrictions.eq(propertyName, value)).uniqueResult();
- }
-
-
-
-
-
-
- public Page pagedQuery(String hql, int pageNo, int pageSize, Object... values) {
- Assert.hasText(hql);
- Assert.isTrue(pageNo >= 1, "pageNo should start from 1");
-
- String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
- List countlist = getHibernateTemplate().find(countQueryString, values);
- long totalCount = (Long) countlist.get(0);
-
- if (totalCount < 1)
- return new Page();
-
- int startIndex = Page.getStartOfPage(pageNo, pageSize);
- Query query = createQuery(hql, values);
- List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();
-
- return new Page(startIndex, totalCount, pageSize, list);
- }
-
-
-
-
-
-
-
- public Page pagedQuery(Criteria criteria, int pageNo, int pageSize) {
- Assert.notNull(criteria);
- Assert.isTrue(pageNo >= 1, "pageNo should start from 1");
- CriteriaImpl impl = (CriteriaImpl) criteria;
-
-
- Projection projection = impl.getProjection();
- List<CriteriaImpl.OrderEntry> orderEntries;
- try {
- orderEntries = (List) BeanUtils.forceGetProperty(impl, "orderEntries");
- BeanUtils.forceSetProperty(impl, "orderEntries", new ArrayList());
- } catch (Exception e) {
- throw new InternalError(" Runtime Exception impossibility throw ");
- }
-
-
- int totalCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
-
-
- criteria.setProjection(projection);
- if (projection == null) {
- criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
- }
-
- try {
- BeanUtils.forceSetProperty(impl, "orderEntries", orderEntries);
- } catch (Exception e) {
- throw new InternalError(" Runtime Exception impossibility throw ");
- }
-
-
- if (totalCount < 1)
- return new Page();
-
- int startIndex = Page.getStartOfPage(pageNo, pageSize);
- List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
- return new Page(startIndex, totalCount, pageSize, list);
- }
-
-
-
-
-
-
-
- public Page pagedQuery(Class entityClass, int pageNo, int pageSize, Criterion... criterions) {
- Criteria criteria = createCriteria(entityClass, criterions);
- return pagedQuery(criteria, pageNo, pageSize);
- }
-
-
-
-
-
-
-
- public Page pagedQuery(Class entityClass, int pageNo, int pageSize, String orderBy, boolean isAsc,
- Criterion... criterions) {
- Criteria criteria = createCriteria(entityClass, orderBy, isAsc, criterions);
- return pagedQuery(criteria, pageNo, pageSize);
- }
-
-
-
-
|
返回顶楼 |
|
|
- tczengjin
- 等级: 初级会员
- 文章: 63
- 积分: 40
- 来自: ...
|
没有Dao 一个BookService的实现,即简化开发,又降低了耦合,感觉在简化和降低耦合上所做的平衡做的实在很好。
java 代码
- package org.springside.bookstore.service.sysmgr;
-
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import org.apache.commons.lang.StringUtils;
- import org.hibernate.Criteria;
- import org.hibernate.criterion.Restrictions;
- import org.springside.bookstore.components.xfire.server.simple.BookService;
- import org.springside.bookstore.model.Book;
- import org.springside.bookstore.model.Category;
- import org.springside.bookstore.model.Product;
- import org.springside.core.dao.extend.HibernateEntityExtendDao;
- import org.springside.core.dao.support.Page;
- import org.springside.core.exception.BusinessException;
-
-
-
-
-
-
-
-
-
-
- @SuppressWarnings("unchecked")
- public class BookManager extends HibernateEntityExtendDao<book> implements BookService {
-
- @Override
- protected void onValid(Book entity) {
- if (!isUnique(entity, "name")) {
- throw new BusinessException("书名" + entity.getName() + "重复");
- }
- }
-
-
-
-
- public Page getNewBooks(Integer pageNo, Integer pageSize) {
这正是我所需要的。感谢大家的回复。
|
返回顶楼 |
|
|
- zhcl321
- 等级: 初级会员
- 性别:
- 文章: 2
- 积分: 30
- 来自: 西安
|
二楼说的很对,我认为:分层的目的就是为了解耦合,为了尽可能的使各个层次之间的耦合度降低,这样当我们的数据层或者业务层或者表示层发生了一些变化, 可以在最大限度的情况下减少其他层面的代码的变动,在我们使用hibernate的时候,hibernate负责为我们进行数据库的连接操作,而我们写DAO,也是在他的数据库操作的基础上再进行一次封装,这样当我们想更换数据库连接操作方式的时候,只需要改DAO及其以下的部分就可以了,而service层,从字面上翻译,就是服务,它是通过DAO给它的服务,给表示层的Action进行服务的,所有的业务操作应该都是写在service层上的,表示层只是需要调用service层给它提供的接口就行了,这样就好比我们使用手机一样,当我们给手机充电的时候,我们不需要对它的内部结构有多了解,只要我们能正确的使用它提供给我们的充电接口就对了,这就是各司其职吧,不管你内部结构怎么变化,只要你提供给我的是那个接口就不影响我的使用了。但是有些时候,根据项目的不同,耦合度的松紧是靠个人掌握的,并不一定是一定要严格做到松耦合,因为有些时候,想做到松耦合,的确很麻烦,会比紧耦合的情况下要多写很多代码,多考虑很多情况,有些时候这是不必要的。
以上仅是个人拙见,有什么不对的地方,请指点
|
返回顶楼 |
|
|
- pitt_xu
- 等级: 初级会员
- 性别:
- 文章: 9
- 积分: 30
- 来自: 上海
|
除非持久层决定永远用hibernate了
不然去除了dao 对于以后可能发生的修改会引起很大的开销 比如出现了更好的持久层框架需要更换
dao只是一套接口 用来消除service层和持久层的耦合 应该是这么回事~^_^
过于扁平耦合在一起的系统的路走不长
|
返回顶楼 |
|
|
- 抛出异常的爱
- 等级:
- 性别:
- 文章: 13663
- 积分: 2762
- 来自: 北京
|
pitt_xu 写道 除非持久层决定永远用hibernate了
不然去除了dao 对于以后可能发生的修改会引起很大的开销 比如出现了更好的持久层框架需要更换
dao只是一套接口 用来消除service层和持久层的耦合 应该是这么回事~^_^
过于扁平耦合在一起的系统的路走不长 我曾把hibernate的DAO从ejb中剥出来
用spring来代替.
|
返回顶楼 |
|
|
- ice123456
- 等级: 初级会员
- 性别:
- 文章: 181
- 积分: 80
- 来自: 武汉
|
我也是一个初学者。
我做个一个小项目分层:
1,servlet 专放servlet
2, entity 实体包
3 dao 数据库操作
4 util 帮助
我也是一样用的hibernate,但是我脱离了hibernate,是一样的`我只需要去修改dao里面的类。servlet里面基本上是一些输出xml的地方(用的AJAX)
|
返回顶楼 |
|
|
- zbird
- 等级:
- 性别:
- 文章: 620
- 积分: 333
- 来自: 杭州
|
就个人而言,我不喜欢DAO。 DAO不是万能药,解耦并不是加个DAO就能解决的问题。 对于大多的简单操作,Hibernate封得已经够完善了,大多时候加个DAO费力不讨好。 如果操作复杂,Service层过于混乱,这时候再抽取出个DAO也没什么不可以。 说到使用DAO解耦,大家最喜欢举的例子就是换实现。以前是说换数据库,现在Hiberate对数据库封得差不多了。于是说法改成将hibernate换成其他的实现,如jdbc等。 但真实项目中有谁有事没事的去换这些东西。 耦是有了才需要解的,如果凭空想出很多不实在的需求,无非是给自己自找麻烦。
|
返回顶楼 |
|
|
- 抛出异常的爱
- 等级:
- 性别:
- 文章: 13663
- 积分: 2762
- 来自: 北京
|
zbird 写道 就个人而言,我不喜欢DAO。 DAO不是万能药,解耦并不是加个DAO就能解决的问题。 对于大多的简单操作,Hibernate封得已经够完善了,大多时候加个DAO费力不讨好。 如果操作复杂,Service层过于混乱,这时候再抽取出个DAO也没什么不可以。 说到使用DAO解耦,大家最喜欢举的例子就是换实现。以前是说换数据库,现在Hiberate对数据库封得差不多了。于是说法改成将hibernate换成其他的实现,如jdbc等。 但真实项目中有谁有事没事的去换这些东西。 耦是有了才需要解的,如果凭空想出很多不实在的需求,无非是给自己自找麻烦。 我一直在说.... 不是为了移植 而是为了管理方便 当然你可以把业务逻辑 与数据库逻辑写在一起 当只有一二个表时 并没什么不好解理 当一个操作关系到: 日志表, 权限表, 业务级联表, 操作记录表, 用人类的智力要从这么多的代码中找到逻辑.....还是差点意思
|
返回顶楼 |
|
|