锁定老帖子 主题:业务层代码复用的一点建议
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-02
觉得其实大多数DAO的方法BASE中都能够包括了,可以在特定的模块在加一层针对自己的DAO其他的直接就用BASE应该就可以了。
|
|
返回顶楼 | |
发表时间:2010-08-02
我觉得这种抽象与封装是与一定的业务逻辑相关联的,有点领域建模的意思。
本来抽象的越往上,就越是共性的东西,个性化的东西就越少。 加入具体的DAO中有的需要返回列表,有的需要返回单个对象,查询的条件也很不一样,这样岂不是方法又会很多(当然可以使用HashMap作为参数减少一些签名的不同)。 |
|
返回顶楼 | |
发表时间:2010-08-09
猫扑精华帖的水平
|
|
返回顶楼 | |
发表时间:2010-08-12
我有个比喻:
如果设计模式那个博客是VS黑1的话,楼主这个帖子可以去QQ对战平台 |
|
返回顶楼 | |
发表时间: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); } 利用泛型可以实现,更加通用的接口或类。 |
|
返回顶楼 | |
发表时间: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); } } |
|
返回顶楼 | |
发表时间: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); } } |
|
返回顶楼 | |
发表时间:2010-08-19
这个是基本的复用,没什么特别的东西。
不过还是钦佩楼主的总结。 |
|
返回顶楼 | |
发表时间:2010-08-19
一个service应该可以调用多个dao方法···
|
|
返回顶楼 | |
发表时间:2010-08-20
楼主加油哦 你就快成功了 哈哈
|
|
返回顶楼 | |