90 Star 700 Fork 173

fhs_opensource / fhs-framework

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
BaseServiceImpl.java 20.74 KB
一键复制 编辑 原始数据 按行查看 历史
王磊 提交于 2020-01-19 20:36 . 添加autotrans支持
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
package com.fhs.core.base.service.impl;
import com.alicp.jetcache.Cache;
import com.alicp.jetcache.anno.CreateCache;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fhs.common.utils.ConverterUtils;
import com.fhs.common.utils.DateUtils;
import com.fhs.common.utils.Logger;
import com.fhs.common.utils.ReflectUtils;
import com.fhs.core.base.bean.SuperBean;
import com.fhs.core.base.dao.BaseDao;
import com.fhs.core.base.service.BaseService;
import com.fhs.core.cache.annotation.Cacheable;
import com.fhs.core.exception.ParamException;
import com.fhs.core.strategy.GenInfo;
import com.fhs.core.trans.TransService;
import com.mybatis.jpa.annotation.CatTableFlag;
import com.mybatis.jpa.cache.JpaTools;
import com.mybatis.jpa.constant.ResultMapConstants;
import com.mybatis.jpa.meta.MybatisColumnMeta;
import com.mybatis.jpa.meta.PersistentMeta;
import com.mybatis.jpa.statement.MybatisStatementAdapter;
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
import org.apache.ibatis.mapping.SqlCommandType;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.*;
/**
* 业务层base类,主要提供对数据库的CRUD操作,在debug模式下面不处理异常,但是在正式环境下会处理异常,并记录到log中 所有的子类都需要实现getDao的方法注入自己的dao
*
* @author wanglei
* @version [版本号, 2015年5月27日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public abstract class BaseServiceImpl<T> implements BaseService<T> {
protected final Logger log = Logger.getLogger(this.getClass());
/**
* 缓存 默认时间:半个小时
*/
@CreateCache(expire = 1800, name = "docache:")
private Cache<String, T> doCache;
/**
* do的namespace
*/
private String namespace;
/**
* 判断自己是否需要支持自动缓存
*/
private boolean isCacheable;
@Autowired
protected TransService transService;
/**
* 利用spring4新特性泛型注入
*/
@Autowired
protected BaseDao<T> baseDao;
@Autowired
protected NestedServiceImpl<T> nestedServiceImpl;
private static final Set<String> exist = new HashSet<>();
@Autowired
private SqlSessionTemplate sqlsession;
public BaseServiceImpl() {
//判断自己是否需要支持缓存
this.isCacheable = this.getClass().isAnnotationPresent(Cacheable.class);
if(isCacheable) {
this.namespace =this.getClass().getAnnotation(Cacheable.class).value();
}
}
@Override
public int addFromMap(Map<String, Object> info) {
return baseDao.addFromMap(info);
}
@Override
@GenInfo
public int add(T bean) {
return baseDao.add(bean);
}
@Override
public boolean updateFormMap(Map<String, Object> map) {
return baseDao.updateFormMap(map) > 0;
}
@Override
public boolean update(T bean) {
return baseDao.update(bean) > 0;
}
@Override
public boolean updateJpa(T bean) {
return baseDao.updateSelectiveById(bean) > 0;
}
@Override
public boolean deleteFromMap(Map<String, Object> map) {
return baseDao.deleteFromMap(map) > 0;
}
@Override
public boolean delete(T bean) {
return baseDao.delete(bean) > 0;
}
@Override
public int findCountFromMap(Map<String, Object> map) {
return baseDao.findCountFromMap(map);
}
@Override
public int findCount(T bean) {
return baseDao.findCount(bean);
}
@Override
public int findCountJpa(T bean) {
return (int) baseDao.selectCountJpa(bean);
}
@SuppressWarnings({"unchecked"})
@Override
public List<T> findForList(T bean) {
List<T> result = baseDao.selectPageJpa(bean, -1, -1);
transService.transMore((List<SuperBean<?>>) result);
return result;
}
/**
* 查询数据 参数为object
*
* @param bean bean
* @return 查询出来的数据集合
*/
@SuppressWarnings({"unchecked"})
@Override
public List<T> findForList(T bean, int pageStart, int pageSize) {
List<T> result = baseDao.selectPageJpa(bean, pageStart, pageSize);
transService.transMore((List<SuperBean<?>>) result);
return result;
}
@SuppressWarnings({"unchecked"})
@Override
public List<T> findForListFromMap(Map<String, Object> map) {
List<T> result = baseDao.findForListFromMap(map);
transService.transMore((List<SuperBean<?>>) result);
return result;
}
@Override
public List<Map<String, Object>> findMapList(Map<String, Object> map) {
return baseDao.findMapList(map);
}
@Override
public T findBeanFromMap(Map<String, Object> map) {
return baseDao.findBeanFromMap(map);
}
@Override
public T findBean(T bean) {
return baseDao.findBean(bean);
}
@Override
public T findBeanById(Object id) {
T bean = baseDao.selectByIdJpa(id);
transService.transOne((SuperBean<?>) bean);
return bean;
}
@Override
public int updateBatch(List<Map<String, Object>> list) {
return baseDao.updateBatch(list);
}
@Override
public int addBatch(Map<String, Object> paramMap) {
return baseDao.addBatch(paramMap);
}
@GenInfo
@Override
public int insertSelective(T entity) {
addCache(entity);
return baseDao.insertSelective(entity);
}
/**
* 添加缓存
*
* @param entity 实体类
*/
private void addCache(T entity) {
if (this.isCacheable && JpaTools.persistentMetaMap.containsKey(entity.getClass().getName())) {
String pkey = getPkeyVal(entity);
this.doCache.put(namespace + ":" + pkey, entity);
}
}
/**
* 获取主键
*
* @param entity do
* @return 主键值
*/
private String getPkeyVal(T entity) {
return ConverterUtils.toString(ReflectUtils.getValue(entity, JpaTools.persistentMetaMap.get(entity.getClass().getName()).getPrimaryColumnMeta().getProperty()));
}
@GenInfo
@Override
public int insertJpa(T entity) {
return baseDao.insertJpa(entity);
}
@GenInfo
@Override
public int insert(T entity) {
return baseDao.insertJpa(entity);
}
@Override
public int batchInsert(List<T> list) {
return baseDao.batchInsert(list);
}
@Override
public int deleteById(Object primaryValue) {
if (this.isCacheable) {
this.doCache.remove(namespace + ":" + ConverterUtils.toString(primaryValue));
}
return baseDao.deleteByIdJpa(primaryValue);
}
@Override
public int updateById(T entity) {
updateCache(entity);
return baseDao.updateByIdJpa(entity);
}
@Override
public int updateSelectiveById(T entity) {
updateCache(entity);
return baseDao.updateSelectiveById(entity);
}
private void updateCache(T entity) {
if (this.isCacheable) {
String pkey = this.getPkeyVal(entity);
this.doCache.remove(namespace + ":" + pkey);
this.doCache.put(namespace + ":" + pkey, entity);
}
}
@Override
public int batchUpdate(List<T> entity) {
return baseDao.batchUpdate(entity);
}
@Override
public T selectById(Object primaryValue) {
if (this.isCacheable) {
String pkey = ConverterUtils.toString(primaryValue);
T result = this.doCache.get(namespace + ":" + pkey);
if (result == null) {
result = baseDao.selectByIdJpa(primaryValue);
if (result != null) {
this.doCache.put(namespace + ":" + pkey, result);
}
}
return result;
}
return baseDao.selectByIdJpa(primaryValue);
}
@Override
public List<T> selectPage(T entity, long pageStart, long pageSize) {
List<T> result = baseDao.selectPageJpa(entity, pageStart, pageSize);
transService.transMore((List<SuperBean<?>>) result);
return result;
}
@Override
public List<T> selectPageForOrder(T entity, long pageStart, long pageSize, String orderBy) {
List<T> result = baseDao.selectPageForOrder(entity, pageStart, pageSize, orderBy);
transService.transMore((List<SuperBean<?>>) result);
return result;
}
@Override
public long selectCount(T entity) {
return baseDao.selectCountJpa(entity);
}
@Override
public List<T> select() {
return baseDao.select();
}
@Override
public int batchInsertCatTable(List<T> list, @CatTableFlag String flag) {
return baseDao.batchInsertCatTable(list, flag);
}
@Override
public T selectByIdCatTable(String id, @CatTableFlag String catTableFlag) {
return baseDao.selectByIdCatTable(id, catTableFlag);
}
@Override
public T selectBean(T param) {
return baseDao.selectBean(param);
}
public int deleteBean(T entity) {
return baseDao.deleteBean(entity);
}
@Override
public int insertByNested(T entity) {
int result = baseDao.insertSelective(entity);
try {
nestedServiceImpl.insertOnetoX(entity);
} catch (IllegalAccessException e) {
log.error(this, e);
}
return result;
}
@Override
public int deleteByNested(T entity) {
int result = baseDao.deleteBean(entity);
try {
nestedServiceImpl.deleteOneToX(entity);
} catch (IllegalAccessException e) {
log.error(this, e);
}
return result;
}
public List<T> selectNested(T entity, long pageStart, long pageSize) {
return baseDao.selectNested(entity, pageStart, pageSize);
}
public List<T> selectNestedForOrder(T entity, long pageStart, long pageSize, String orderBy) {
return baseDao.selectNestedForOrder(entity, pageStart, pageSize, orderBy);
}
public Where<T> getWhereBuilder(String name) {
return new Where<T>(sqlsession, this, name);
}
/**
* where条件构造器
*
* @Filename: BaseServiceImpl.java
* @Description:
* @Version: 1.0
* @Author: jackwang
* @Email: wanglei@sxpartner.com
* @History:<br> 陕西小伙伴网络科技有限公司 Copyright (c) 2017 All Rights Reserved.
*/
@SuppressWarnings("hiding")
public class Where<T> {
private SqlSessionTemplate sqlsession;
/**
* 给sql 起一个id
*/
private String name;
/**
* where 的过滤条件
*/
private StringBuilder whereParam = new StringBuilder(" <where> ");
/**
* 参数
*/
private Map<String, Object> paramMap = new HashMap<>();
/**
* do的class name
*/
private String modelName;
/**
* 是否需要拼sql
*/
boolean isInitSql;
/**
* 分表信息
*/
private String catTableInfo = "";
/**
* sql的namespace
*/
private String nameSpace;
private Where(SqlSessionTemplate sqlsession, BaseService<T> baseService, String name) {
this.sqlsession = sqlsession;
modelName = ((ParameterizedType) baseService.getClass().getGenericSuperclass()).getActualTypeArguments()[0].getTypeName();
this.name = name;
nameSpace = JpaTools.statementAdapterMap.get(modelName).getNameSpace();
this.isInitSql = (!exist.contains(nameSpace + "." + name));
}
/**
* =
*
* @param field 字段名
* @param val 值
* @return where对象
*/
public Where<T> eq(String field, Object val) {
setParam(field, val);
if (isInitSql) {
MybatisColumnMeta column = JpaTools.persistentMetaMap.get(modelName).getColumnMetaMap().get(field);
initIF(field, val);
whereParam.append(
" AND " + column.getColumnName() + " = #{" + field + ",jdbcType=" + column.getJdbcType() + "} ");
whereParam.append(" </if> ");
}
return this;
}
private void initIF(String field, Object val) {
whereParam.append(" <if test=\"");
if (String.class == val.getClass()) {
whereParam.append(field + " !='' and ");
}
whereParam.append(field + " !=null \"> ");
}
/**
* 将参数设置到参数map中去
*
* @param field
* @param val
*/
private void setParam(String field, Object val) {
paramMap.put(field, val);
}
/**
* !=
*
* @param field 字段名
* @param val 值
* @return where对象
*/
public Where<T> nEq(String field, Object val) {
setParam(field, val);
if (isInitSql) {
MybatisColumnMeta column = JpaTools.persistentMetaMap.get(modelName).getColumnMetaMap().get(field);
initIF(field, val);
whereParam.append(
" AND " + column.getColumnName() + " != #{" + field + ",jdbcType=" + column.getJdbcType() + "} ");
whereParam.append(" </if> ");
}
return this;
}
/**
* like %?%
*
* @param field 字段名
* @param val 值
* @return where对象
*/
public Where<T> like(String field, Object val) {
setParam(field, val);
if (isInitSql) {
MybatisColumnMeta column = JpaTools.persistentMetaMap.get(modelName).getColumnMetaMap().get(field);
initIF(field, val);
whereParam.append(" AND " + column.getColumnName() + " LIKE concat('%',#{" + field + "},'%')");
whereParam.append(" </if> ");
}
return this;
}
/**
* like %?
*
* @param field 字段名
* @param val 值
* @return where对象
*/
public Where<T> lLike(String field, Object val) {
setParam(field, val);
if (isInitSql) {
MybatisColumnMeta column = JpaTools.persistentMetaMap.get(modelName).getColumnMetaMap().get(field);
initIF(field, val);
whereParam.append(" AND " + column.getColumnName() + " LIKE concat('%',#{" + field + "})");
whereParam.append(" </if> ");
}
return this;
}
/**
* like ?%
*
* @param field 字段名
* @param val 值
* @return where对象
*/
public Where<T> rLike(String field, Object val) {
setParam(field, val);
if (isInitSql) {
MybatisColumnMeta column = JpaTools.persistentMetaMap.get(modelName).getColumnMetaMap().get(field);
initIF(field, val);
whereParam.append(" AND " + column.getColumnName() + " LIKE concat(#{" + field + "},'%')");
whereParam.append(" </if> ");
}
return this;
}
/**
* 设置分表标志
*
* @param field 字段名
* @param val 值
* @return this
*/
public Where<T> setCatTableFlag(String field, Object val) {
setParam(field, val);
catTableInfo = "_${" + field + "}";
return this;
}
/**
* 查询一个
*
* @return
*/
public T selectOne() {
String sqlId = nameSpace + "." + name;
//如果sql id不存在
if (isInitSql) {
initSql("select");
}
return sqlsession.selectOne(sqlId, paramMap);
}
/**
* 查询多个
*
* @return
*/
public List<T> selectList() {
String sqlId = nameSpace + "." + name;
//如果sql id不存在
if (isInitSql) {
initSql("select");
}
return sqlsession.selectList(sqlId, paramMap);
}
/**
* 查询多个
*
* @return
*/
public Integer delete() {
String sqlId = modelName + "." + name;
//如果sql id不存在
if (isInitSql) {
initSql("delete");
}
return sqlsession.delete(sqlId, paramMap);
}
/**
* 初始化sql
*
* @param type sql类型
*/
private void initSql(String type) {
whereParam.append("</where>");
MybatisStatementAdapter adapter = JpaTools.statementAdapterMap.get(modelName);
// 方法名
adapter.setMethodName(name);
exist.add(nameSpace + "." + name);
adapter.setParameterTypeClass(Object.class);
PersistentMeta persistentMeta = JpaTools.persistentMetaMap.get(modelName);
SqlCommandType sqlCommandType = null;
String fromPreSql = null;
switch (type) {
case "select":
sqlCommandType = SqlCommandType.SELECT;
fromPreSql = " SELECT " + persistentMeta.getColumnNames();
adapter.setResultMapId(ResultMapConstants.DEFAULT_NAMESPACE + "." + persistentMeta.getEntityName());
// 返回值类型
adapter.setResultType(persistentMeta.getType());
break;
case "delete":
sqlCommandType = SqlCommandType.DELETE;
adapter.setResultType(Integer.class);
fromPreSql = " DELETE ";
default:
throw new ParamException("不支持此类型");
}
// sqlScript
adapter.setSqlScript("<script> " + fromPreSql + " FROM " + persistentMeta.getTableName() + catTableInfo + whereParam + "</script>");
adapter.setSqlCommandType(sqlCommandType);
// 主键策略
adapter.setKeyGenerator(new NoKeyGenerator());
adapter.setKeyProperty(null);
adapter.setKeyColumn(null);
adapter.parseStatement();
}
}
private String nameSpace;
@Override
public Object callSqlIdForOne(String sqlId, Object param) {
return sqlsession.selectOne(nameSpace + "." + sqlId, param);
}
/**
* 初始化namespace
*/
public void initNamespace() {
if (nameSpace == null) {
String modelName = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0].getTypeName();
nameSpace = JpaTools.statementAdapterMap.get(modelName).getNameSpace();
}
}
@Override
public List<Object> callSqlIdForMany(String sqlId, Object param) {
return sqlsession.selectList(nameSpace + "." + sqlId, param);
}
@Override
public int callSqlIdForInt(String sqlId, Object param) {
return sqlsession.selectOne(nameSpace + "." + sqlId, param);
}
@Override
public int deleteMP(Wrapper<T> wrapper) {
return baseDao.delete(wrapper);
}
@Override
public int deleteBatchIdsMP(Collection<? extends Serializable> idList) {
return baseDao.deleteBatchIds(idList);
}
@Override
public List<T> selectBatchIdsMP(Collection<? extends Serializable> idList) {
return baseDao.selectBatchIds(idList);
}
@Override
public T selectOneMP(Wrapper<T> queryWrapper) {
return baseDao.selectOne(queryWrapper);
}
@Override
public Integer selectCountMP(Wrapper<T> queryWrapper) {
return baseDao.selectCount(queryWrapper);
}
@Override
public List<T> selectListMP(Wrapper<T> queryWrapper) {
return baseDao.selectList(queryWrapper);
}
@Override
public List<Map<String, Object>> selectMapsMP(Wrapper<T> queryWrapper) {
return baseDao.selectMaps(queryWrapper);
}
@Override
public List<Object> selectObjsMP(Wrapper<T> queryWrapper) {
return baseDao.selectObjs(queryWrapper);
}
@Override
public IPage<T> selectPageMP(IPage<T> page, Wrapper<T> queryWrapper) {
return baseDao.selectPage(page, queryWrapper);
}
@Override
public IPage<Map<String, Object>> selectMapsPageMP(IPage<T> page, Wrapper<T> queryWrapper) {
return baseDao.selectMapsPage(page, queryWrapper);
}
@Override
public List<T> findByIds(List<?> ids) {
return baseDao.selectByIds(ids);
}
}
Java
1
https://gitee.com/fhs-opensource/fhs-framework.git
git@gitee.com:fhs-opensource/fhs-framework.git
fhs-opensource
fhs-framework
fhs-framework
master

搜索帮助