J2EE开发框架搭建(8) - 实现service层的封装 BaseService和BaseServiceImpl

现在的项目大部分都是基于3层架构的,前面已经实现了BaseRepository,类似的本节继续实现service成的封装

1. 首先查看service的接口BaseService:

 

public interface BaseService<T extends AbstractEntity<ID>, ID extends Serializable> {
	/**
	 ** 保存单个实体
	 * @param m  实体
	 * @return 返回保存的实体
	 */
	public T save(T t);
	public List<T> save(List<T> entities);
	/**
	 * 根据主键删除相应实体
	 * @param id 主键 可以是单个对象id,多个对象id用逗号分隔,数组,list....
	 */
	public void remove(ID... ids);
	/**
	 * 删除实体
	 * @param m  实体
	 */
	public void remove(T t);
	public void remove(List<T> entities);
	public void removeAll();
	/**
	 * 更新单个实体
	 * @param m 实体
	 * @return 返回更新的实体
	 */
	public void update(T t);
	/**
	 * 查询单个对象
	 * @param id
	 * @return
	 */
	public T findObject(ID id);
	/**
	 * 按条件查询对象
	 * @param params
	 * @param page
	 * @return
	 * @throws RuntimeException
	 */
	public T findObject(Searchable searchable) throws RuntimeException;

	/**
	 * 实体是否存在
	 * @param id 主键
	 * @return 存在 返回true,否则false
	 */
	public boolean isExist(ID id);
	/**
	 * 判断是否存在
	 * @return 存在 true 不存在 false
	 */
	public boolean isExist(Searchable searchable);
	/**
	 * 查询出所有的记录
	 * @return
	 */
	public List<T> findAll();
	/**
	 * 按照顺序查询所有实体
	 * @param sort
	 * @return
	 */
	public List<T> findList(Sort sort);
	/**
	 * @param searchable     条件
	 * @return
	 */
	public List<T> findList(Searchable searchable);
	public List<T> findList(List<ID> ids);
	/**
	 * 分页及排序查询实体
	 * @param pageable  分页及排序数据
	 * @return
	 */
	public Page<T> findPage(Pageable pageable);
	/**
	 * 按条件分页并排序查询实体
	 * @param searchable  条件
	 * @return
	 */
	public Page<T> findPage(Searchable searchable);
	/**
	 * 统计实体总数
	 * @return 实体总数
	 */
	public Long count();
	/**
	 * 按条件分页并排序统计实体数量
	 * @param searchable 条件
	 * @return
	 */
	public Long count(Searchable searchable);
	/**
	 * @param hqlKey
	 * @param params 可以使map,数组,list,也可以是以多个参数
	 */
	public void update(String sqlKey, Object... params);
	/**
	 * 自定义hql查询
	 * @param hqlKey
	 * @param params   可以使map,数组,list,也可以是以多个参数
	 * @return
	 */
	public List<T> findList(String sqlKey, Object... params);
	public Page<T> findPage(Pageable pageable, String sqlKey, Object... params);
	/**
	 * 自定义hql删除
	 * @param hqlKey
	 * @param params 可以使map ,数组,list,也可以是以多个参数
	 */
	public void remove(String sqlKey, Object... params);
}

在这个接口中已经包含了常用的方法,增删改查以及分页,统计数量等方法。

 

2. 接着查看service的实现类BaseServiceImpl,实现在BaseService的这些接口都要通过BaseRepository ,所以要给BaseServiceImpl指定当时运行时刻的BaseRepository的实现类,这里自己定义一个注解@Service,代码如下:

 

/**
 *<span style="background-color: rgb(255, 0, 0);"> type必填 ,若type,name两个都填,name有效</span>
 * @author silentwu
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@org.springframework.stereotype.Service
public @interface Service {
	/**
	 * service在spring容器中的名称
	 */
	String value() default "";
	/**
	 * Repository的实例名称
	 * 
	 * @return
	 */
	String name() default "";
	/**
	 * Repository的实例类型
	 * 
	 * @return
	 */
	Class<?> repositoryType();
}

在BaseServiceImpl中,我们获取到这个注解,从而可以获取到repositoryType, 在BaseServiceImpl中的代码:

 

private BaseRepository<T, ID> baseRepository;
@PostConstruct
@SuppressWarnings("unchecked")
public void init() throws Exception {
	Service repository = this.getClass().getAnnotation(Service.class);
	if (Utils.isNotEmpty(repository)) {
		if (<span style="background-color: rgb(255, 0, 0);">Utils.isNotEmpty(repository.name())</span>) {
			baseRepository = SpringUtils.getBean(repository.name());
		} else if <span style="color:#ff0000;">(Utils.isNotEmpty(repository.repositoryType()</span>)) {
			baseRepository = (BaseRepository<T, ID>) SpringUtils.getBean(repository.repositoryType());
		} else {
			throw new Exception("com.hqhop.framework.common.bind.annotation.Repository 注解的name和type必填一个!");
		}
	} else {
		throw new Exception("BaseServiceImpl的实现类必须添加上com.hqhop.framework.common.bind.annotation.Repository这个注解 !");
	}
}

@Service的注解,repositoryType必须指定,若指定了name属性,那么name属性有效

 

其他的接口实现就不多说了,都是通过BaseRepository 对象来实现的

 

 

 

 

 

 

 

 



你可能感兴趣的:(Hibernate,memcached,springmvc4,spring4,J2EE框架)