跳转到主要内容

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