From 8416665ce3c158f33751f4a6d73319c1912367ef Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Fri, 23 Jun 2017 18:03:19 +0800 Subject: [PATCH] =?UTF-8?q?add=20>=20=E7=BB=9F=E4=B8=80=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=B0=81=E8=A3=85&=E7=94=9F=E6=88=90=E5=B7=A5=E5=85=B7&?= =?UTF-8?q?=E5=9F=BA=E7=A1=80Service&=E5=BC=82=E5=B8=B8=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/project/core/AbstractService.java | 75 +++++++++++++++++++ .../java/com/company/project/core/Mapper.java | 17 +++++ .../company/project/core/ProjectConstant.java | 11 +++ .../java/com/company/project/core/Result.java | 49 ++++++++++++ .../com/company/project/core/ResultCode.java | 18 +++++ .../company/project/core/ResultGenerator.java | 27 +++++++ .../com/company/project/core/Service.java | 22 ++++++ .../project/core/ServiceException.java | 17 +++++ 8 files changed, 236 insertions(+) create mode 100644 src/main/java/com/company/project/core/AbstractService.java create mode 100644 src/main/java/com/company/project/core/Mapper.java create mode 100644 src/main/java/com/company/project/core/ProjectConstant.java create mode 100644 src/main/java/com/company/project/core/Result.java create mode 100644 src/main/java/com/company/project/core/ResultCode.java create mode 100644 src/main/java/com/company/project/core/ResultGenerator.java create mode 100644 src/main/java/com/company/project/core/Service.java create mode 100644 src/main/java/com/company/project/core/ServiceException.java diff --git a/src/main/java/com/company/project/core/AbstractService.java b/src/main/java/com/company/project/core/AbstractService.java new file mode 100644 index 0000000..1d69764 --- /dev/null +++ b/src/main/java/com/company/project/core/AbstractService.java @@ -0,0 +1,75 @@ +package com.company.project.core; + + +import org.apache.ibatis.exceptions.TooManyResultsException; +import org.springframework.beans.factory.annotation.Autowired; +import tk.mybatis.mapper.entity.Condition; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.util.List; + +/** + * 基于通用MyBatis Mapper插件的Service接口的实现 + */ +public abstract class AbstractService implements Service { + + @Autowired + protected Mapper mapper; + + private Class modelClass; // 当前泛型真实类型的Class + + public AbstractService() { + ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); + modelClass = (Class) pt.getActualTypeArguments()[0]; + } + + public void save(T model) { + mapper.insertSelective(model); + } + + public void save(List models) { + mapper.insertList(models); + } + + public void deleteById(Integer id) { + mapper.deleteByPrimaryKey(id); + } + + public void deleteByIds(String ids) { + mapper.deleteByIds(ids); + } + + public void update(T model) { + mapper.updateByPrimaryKeySelective(model); + } + + public T findById(Integer id) { + return mapper.selectByPrimaryKey(id); + } + + @Override + public T findBy(String property, Object value) throws TooManyResultsException { + try { + T model = modelClass.newInstance(); + Field field = modelClass.getDeclaredField(property); + field.setAccessible(true); + field.set(model, value); + return mapper.selectOne(model); + } catch (ReflectiveOperationException e) { + throw new ServiceException(e.getMessage(), e); + } + } + + public List findByIds(String ids) { + return mapper.selectByIds(ids); + } + + public List findByCondition(Condition condition) { + return mapper.selectByCondition(condition); + } + + public List findAll() { + return mapper.selectAll(); + } +} diff --git a/src/main/java/com/company/project/core/Mapper.java b/src/main/java/com/company/project/core/Mapper.java new file mode 100644 index 0000000..0adebc2 --- /dev/null +++ b/src/main/java/com/company/project/core/Mapper.java @@ -0,0 +1,17 @@ +package com.company.project.core; + +import tk.mybatis.mapper.common.BaseMapper; +import tk.mybatis.mapper.common.ConditionMapper; +import tk.mybatis.mapper.common.IdsMapper; +import tk.mybatis.mapper.common.special.InsertListMapper; + +/** + * 定制版MyBatis Mapper插件接口,如需其他接口参考官方文档自行添加。 + */ +public interface Mapper + extends + BaseMapper, + ConditionMapper, + IdsMapper, + InsertListMapper { +} diff --git a/src/main/java/com/company/project/core/ProjectConstant.java b/src/main/java/com/company/project/core/ProjectConstant.java new file mode 100644 index 0000000..2d0ea5f --- /dev/null +++ b/src/main/java/com/company/project/core/ProjectConstant.java @@ -0,0 +1,11 @@ +package com.company.project.core; + +/** + * 项目常量 + */ +public final class ProjectConstant { + public static final String BASE_PACKAGE = "com.company.project";//项目基础包名称,根据自己的公司项目修改 + public static final String MAPPER_PACKAGE = BASE_PACKAGE + ".dao";//Mapper所在包 + public static final String MODEL_PACKAGE = BASE_PACKAGE + ".model";//Model所在包 + public static final String MAPPER_INTERFACE_REFERENCE = BASE_PACKAGE + ".core.Mapper";//Mapper插件基础接口的完全限定名 +} diff --git a/src/main/java/com/company/project/core/Result.java b/src/main/java/com/company/project/core/Result.java new file mode 100644 index 0000000..02714eb --- /dev/null +++ b/src/main/java/com/company/project/core/Result.java @@ -0,0 +1,49 @@ +package com.company.project.core; + +import com.alibaba.fastjson.JSON; + +/** + * 统一API响应结果封装 + */ +public class Result { + private int code; + private String message; + private Object data; + + public Result setCode(ResultCode resultCode) { + this.code = resultCode.code; + return this; + } + + public int getCode() { + return code; + } + + public Result setCode(int code) { + this.code = code; + return this; + } + + public String getMessage() { + return message; + } + + public Result setMessage(String message) { + this.message = message; + return this; + } + + public Object getData() { + return data; + } + + public Result setData(Object data) { + this.data = data; + return this; + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/src/main/java/com/company/project/core/ResultCode.java b/src/main/java/com/company/project/core/ResultCode.java new file mode 100644 index 0000000..16e2e0d --- /dev/null +++ b/src/main/java/com/company/project/core/ResultCode.java @@ -0,0 +1,18 @@ +package com.company.project.core; + +/** + * 响应码枚举,参考HTTP状态码的语义 + */ +public enum ResultCode { + SUCCESS(200),//成功 + FAIL(400),//失败 + UNAUTHORIZED(401),//未认证(签名错误) + NOT_FOUND(404),//接口不存在 + INTERNAL_SERVER_ERROR(500);//服务器内部错误 + + public int code; + + ResultCode(int code) { + this.code = code; + } +} diff --git a/src/main/java/com/company/project/core/ResultGenerator.java b/src/main/java/com/company/project/core/ResultGenerator.java new file mode 100644 index 0000000..7862f48 --- /dev/null +++ b/src/main/java/com/company/project/core/ResultGenerator.java @@ -0,0 +1,27 @@ +package com.company.project.core; + +/** + * 响应结果生成工具 + */ +public class ResultGenerator { + private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; + + public static Result genSuccessResult() { + return new Result() + .setCode(ResultCode.SUCCESS) + .setMessage(DEFAULT_SUCCESS_MESSAGE); + } + + public static Result genSuccessResult(Object data) { + return new Result() + .setCode(ResultCode.SUCCESS) + .setMessage(DEFAULT_SUCCESS_MESSAGE) + .setData(data); + } + + public static Result genFailResult(String message) { + return new Result() + .setCode(ResultCode.FAIL) + .setMessage(message); + } +} diff --git a/src/main/java/com/company/project/core/Service.java b/src/main/java/com/company/project/core/Service.java new file mode 100644 index 0000000..f5ba6aa --- /dev/null +++ b/src/main/java/com/company/project/core/Service.java @@ -0,0 +1,22 @@ +package com.company.project.core; + +import org.apache.ibatis.exceptions.TooManyResultsException; +import tk.mybatis.mapper.entity.Condition; + +import java.util.List; + +/** + * Service 层 基础接口,其他Service 接口 请继承该接口 + */ +public interface Service { + void save(T model);//持久化 + void save(List models);//批量持久化 + void deleteById(Integer id);//通过主鍵刪除 + void deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4” + void update(T model);//更新 + T findById(Integer id);//通过ID查找 + T findBy(String property, Object value) throws TooManyResultsException; //通过某个成员属性查找,value需符合unique约束 + List findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4” + List findByCondition(Condition condition);//根据条件查找 + List findAll();//获取所有 +} diff --git a/src/main/java/com/company/project/core/ServiceException.java b/src/main/java/com/company/project/core/ServiceException.java new file mode 100644 index 0000000..e698bce --- /dev/null +++ b/src/main/java/com/company/project/core/ServiceException.java @@ -0,0 +1,17 @@ +package com.company.project.core; + +/** + * 服务(业务)异常如“ 账号或密码错误 ”,该异常只做INFO级别的日志记录 @see WebMvcConfigurer + */ +public class ServiceException extends RuntimeException { + public ServiceException() { + } + + public ServiceException(String message) { + super(message); + } + + public ServiceException(String message, Throwable cause) { + super(message, cause); + } +}