1、pom导入
<dependency>
<groupId>com.gitlab.haynes</groupId>
<artifactId>orika-spring-boot-starter</artifactId>
<version>1.26.0</version>
</dependency>
2、Orika 封装 OrikaUtils
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.SneakyThrows;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.converter.BidirectionalConverter;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import ma.glasnost.orika.metadata.ClassMapBuilder;
import ma.glasnost.orika.metadata.Type;
import ma.glasnost.orika.metadata.TypeFactory;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class OrikaUtils {
private static final MapperFactory MAPPER_FACTORY;
private static final MapperFacade MAPPER_FACADE;
private static final Map<String, MapperFacade> CACHE_MAPPER_FACADE_MAP;
static {
MAPPER_FACTORY = new DefaultMapperFactory.Builder().mapNulls(false).build();
MAPPER_FACTORY.getConverterFactory().registerConverter(new DateToString());
MAPPER_FACTORY.getConverterFactory().registerConverter(new TimestampToString());
MAPPER_FACADE = MAPPER_FACTORY.getMapperFacade();
CACHE_MAPPER_FACADE_MAP = new ConcurrentHashMap<>();
}
public static <S, D> D convert(S source, Class<D> toClass) {
return MAPPER_FACADE.map(source, toClass);
}
public static <S, D> D convert(S source, Class<D> targetClass, Map<String, String> configMap) {
MapperFacade mapperFacade = getMapperFacade(targetClass, source.getClass(), configMap);
return mapperFacade.map(source, targetClass);
}
public static <S, D> void copy(S source, D target) {
MAPPER_FACADE.map(source, target);
}
public static <S, D> List<D> converts(Iterable<S> sources, Class<D> targetClass) {
return MAPPER_FACADE.mapAsList(sources, targetClass);
}
public static <S, D> Page<D> page(Page<S> source, Class<D> targetClass) {
Page<D> dPage = convert(source, Page.class);
dPage.setRecords(converts(source.getRecords(), targetClass));
return dPage;
}
public static <S, D> List<D> converts(Collection<S> source, Class<D> targetClass, Map<String, String> configMap) {
if (source.iterator().next() == null) {
return null;
}
MapperFacade mapperFacade = getMapperFacade(targetClass, source.iterator().next().getClass(), configMap);
return mapperFacade.mapAsList(source, targetClass);
}
public static <S, D> List<D> converts(Collection<S> source, Class<S> sourceClass, Class<D> targetClass, Map<String, String> configMap) {
MapperFacade mapperFacade = getMapperFacade(targetClass, sourceClass, configMap);
return mapperFacade.mapAsList(source, targetClass);
}
private static <S, D> MapperFacade getMapperFacade(Class<S> sourceClass, Class<D> targetClass, Map<String, String> configMap) {
String mapKey = targetClass.getCanonicalName() + "_" + sourceClass.getCanonicalName();
MapperFacade mapperFacade = CACHE_MAPPER_FACADE_MAP.get(mapKey);
if (Objects.isNull(mapperFacade)) {
ClassMapBuilder<D, S> classMapBuilder = classMap(sourceClass, targetClass);
configMap.forEach(classMapBuilder::field);
classMapBuilder.byDefault().register();
mapperFacade = MAPPER_FACTORY.getMapperFacade();
CACHE_MAPPER_FACADE_MAP.put(mapKey, mapperFacade);
}
return mapperFacade;
}
public static <S, D> D[] convertArray(final S[] source, final D[] target, final Class<D> targetClass) {
return MAPPER_FACADE.mapAsArray(target, source, targetClass);
}
public static <S, D> ClassMapBuilder<D, S> classMap(Class<S> source, Class<D> target) {
return MAPPER_FACTORY.classMap(target, source);
}
public static <S> Type<S> getType(final Class<S> rawType) {
return TypeFactory.valueOf(rawType);
}
static class DateToString extends BidirectionalConverter<Date, String> {
@Override
public String convertTo(Date date, Type<String> type, MappingContext mappingContext) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(date);
}
@SneakyThrows
@Override
public Date convertFrom(String s, Type<Date> type, MappingContext mappingContext) {
return null;
}
}
static class TimestampToString extends BidirectionalConverter<Timestamp, String> {
@Override
public String convertTo(Timestamp date, Type<String> type, MappingContext mappingContext) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(date);
}
@SneakyThrows
@Override
public Timestamp convertFrom(String s, Type<Timestamp> type, MappingContext mappingContext) {
return null;
}
}
}