人人框架中當前模組統一實現邏輯刪除,但是不是mybatis-plus中的解決方案
阿新 • • 發佈:2020-12-05
mybatis-plus中提供了邏輯刪除的解決方案,但是擔心其他模組中並不想使用邏輯刪除,只在本模組中統一實現邏輯刪除,那麼該怎麼辦呢?
解決方案:
1 自定義CrudServiceImpl,修改其中的delete方法,原理是使用了反射機制。
程式碼如下:
package com.broit.fish.modules.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.broit.fish.modules.service.CrudService; import io.renren.common.page.PageData; import io.renren.common.utils.ConvertUtils; import org.springframework.beans.BeanUtils; import java.lang.reflect.Field; import java.util.List; import java.util.Map; /** * CRUD基礎服務類 * * @author Mark [email protected] */ public abstract class CrudServiceImpl<M extends BaseMapper<T>, T, D> extends BaseServiceImpl<M, T> implements CrudService<T, D> { protected Class<D> currentDtoClass() { return (Class<D>)ReflectionKit.getSuperClassGenericType(getClass(), 2); } @Override public PageData<D> page(Map<String, Object> params) { IPage<T> page = baseDao.selectPage( getPage(params, null, false), getWrapper(params) ); return getPageData(page, currentDtoClass()); } @Override public List<D> list(Map<String, Object> params) { List<T> entityList = baseDao.selectList(getWrapper(params)); return ConvertUtils.sourceToTarget(entityList, currentDtoClass()); } public abstract QueryWrapper<T> getWrapper(Map<String, Object> params); @Override public D get(String id) { T entity = baseDao.selectById(id); return ConvertUtils.sourceToTarget(entity, currentDtoClass()); } @Override public void save(D dto) { T entity = ConvertUtils.sourceToTarget(dto, currentModelClass()); insert(entity); //copy主鍵值到dto BeanUtils.copyProperties(entity, dto); } @Override public void update(D dto) { T entity = ConvertUtils.sourceToTarget(dto, currentModelClass()); updateById(entity); } @Override public int delete(String[] ids, String optUserId,D dto) { int rows = 0; try{ for(String id : ids){ T entity = ConvertUtils.sourceToTarget(dto, currentModelClass()); Class<? extends Object> tClass = entity.getClass(); Field[] field = tClass.getDeclaredFields(); for(Field f : field){ f.setAccessible(true); if("id".equals(f.getName())){ f.set(entity,id); } if("delFlg".equals(f.getName())){ f.set(entity,"0"); } if("updateUser".equals(f.getName())){ f.set(entity,optUserId); } if("updateTime".equals(f.getName())){ f.set(entity,System.currentTimeMillis()); } } if(updateById(entity)){ rows++; } } }catch (Exception e){ e.printStackTrace(); } return rows; } }
2 在自己的 業務ServiceImpl 中這樣呼叫(前提:BaseFishProductTypeServiceImpl extends CrudServiceImpl<BaseFishProductTypeDao, BaseFishProductTypeEntity, BaseFishProductTypeDTO> implements BaseFishProductTypeService):
public Result delete(String[] ids) { Result result = new Result(); AssertUtils.isArrayEmpty(ids, "id"); int rows = delete(ids, ConvertUtils.sourceToTarget(SecurityUser.getUser(), SysUserDTO.class).getId().toString(), new BaseFishProductTypeDTO()); if(rows != ids.length) { result.setCode(-1); } return result; }