parent
6d2d5c7da7
commit
8416665ce3
@ -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<T> implements Service<T> { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
protected Mapper<T> mapper; |
||||||
|
|
||||||
|
private Class<T> modelClass; // 当前泛型真实类型的Class
|
||||||
|
|
||||||
|
public AbstractService() { |
||||||
|
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); |
||||||
|
modelClass = (Class<T>) pt.getActualTypeArguments()[0]; |
||||||
|
} |
||||||
|
|
||||||
|
public void save(T model) { |
||||||
|
mapper.insertSelective(model); |
||||||
|
} |
||||||
|
|
||||||
|
public void save(List<T> 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<T> findByIds(String ids) { |
||||||
|
return mapper.selectByIds(ids); |
||||||
|
} |
||||||
|
|
||||||
|
public List<T> findByCondition(Condition condition) { |
||||||
|
return mapper.selectByCondition(condition); |
||||||
|
} |
||||||
|
|
||||||
|
public List<T> findAll() { |
||||||
|
return mapper.selectAll(); |
||||||
|
} |
||||||
|
} |
@ -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<T> |
||||||
|
extends |
||||||
|
BaseMapper<T>, |
||||||
|
ConditionMapper<T>, |
||||||
|
IdsMapper<T>, |
||||||
|
InsertListMapper<T> { |
||||||
|
} |
@ -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插件基础接口的完全限定名
|
||||||
|
} |
@ -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); |
||||||
|
} |
||||||
|
} |
@ -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; |
||||||
|
} |
||||||
|
} |
@ -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); |
||||||
|
} |
||||||
|
} |
@ -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<T> { |
||||||
|
void save(T model);//持久化
|
||||||
|
void save(List<T> 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<T> findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4”
|
||||||
|
List<T> findByCondition(Condition condition);//根据条件查找
|
||||||
|
List<T> findAll();//获取所有
|
||||||
|
} |
@ -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); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue