- 浏览: 329049 次
- 性别:
- 来自: 西宁
-
文章分类
- 全部博客 (120)
- Java Thought (29)
- Java Pattern (4)
- Data Base (7)
- Algorithm Design (33)
- Linux (0)
- Mysql (2)
- Oracle (0)
- ConstructionDesign-架构 (5)
- Spring Platform (0)
- Tomcat (1)
- JavaScript (7)
- Web System (3)
- MS SQLServer (1)
- 软件哲学 (6)
- View (3)
- Java GUI (4)
- CSSDIV (7)
- CloudComputing (0)
- WebService (0)
- SystemOrProject (2)
- SOA (0)
- 互转共享 (3)
- 偶尔java习题 (0)
- Thinks with does (1)
最新评论
-
sassds:
佩服啊 高手
分享一款js特效 -
bhjackson:
学习啦,能否详细介绍下回溯的过程?O(∩_∩)O谢谢
分享回溯法- 找n个数中r个数的组合 -
zk7019311:
了解了解。。。。。
业务层代码复用的一点建议 -
lijie1819:
看到LZ的设计思想,感觉和抽象工厂模式有点相像。
业务层代码复用的一点建议 -
wjjcml1982:
酷毙了!楼主太强悍了!
分享一款js特效
传统的编写业务层的service类是为每个实体对象生成一个DAO,然后再每个实体DAO对应的service类中注入DAO属性作为服务层组件。这样做代码的可读性很好,层次分明,逻辑清晰。是一种较好的设计方式。
如果考虑到代码软件最本质的特征-复用。减少不必要的编写。我们可以充分考虑Java语言的特征,诸如反射、多态、继承,以达到最大程度的重构。
由此,我们在编写DAO层代码时,可设计一个BaseDAO类,抽象出最顶层的公有行为。
在业务层,编写服务组件时,也可以抽象出一个BaseService类,集合公有行为。
其他业务层服务组件,可以
当然,配置文件需配置bean的父子关系.
这当然只是一种很简单的方法,你也可以从中抽象和重构出更简单更短小的设计。
利用泛型可以实现,更加通用的接口或类。
不过却产生了N多的DAO
我一般模块内表不多时,只有一个DAO就可以了
如果模块内表数量膨胀到5个以上,才会考虑是不是要使用多个dao!
楼主的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐
风宋骨发扬得入木三分,能在有生之年看见楼主的这张帖子,实在是我三生之幸
啊。
看完楼主的这张帖子之后,我竟感生出一种无以名之的悲痛感?啊,这么好的
帖子,如果将来我再也看不到了,那我该怎么办?那我改怎么办?直到我毫不犹豫
的把搂主的这张帖子收-藏-了,我内心的那种激动才逐渐平复下来。可是我立刻想
到,这么好的帖子,倘若别人看不到,那不是浪费楼主的心血吗?
经过痛苦的思想
斗争,我终于下定决心,我要把这张帖子一直往上顶,往上顶!顶到所有人都看到
为止!
不好意思·这不是百度贴吧,呵呵
恩 不错的
当然可以了
如果考虑到代码软件最本质的特征-复用。减少不必要的编写。我们可以充分考虑Java语言的特征,诸如反射、多态、继承,以达到最大程度的重构。
由此,我们在编写DAO层代码时,可设计一个BaseDAO类,抽象出最顶层的公有行为。
public void save(Object entityObj); public void update(Object entityObj); public Object findById(Class cls, Integer id); public List<Object> findByProperty(String hql, Object property); public List<Object> findByHql(String hql, Object[] values); public List<Object> findBySql(String sql, Object property); public List<Object> findBySql(String sql, Object[] values);
在业务层,编写服务组件时,也可以抽象出一个BaseService类,集合公有行为。
public class BaseService { private BaseDAO baseDAO; // setter method // 共有方法 }
其他业务层服务组件,可以
extends BaseService达到公有复用。
当然,配置文件需配置bean的父子关系.
<bean id="" class="" parent="BaseService"></bean>
这当然只是一种很简单的方法,你也可以从中抽象和重构出更简单更短小的设计。
评论
29 楼
Ashfrog
2010-08-19
一个service应该可以调用多个dao方法···
28 楼
czxiyj
2010-08-19
这个是基本的复用,没什么特别的东西。
不过还是钦佩楼主的总结。
不过还是钦佩楼主的总结。
27 楼
skzr.org
2010-08-14
如果按照下图设计了,Service绑定了类型,只能对此E CRUD操作,在Service层原则上只承担业务逻辑
如果这样设计了,那么开-闭原则怎样实施,里势代换也失去了意义
如果这样设计了,那么开-闭原则怎样实施,里势代换也失去了意义
melin 写道
abstract public class BaseServiceImpl<E, PK extends Serializable> implements BaseService<E, PK> { //~ Instance fields ================================================================================================ public Logger logger = LoggerFactory.getLogger(this.getClass()); //~ Constructors =================================================================================================== //~ Methods ======================================================================================================== abstract public GenericDao<E, PK> getGenericDao(); /** * 按照实体类型和实体唯一标识查询实体。 * @param id * @return */ @Transactional(readOnly=true) public E findEntity(PK id) { return this.getGenericDao().find(id); } /** * 根据属性名称与值,查询出所有满足条件的持久化实体 * * @param propertyName 属性名称 * @param value 属性值 * @return 所有持久化实体的集合 */ @Transactional(readOnly=true) public List<E> findByProperty(String propertyName, Object value) { return this.getGenericDao().findByProperty(propertyName, value); } /** * 按照泛型的实体类型,分页查询得到所有持久化实体。 * @return 所有持久化实体的集合 */ @Transactional(readOnly=true) public Page<E> findAllForPage(PageRequest<E> pageRequest) { return this.getGenericDao().findAllForPage(pageRequest); } /** * 持久化一个实体,同时保存creator和createTime信息 * * @param entity 处于临时状态的实体。 */ @Transactional public void insertEntity(E entity) { if(ClassUtils.isAssignable(BaseEntity.class, entity.getClass())) { String creator = SecurityContextUtil.getLoginUserId(); BaseEntity baseEntity = (BaseEntity)entity; baseEntity.setCreator(creator); baseEntity.setCreateTime(new Date()); } this.getGenericDao().create(entity); } /** * 更新处于游离状态的实体,更新后实体对象仍然处于游离状态。 * updator 和 updateTime也做相应更新 * * @param entity 处于游离状态的实体。 */ @Transactional public void updateEntity(E entity) { if(ClassUtils.isAssignable(BaseEntity.class, entity.getClass())) { String updator = SecurityContextUtil.getLoginUserId(); BaseEntity baseEntity = (BaseEntity)entity; baseEntity.setUpdator(updator); baseEntity.setUpdateTime(new Date()); } this.getGenericDao().merge(entity); } /** * 根据实体唯一标识,删除这条记录 * * @param entity 处于持久化状态的实体。 */ @Transactional public void deleteEntity(PK id) { E entity = this.getGenericDao().find(id); if (entity != null) { this.getGenericDao().delete(entity); } else { logger.info("delete PK={}, but not exist", id); } }
26 楼
melin
2010-08-13
abstract public class BaseServiceImpl<E, PK extends Serializable> implements BaseService<E, PK> { //~ Instance fields ================================================================================================ public Logger logger = LoggerFactory.getLogger(this.getClass()); //~ Constructors =================================================================================================== //~ Methods ======================================================================================================== abstract public GenericDao<E, PK> getGenericDao(); /** * 按照实体类型和实体唯一标识查询实体。 * @param id * @return */ @Transactional(readOnly=true) public E findEntity(PK id) { return this.getGenericDao().find(id); } /** * 根据属性名称与值,查询出所有满足条件的持久化实体 * * @param propertyName 属性名称 * @param value 属性值 * @return 所有持久化实体的集合 */ @Transactional(readOnly=true) public List<E> findByProperty(String propertyName, Object value) { return this.getGenericDao().findByProperty(propertyName, value); } /** * 按照泛型的实体类型,分页查询得到所有持久化实体。 * @return 所有持久化实体的集合 */ @Transactional(readOnly=true) public Page<E> findAllForPage(PageRequest<E> pageRequest) { return this.getGenericDao().findAllForPage(pageRequest); } /** * 持久化一个实体,同时保存creator和createTime信息 * * @param entity 处于临时状态的实体。 */ @Transactional public void insertEntity(E entity) { if(ClassUtils.isAssignable(BaseEntity.class, entity.getClass())) { String creator = SecurityContextUtil.getLoginUserId(); BaseEntity baseEntity = (BaseEntity)entity; baseEntity.setCreator(creator); baseEntity.setCreateTime(new Date()); } this.getGenericDao().create(entity); } /** * 更新处于游离状态的实体,更新后实体对象仍然处于游离状态。 * updator 和 updateTime也做相应更新 * * @param entity 处于游离状态的实体。 */ @Transactional public void updateEntity(E entity) { if(ClassUtils.isAssignable(BaseEntity.class, entity.getClass())) { String updator = SecurityContextUtil.getLoginUserId(); BaseEntity baseEntity = (BaseEntity)entity; baseEntity.setUpdator(updator); baseEntity.setUpdateTime(new Date()); } this.getGenericDao().merge(entity); } /** * 根据实体唯一标识,删除这条记录 * * @param entity 处于持久化状态的实体。 */ @Transactional public void deleteEntity(PK id) { E entity = this.getGenericDao().find(id); if (entity != null) { this.getGenericDao().delete(entity); } else { logger.info("delete PK={}, but not exist", id); } }
25 楼
adminfxing
2010-08-13
public interface GenericDao<T, PK extends Serializable> { final Logger logger = Logger.getLogger(GenericDao.class); /** * 查找单独信息 * * @param id * 主键 * @return */ public T loadById(PK id); /** * 查找所有信息 * * @return 所有信息 */ public List<T> loadAll(); /** * 保存 * * @param entity * 实体 * @return */ public T save(T entity); /** * 更新 * * @param entity * 实体 */ public void update(T entity); /** * 删除 * * @param entity * 实体 */ public void delete(T entity); }
利用泛型可以实现,更加通用的接口或类。
24 楼
kyfxbl
2010-08-12
我有个比喻:
如果设计模式那个博客是VS黑1的话,楼主这个帖子可以去QQ对战平台
如果设计模式那个博客是VS黑1的话,楼主这个帖子可以去QQ对战平台
23 楼
fxsc
2010-08-09
猫扑精华帖的水平
22 楼
jianfeihit
2010-08-02
我觉得这种抽象与封装是与一定的业务逻辑相关联的,有点领域建模的意思。
本来抽象的越往上,就越是共性的东西,个性化的东西就越少。
加入具体的DAO中有的需要返回列表,有的需要返回单个对象,查询的条件也很不一样,这样岂不是方法又会很多(当然可以使用HashMap作为参数减少一些签名的不同)。
本来抽象的越往上,就越是共性的东西,个性化的东西就越少。
加入具体的DAO中有的需要返回列表,有的需要返回单个对象,查询的条件也很不一样,这样岂不是方法又会很多(当然可以使用HashMap作为参数减少一些签名的不同)。
21 楼
mib168
2010-08-02
觉得其实大多数DAO的方法BASE中都能够包括了,可以在特定的模块在加一层针对自己的DAO其他的直接就用BASE应该就可以了。
20 楼
xiaobao0501
2010-07-30
dao层还是根据表来建吧.具体如何组合是service层的事.

19 楼
skzr.org
2010-07-30
gstarwd 写道
xiaobao0501 写道
基础表dao都类似这样
一行代码都不用写...

public class SuserHibernateDao extends GenericHibernateDao<Suser,java.lang.Integer> implements ISuserDao { }
一行代码都不用写...

不过却产生了N多的DAO
我一般模块内表不多时,只有一个DAO就可以了
如果模块内表数量膨胀到5个以上,才会考虑是不是要使用多个dao!
18 楼
gstarwd
2010-07-30
xiaobao0501 写道
基础表dao都类似这样
一行代码都不用写...

public class SuserHibernateDao extends GenericHibernateDao<Suser,java.lang.Integer> implements ISuserDao { }
一行代码都不用写...

17 楼
xiaobao0501
2010-07-29
基础表dao都类似这样
一行代码都不用写...

public class SuserHibernateDao extends GenericHibernateDao<Suser,java.lang.Integer> implements ISuserDao { }
一行代码都不用写...
16 楼
J-catTeam
2010-07-29
冬天冷穿马甲 写道
maozj 写道
从重构的角度来说 代码量越少越好 从可读性来讲是层次分明 清晰越好 权权平衡 两者都是可取的 我认为
楼主的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐
风宋骨发扬得入木三分,能在有生之年看见楼主的这张帖子,实在是我三生之幸
啊。
看完楼主的这张帖子之后,我竟感生出一种无以名之的悲痛感?啊,这么好的
帖子,如果将来我再也看不到了,那我该怎么办?那我改怎么办?直到我毫不犹豫
的把搂主的这张帖子收-藏-了,我内心的那种激动才逐渐平复下来。可是我立刻想
到,这么好的帖子,倘若别人看不到,那不是浪费楼主的心血吗?
经过痛苦的思想
斗争,我终于下定决心,我要把这张帖子一直往上顶,往上顶!顶到所有人都看到
为止!
不好意思·这不是百度贴吧,呵呵
15 楼
maozj
2010-07-29
从重构的角度来说 代码量越少越好 从可读性来讲是层次分明 清晰越好 权权平衡 两者都是可取的 我认为
14 楼
maozj
2010-07-29
skzr.org 写道
我自己就是这样做的,本着dao只做存储的思想
一个service对应N个dao
实现:
一个service对应N个dao
public interface IBaseDao { void saveOrUpdate(Object entity); @SuppressWarnings("unchecked") void saveOrUpdateAll(Collection entities); void delete(Object entity); <T> List<T> loadAll(Class<T> entityClass); <T> T get(Class<T> entityClass, Serializable id); }
实现:
public class BaseDaoHibernateImpl extends HibernateDaoSupport implements IBaseDao { @Autowired public final void setupSessionFactory(SessionFactory sessionFactory) { setSessionFactory(sessionFactory); } @Override public void saveOrUpdate(Object entity) { getHibernateTemplate().saveOrUpdate(entity); } @Override @SuppressWarnings("unchecked") public void saveOrUpdateAll(Collection entities) { getHibernateTemplate().saveOrUpdateAll(entities); } @Override public void delete(Object entity) { getHibernateTemplate().delete(entity); } @Override public <T> List<T> loadAll(Class<T> entityClass) { return getHibernateTemplate().loadAll(entityClass); } @Override public <T> T get(Class<T> entityClass, Serializable id) { return getHibernateTemplate().get(entityClass, id); } }
恩 不错的
13 楼
maozj
2010-07-29
mercyblitz 写道
把接口IBaseDao设计成泛型不是更好吗?
当然可以了
12 楼
mercyblitz
2010-07-29
把接口IBaseDao设计成泛型不是更好吗?
11 楼
kaowww153
2010-07-29
楼主,我服了你了,你的方法命名居然和我们公司的一样
Pager<T> findBySQL(final int pageNo, final int pageSize, final String sqlString, final Object... values); Pager<T> findByHQL(final String hql, final Object... values);
10 楼
KimShen
2010-07-29
理想总是美好的.
当你发现这个Dao需要分页,这个Dao需要转换成Dto,这个Dao的查询需要equals,like,le,lt等等.
有50%的Dao需要上述功能,50%的Dao不需要,那你到底是在不在BaseDao实现这些方法还是抽象还是让子类实现.当业务逻辑越来越复杂以后你就发现突然间Dao被无限扩大不可控了.所以我个人认为还是把公有类写成Utils的形式而不是继承
当你发现这个Dao需要分页,这个Dao需要转换成Dto,这个Dao的查询需要equals,like,le,lt等等.
有50%的Dao需要上述功能,50%的Dao不需要,那你到底是在不在BaseDao实现这些方法还是抽象还是让子类实现.当业务逻辑越来越复杂以后你就发现突然间Dao被无限扩大不可控了.所以我个人认为还是把公有类写成Utils的形式而不是继承
相关推荐
总的来说,"CreateCodeC#三层结构代码生成软件V1.0.1"是一个旨在帮助C#开发者快速构建三层架构应用的工具,利用反射和泛型技术自动创建代码,但其当前版本可能存在一些问题,推荐使用更新的版本。理解和掌握这些知识...
8. **测试和调试**:提供一些关于如何测试和调试三层架构应用的建议。 《文档声明.txt》可能包含关于该PDF文档的版权信息、作者声明或使用条款,但具体内容需要打开文件查看。 总的来说,ASP.NET 2.0三层架构是一...
2. **Spring MVC**:作为Spring框架的一部分,Spring MVC负责处理HTTP请求,提供模型-视图-控制器(MVC)的架构模式,使得业务逻辑、数据和视图层分离,提高了代码的可维护性和可测试性。 3. **MyBatis**:JeeSite...
此外,VB也支持模块化编程,可以创建标准模块或窗体模块来封装功能,提高代码复用性。比如,你可以创建一个通用的数据库连接模块,供多个系统调用,实现数据访问的统一。 VB的小系统通常包括以下几个部分:用户界面...
代码结构方面,阿里java编码规范提出了很多原则性的建议,比如避免过深的继承层次、使用接口和抽象类来提高代码的复用性、确保每个类和方法的职责单一等。这些原则有助于提高代码的可测试性和可维护性。 在异常处理...
- 通过继承和多态提高代码的复用性。 #### 四、调试技巧 调试是软件开发过程中不可或缺的一部分,正确的调试方法可以大大提升开发效率。文档中提到的一些调试技巧包括: ##### 4.1 编译时的错误 在编译阶段发现...
1. **妙用宝宝起名大全**:建议开发者使用一些看似随意的名字,如“Fred”或“adsf”。这类名字简单易记,但缺乏意义,使得其他开发者难以理解其用途。 2. **单字母变量名**:使用单字母变量名(如`a`、`b`、`c`等)...
5. **utils** 文件夹:可能包含一些通用的工具函数,如网络请求、数据处理、日期格式化等,方便在多个页面之间复用。 6. **images** 或 **assets** 文件夹:存储图片资源,这些图片会被引用到小程序的各个页面中。 ...
1. **分层架构**:Spring鼓励采用分层架构,将应用程序划分为不同的层次,如表现层、业务层、数据访问层等。每一层都有其特定的责任,有助于保持代码的清晰和模块化。 2. **非侵入式设计**:Spring的组件设计遵循非...
以上只是一些基本的J2EE代码编写规范要点,实际的规范文档会包含更多细节,比如编码风格、日志记录、国际化与本地化处理、多线程编程的注意事项等。遵循这些规范,可以显著提高J2EE项目的质量和可维护性。
其他层则包含一些辅助性的文档和文件。 5. 文件结构:在文件管理方面,文档规定了文件的结构,包括版权和版本声明、头文件的结构、定义文件的结构。这是为了确保项目文件的整洁和一致性。 6. 命名规则:包括对枚举...
上次我们搭建了一个基本的 express 后台,但是这样的项目结构的可扩展性,维护性和代码复用性都不是很好,参照之前学习 JavaWeb 时候的四层架构设计,用分层的思想来对 express 进行一点小优化,进一步提高代码的可...
内容概要:本文详细介绍了基于51单片机和Proteus仿真环境构建的电梯控制系统的设计与实现。主要内容涵盖楼层显示、矩阵按键...此外,还提到了该系统的移植性和扩展性,展示了如何在不同MCU平台上复用业务逻辑层代码。
为了解决这些问题,一种改进的SSH架构被提出,通过重新定义分层结构,实现业务代码的共享和复用。主要变化在于: 1. **业务代码统一实现IBusinessService接口**,这使得Action类的数量得以减少,因为大多数业务逻辑...
在当今时代,互联网的高速发展使其成为信息传播的主要途径,这一点也深刻影响了各种业务的运营方式。汽车租赁行业也随着这种趋势开始转向信息化管理,利用现代技术来提升业务效率和服务质量。基于Java的汽车租赁系统...
2. **weather-common**: 这个模块可能包含了项目中可复用的工具类、常量、枚举等通用组件,例如日期时间处理、字符串操作等,旨在提高代码的重用率和减少代码冗余。 3. **weather-manager-web**: 这部分是Web应用的...