springboot 集成mybatis-plus通用CRUD
CRUD
mybatis-plust提供了通用CRUD类 IService ,可以直接继承改接口并实现ServiceImpl既可以实现通用CURD
实现自定义的CURD基础类
根据研发规范,IService返回的数据结构是Entity类型,与规范要求的业务代码应该返回DTO不符,可以实现自定义基类来解决
创建并实现自定义基类
/*
* @Description:自定义CRUD基类
* @Author: donglietao@163.com
* @ENT: 实体类
* @DTO: DTO类
*/
public interface CrudService<ENT, DTO> {
List<DTO> list(@Param("ew") Wrapper<ENT> queryWrapper);
}
主要是用到了BaseMap<ENT>类型
/*
* @description: CrudServiceImpl
* @author: donglietao@163.com
* */
@Service
@Slf4j
public class CrudServiceImpl<ENT, DTO> implements CrudService<ENT, DTO> {
// 主要是这个地方,可以使用泛型创建mapper
@Autowired
protected BaseMapper<ENT> baseMapper;
private Class<DTO> getDTOClass() {
return (Class<DTO>) ReflectionKit.getSuperClassGenericType(this.getClass(), CrudService.class, 1);
}
public List<DTO> list(@Param("ew") Wrapper<ENT> queryWrapper) {
List<ENT> list = baseMapper.selectList(queryWrapper);
if (list == null) {
return null;
}
// 此处可以简化,将方法抽离到工具类
List<DTO> listDTO = new ArrayList<>(list.size());
Class<DTO> dtoClass = getDTOClass();
for (ENT ent : list) {
try {
DTO dto = dtoClass.newInstance();
BeanUtils.copyProperties(ent, dto);
listDTO.add(dto);
} catch (Exception ex) {
log.error("CrudServiceImpl.list() error:", ex);
}
}
return listDTO;
}
}
在自定义服务类上实现通用CRUD基类
public interface UserService extends CrudService<UserEntity, UserDTO> {
}
@Service
public class UserServiceImpl extends CrudServiceImpl<UserEntity, UserDTO> implements UserService {
}
进一步简化代码
类型转换工具类
将转换类独立为工具类
@Slf4j
public class ConvertUtils {
public static <T> T sourceToTarget(Object source, Class<T> target) {
if (source == null) {
return null;
}
T targetObject = null;
try {
targetObject = target.newInstance();
BeanUtils.copyProperties(source, targetObject);
} catch (Exception e) {
log.error("convert error ", e);
}
return targetObject;
}
public static <T> List<T> sourceToTarget(Collection<?> sourceList, Class<T> target) {
if (sourceList == null) {
return null;
}
List targetList = new ArrayList<>(sourceList.size());
try {
for (Object source : sourceList) {
T targetObject = target.newInstance();
BeanUtils.copyProperties(source, targetObject);
targetList.add(targetObject);
}
} catch (Exception e) {
log.error("convert error ", e);
}
return targetList;
}
}
使用类型转换工具简化调用
@Service
@Slf4j
public class CrudServiceImpl<ENT, DTO> implements CrudService<ENT, DTO> {
@Autowired
protected BaseMapper<ENT> baseMapper;
private Class<DTO> getDTOClass() {
return (Class<DTO>) ReflectionKit.getSuperClassGenericType(this.getClass(), CrudService.class, 1);
}
public List<DTO> list(@Param("ew") Wrapper<ENT> queryWrapper) {
List<ENT> list = baseMapper.selectList(queryWrapper);
// 使用转换工具简化调用
List<DTO> listDTO = ConvertUtils.sourceToTarget(list, getDTOClass());
return listDTO;
}
}