现在的项目大部分都是基于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 对象来实现的
相关推荐
iuap-pap-baseservice框架属于iuap快速开发体系中的后台支持部分,通过与iuap前端开发框架结合,可快速的实现一套业务表单系统开发. 特性 集成图形化快速建模工具—— 快速启动业务表单开发 简化单表/主子表CRUD服务...
springMVC+Mybatis封装整合:整合搭建已经完成不再述,本框架特色主要针对Mybatis框架BaseDao,BaseService,BaseServiceImpl封装,有点贵,本人也是循序见进到这一步,花了将近一个月时间,之前发布版本可以不下载...
wind是一个基于spring-boot的快速开发框架,可与Mybatis/Hibernate共存。 wind特点: 查询支持返回指定列,返回基本类型(Long/BigDecimal等) lambda方式构造条件,支持类型推断 基于jdbc-template service层切入,...
4.service的实现类中,新增和更新操作已实现字符串解析功能.此类尤其建议使用超类(basic包下)自适应获取数据库的分页方法. 5.controller: 包含add,update,delete,info,list方法,包含try-catch与返回值. 注:超类使用...
zheng项目不仅仅是一个开发架构,而是努力打造一套从前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位J2EE企业级开发解决方案。 zheng项目是一个基于Spring+...
DWR+JPA DWR直接访问SERVICE层,并直接处理DAO返回的BEAN
单点登录, SSM框架公共模块 ├── zheng-admin -- 后台管理模板 ├── zheng-ui -- 前台thymeleaf模板[端口:1000] ...## 环境搭建(QQ群内有“zheng环境搭建和系统部署文档.doc”) #### 开发工具: ...
实现了 BaseService 类对 Service 层进行抽象。通过拦截器实现了方法级粒度的鉴权,通过AOP实现了参数校验。 --------------------------- **演示**:[https://small.ડ.com/][1] 可自行注册账号,或使用后台查看...
个人花了两个星期时间整的SpringMVC(spring-aop,spring-cache)及Mybatis框架,整个框架mybatis部分完全采用注解方式,通过BaseMapper及BaseService方法实现最基础的crud操作,当然整个框架在查询封装上运行偶尔会...
自定义日志模块(接口及代理实现),而不直接使用第三方日志框架接口,避免在日志框架升级或者切换时,代码过多耦合。 这个举例说明一下: 比如,在某一项目开始时使用的是“log4j”...注意:代码使用的是utf-8编码
实现了 BaseService 类对 Service 层进行抽象。通过拦截器实现了方法级粒度的鉴权,通过AOP实现了参数校验。 二、主要功能 首页、分类页、搜索页、产品页 购物车页面、下单页、支付页及支付成功页 我的订单页、...
java泛型BaseDao与BaseService
实现了 BaseService 类对 Service 层进行抽象。通过拦截器实现了方法级粒度的鉴权,通过AOP实现了参数校验。 演示: 可自行注册账号,或使用后台查看权限账号 demo 密码 demo (后台入口登陆后显示) 兄弟项目: 本...
.net 分布式缓存中间件 方便实现缓存的分布式,集群,负载均衡,故障自动转移,并兼容多种缓存存储的分布式缓存中间件。 用于解决分布式架构中的分布式缓存环节。
一、功能cocolian-rpc是一个RPC容器和客户端连接池的实现。cocolian-rpc-server: 使用Apache Thrift 作为容器,Protobuf Message作为输入输出参数的RPC服务器;cocolian-rpc-client: 客户端的实现,提供一个连接池。...
平台基于quartz.net进行任务调度功能开发,采用C#代码编写,支持corn表达和第三方自定义的corn表达扩展。 架构以插件形式开发,具有良好的功能扩展性,稳定性,简单性,可供第三方开发人员进一步进行功能扩展。 ...
diboot主要有diboot-core和diboot-devtools组成,diboot-core又为springboot专门封装了diboot-core-spring-boot-starter组件,diboot-devtools也以starter提供。diboot特点:1、专门为springboot开发,引入依赖,...
里面有整个框架的搭建和源码 package com.icss.action; import com.icss.po.Employee; import com.icss.service.BaseService; import com.opensymphony.xwork2.ActionSupport; public class EmployeeAction ...
集成tk-mybatis,并扩展了BaseService(改名为BaseRepository) 和 LogicService(带逻辑删除-该接口已删除-依然可以继承AbstractLogicRepositoryImpl完成逻辑资源操作),提供日志记录,线程内MDC日志Id,统一的restful...
3.BsaeDao是接口BaseService是实现 4.使用注解即可 xml配置文件在jar包中可以找到 5.使用struts的0配置(这个需要懂0配置的人才能使用该jar包) 6.utils里面有很多很多的工具功能性代码纯属于个人从网络收集 7.包含...