Orika —— 工具类

Posted 正怒月神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Orika —— 工具类相关的知识,希望对你有一定的参考价值。

 参考:https://blog.csdn.net/weixin_37554783/article/details/125555155

在原本基础上,有增加了拷贝对象到对象,null不拷贝的方法。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


public class OrikaUtils 

    private static final MapperFactory FACTORY = new DefaultMapperFactory
            .Builder()
            .mapNulls(false)
            .build();

    /**
     * 缓存实例集合
     */
    private static final Map<String, MapperFacade> CACHE_MAPPER = new ConcurrentHashMap<>();

    private final MapperFacade mapper;

    public OrikaUtils(MapperFacade mapper) 
        this.mapper = mapper;
    

    /**
     * 转换实体函数
     * @param sourceEntity 源实体
     * @param targetClass  目标类对象
     * @param refMap       配置源类与目标类不同字段名映射
     * @param <S>          源泛型
     * @param <T>          目标泛型
     * @return 目标实体
     */
    public static <S, T> T convert(S sourceEntity, Class<T> targetClass, Map<String, String> refMap) 
        if (sourceEntity == null) 
            return null;
        
        return classMap(sourceEntity.getClass(), targetClass, refMap).map(sourceEntity, targetClass);
    

    /**
     * 转换实体函数
     * @param sourceEntity 源实体
     * @param targetEntity  目标实体
     * @param refMap       配置源类与目标类不同字段名映射
     * @param <S>          源泛型
     * @param <T>          目标泛型
     * @return 目标实体
     */
    public static <S, T> T convert(S sourceEntity, T targetEntity, Map<String, String> refMap) 
        if (sourceEntity == null) 
            return null;
        
        return classMap(sourceEntity.getClass(), targetEntity.getClass(), refMap).map(sourceEntity, targetEntity);
    

    /**
     * 转换实体函数
     *
     * @param sourceEntity 源实体
     * @param targetClass  目标类对象
     * @param <S>          源泛型
     * @param <T>          目标泛型
     * @return 目标实体
     */
    public static <S, T> T convert(S sourceEntity, Class<T> targetClass) 
        return convert(sourceEntity, targetClass, null);
    

    /**
     * 转换实体函数
     *
     * @param sourceEntity 源实体
     * @param targetEntity  目标实体
     * @param <S>          源泛型
     * @param <T>          目标泛型
     * @return 目标实体
     */
    public static <S, T> T convert(S sourceEntity, T targetEntity) 
        return convert(sourceEntity, targetEntity, null);
    

    /**
     * 转换实体集合函数
     *
     * @param sourceEntityList 源实体集合
     * @param targetClass      目标类对象
     * @param refMap           配置源类与目标类不同字段名映射
     * @param <S>              源泛型
     * @param <T>              目标泛型
     * @return 目标实体集合
     */
    public static <S, T> List<T> convertList(List<S> sourceEntityList, Class<T> targetClass, Map<String, String> refMap) 
        if (sourceEntityList == null) 
            return null;
        
        if (sourceEntityList.size() == 0) 
            return new ArrayList<>(0);
        
        return classMap(sourceEntityList.get(0).getClass(), targetClass, refMap).mapAsList(sourceEntityList, targetClass);
    

    /**
     * 转换实体集合函数
     *
     * @param sourceEntityList 源实体集合
     * @param targetClass      目标类对象
     * @param <S>              源泛型
     * @param <T>              目标泛型
     * @return 目标实体集合
     */
    public static <S, T> List<T> convertList(List<S> sourceEntityList, Class<T> targetClass) 
        return convertList(sourceEntityList, targetClass, null);
    



    /**
     * 注册属性
     * @param source 源类
     * @param target 目标类
     * @param refMap 属性转换
     */
    public static <V, P> void register(Class<V> source, Class<P> target,Map<String, String> refMap)
        if (CollectionUtils.isEmpty(refMap)) 
            FACTORY.classMap(source, target).byDefault().register();
         else 
            ClassMapBuilder<V, P> classMapBuilder = FACTORY.classMap(source, target);
            refMap.forEach(classMapBuilder::field);
            classMapBuilder.byDefault().register();
        
    

    /**
     * 属性名称一致可用
     * @param source 源数据
     * @param target 目标对象
     * @return OrikaUtils
     */
    private static <V, P> OrikaUtils classMap(Class<V> source, Class<P> target) 
        return classMap(source, target, null);
    

    /**
     * 属性名称不一致可用
     *
     * @param source 原对象
     * @param target 目标对象
     * @return OrikaUtils
     */
    private static synchronized <V, P> OrikaUtils classMap(Class<V> source, Class<P> target, Map<String, String> refMap) 
        String key = source.getCanonicalName() + ":" + target.getCanonicalName();
        if (CACHE_MAPPER.containsKey(key)) 
            return new OrikaUtils(CACHE_MAPPER.get(key));
        
        register(source,target,refMap);
        MapperFacade mapperFacade = FACTORY.getMapperFacade();
        CACHE_MAPPER.put(key, mapperFacade);

        return new OrikaUtils(mapperFacade);
    



    /**
     * Orika复制对象
     * @param source 源数据
     * @param target 目标对象
     * @return target
     */
    private <V, P> P map(V source, Class<P> target) 
        return mapper.map(source, target);
    

    /**
     * Orika复制对象
     * @param source 源数据
     * @param target 目标数据
     * @return target
     */
    private <V, P> P map(V source, P target) 
        mapper.map(source, target);
        return target;
    

    /**
     * 复制List
     * @param source 源对象
     * @param target 目标对象
     * @return P
     */
    private <V, P> List<P> mapAsList(List<V> source, Class<P> target) 
        return CollectionUtils.isEmpty(source) ? Collections.emptyList() : mapper.mapAsList(source, target);
    

以上是关于Orika —— 工具类的主要内容,如果未能解决你的问题,请参考以下文章

常见Bean映射工具分析评测及Orika介绍

MapperFacade使用

MapperFacade使用

MapperFacade使用

Orika 嵌套属性扁平化

Orika clean MapperFactory