论坛首页 Java企业应用论坛

业务层代码复用的一点建议

浏览 29507 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-08-02  
觉得其实大多数DAO的方法BASE中都能够包括了,可以在特定的模块在加一层针对自己的DAO其他的直接就用BASE应该就可以了。
0 请登录后投票
   发表时间:2010-08-02  
我觉得这种抽象与封装是与一定的业务逻辑相关联的,有点领域建模的意思。
本来抽象的越往上,就越是共性的东西,个性化的东西就越少。

加入具体的DAO中有的需要返回列表,有的需要返回单个对象,查询的条件也很不一样,这样岂不是方法又会很多(当然可以使用HashMap作为参数减少一些签名的不同)。
0 请登录后投票
   发表时间:2010-08-09  
猫扑精华帖的水平
0 请登录后投票
   发表时间:2010-08-12  
我有个比喻:

如果设计模式那个博客是VS黑1的话,楼主这个帖子可以去QQ对战平台
0 请登录后投票
   发表时间: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);

}



利用泛型可以实现,更加通用的接口或类。
0 请登录后投票
   发表时间: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);
		}
	}
0 请登录后投票
   发表时间: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);
		}
	}

0 请登录后投票
   发表时间:2010-08-19  
这个是基本的复用,没什么特别的东西。
不过还是钦佩楼主的总结。
0 请登录后投票
   发表时间:2010-08-19  
一个service应该可以调用多个dao方法···
0 请登录后投票
   发表时间:2010-08-20  
楼主加油哦 你就快成功了 哈哈
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics