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;
 }
}

