看到很多资料在使用spring框架后,为每个表对应的POJO写一个DAO接口,再写一个实现类,每个接口里都是简单的CRUD操作,感觉实在很麻烦
以前的项目里直接用struts+hibernate,有一个DbOperate类,来历不知,但它的CRUD方法可以对所有类操作,这样不是更简单?各位瞧瞧
- Java code
public class DbOperate { public boolean save(Object obj) throws HibernateException { boolean result = false; Session session = SessionFactory.currentSession(); if (obj != null) { Transaction tx = null; try { tx = session.beginTransaction(); session.save(obj); tx.commit(); result = true; } catch (HibernateException e) { if (tx != null) { tx.rollback(); result = false; } } finally { session.close(); return result; } } return result; } public void update(Object obj) throws HibernateException { Session session = SessionFactory.currentSession(); if (obj != null) { Transaction tx = null; try { tx = session.beginTransaction(); ////System.out.println("aaaa"); session.update(obj); ////System.out.println("bbbb"); tx.commit(); ////System.out.println("cccc"); } catch (HibernateException e) { if (tx != null) tx.rollback(); throw e; } } session.close(); } public void delete(Object obj) throws HibernateException { Session session = SessionFactory.currentSession(); if (obj != null) { Transaction tx = null; try { tx = session.beginTransaction(); session.delete(obj); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); throw e; } } session.close(); } public void saveOrUpdate(Object obj) throws HibernateException { Session session = SessionFactory.currentSession(); if (obj != null) { Transaction tx = null; try { tx = session.beginTransaction(); session.saveOrUpdate(obj); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); throw e; } } session.close(); } public List find(String sql) throws HibernateException { Session session = SessionFactory.currentSession(); List list = null; Transaction tx = null; try { tx = session.beginTransaction(); Query query = session.createQuery(sql); list = query.list(); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); throw e; } session.close(); return list; }}
------解决方案--------------------
实际方面:
面向接口编程,很多时候,接口是架构那边的人给你写好的,你过来搞的dao就是实现接口,然后实现功能,算是个具体工作套路;
理论方面:
接口可以作为模板,现在的编程已经不是面对对象了,是面对组件和更高层次的面对服务,EJB的组件与web services都是暴露接口给人调用,难道你给人暴露实现类...不让人给你反编译给改掉才怪;再有现在某些SOA框架都是集成所有的协议来传输的,协议最多也就能将接口XML化,实现类几乎不可能,协议XML化也不可能带上业务逻辑,而且协议本身就是忽视具体语言的,这是大的方面上讲;
------解决方案--------------------
哈哈,你们都错了,要根据实际业务来地,不要那么死板,如果业务简单,当然用楼主说的没问题,但是业务复杂的话,随着project的规模膨胀 单DAO或单SERVICE都会极度膨胀,况且service层是不允许有sql代码的,一个DAO根本满足不了需求,而且面向对象的话,一个service就应该调用多个dao才合理,也极易扩展
------解决方案--------------------
个人更支持写一个通用DAO,无非是POJO返回或参数类型不同,DAO层对象用Object基类,在具体service强制转化即可,没必要给每一个表写一堆差不多重复的CURD DAO,这么多DAO看着就累,至于事务spring既然提供了强大的按接口编程模式以及结合AOP,只要配置在service层的通用interface即可,也没必要给每个service具体实现类配置一份,另外如果有人用spring-modules缓存的话也建议只要在interface层面设置缓存策略