Loading... ## 介绍 [Dozer](http://dozer.sourceforge.net/) 是 Java Bean 到 Java Bean 的映射器,它以递归的方式将数据从一个对象复制到另一个对象。Dozer 支持简单属性映射、双向映射、隐式映射以及递归映射。使用该映射器可以很方便的在项目中进行 pojo、do、vo 之间的转换。 ## 导入依赖 ```xml <!-- https://mvnrepository.com/artifact/com.github.dozermapper/dozer-core --> <dependency> <groupId>com.github.dozermapper</groupId> <artifactId>dozer-core</artifactId> <version>6.5.0</version> </dependency> <!-- JAXB dependencies --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.3</version> <scope>runtime</scope> </dependency> ``` **注意:** JDK11默认不包含JAXB ## 基本使用 ```java // 创建两个DO @Data @NoArgsConstructor @AllArgsConstructor @Builder public class aDO { String id; String name; } @Data @NoArgsConstructor @AllArgsConstructor @Builder public class bDO { String id; String name; String description; } ``` 当`aDO`复制成`bDO`时,需要复制的变量名必须一致,否则为`null` ```java // 测试类 public class demo1 { public static void main(String[] args) { Mapper mapper = DozerBeanMapperBuilder.buildDefault(); aDO a = aDO.builder() .id("1") .name("a") .build(); bDO b = mapper.map(a, bDO.class); System.out.println(a); System.out.println(b); } } ``` ```bash // 输出 aDO(id=1, name=a) bDO(id=1, name=a, description=null) ``` ## 封装为BeanUtil工具类 ```java @NoArgsConstructor(access = lombok.AccessLevel.PRIVATE) public class BeanUtil { protected static Mapper BEAN_MAPPER_BUILDER; static { BEAN_MAPPER_BUILDER = DozerBeanMapperBuilder.buildDefault(); } /** * 属性复制 * * @param source 数据对象 * @param target 目标对象 * @param <T> * @param <S> * @return 转换后对象 */ public static <T, S> T convert(S source, T target) { Optional.ofNullable(source) .ifPresent(each -> BEAN_MAPPER_BUILDER.map(each, target)); return target; } /** * 复制单个对象 * * @param source 数据对象 * @param clazz 复制目标类型 * @param <T> * @param <S> * @return 转换后对象 */ public static <T, S> T convert(S source, Class<T> clazz) { return Optional.ofNullable(source) .map(each -> BEAN_MAPPER_BUILDER.map(each, clazz)) .orElse(null); } /** * 复制多个对象 * * @param sources 数据对象 * @param clazz 复制目标类型 * @param <T> * @param <S> * @return 转换后对象集合 */ public static <T, S> List<T> convert(List<S> sources, Class<T> clazz) { return Optional.ofNullable(sources) .map(each -> { List<T> targetList = new ArrayList<T>(each.size()); each.stream() .forEach(item -> targetList.add(BEAN_MAPPER_BUILDER.map(item, clazz))); return targetList; }) .orElse(null); } /** * 复制多个对象 * * @param sources 数据对象 * @param clazz 复制目标类型 * @param <T> * @param <S> * @return 转换后对象集合 */ public static <T, S> Set<T> convert(Set<S> sources, Class<T> clazz) { return Optional.ofNullable(sources) .map(each -> { Set<T> targetSize = new HashSet<T>(each.size()); each.stream() .forEach(item -> targetSize.add(BEAN_MAPPER_BUILDER.map(item, clazz))); return targetSize; }) .orElse(null); } /** * 复制多个对象 * * @param sources 数据对象 * @param clazz 复制目标类型 * @param <T> * @param <S> * @return 转换后对象集合 */ public static <T, S> T[] convert(S[] sources, Class<T> clazz) { return Optional.ofNullable(sources) .map(each -> { @SuppressWarnings("unchecked") T[] targetArray = (T[]) Array.newInstance(clazz, sources.length); for (int i = 0; i < targetArray.length; i++) { targetArray[i] = BEAN_MAPPER_BUILDER.map(sources[i], clazz); } return targetArray; }) .orElse(null); } /** * 拷贝非空且非空串属性 * * @param source 数据源 * @param target 指向源 */ public static void convertIgnoreNullAndBlank(Object source, Object target) { DozerBeanMapperBuilder dozerBeanMapperBuilder = DozerBeanMapperBuilder.create(); Mapper mapper = dozerBeanMapperBuilder.withMappingBuilders(new BeanMappingBuilder() { @Override protected void configure() { mapping(source.getClass(), target.getClass(), mapNull(false), mapEmptyString(false)); } }).build(); mapper.map(source, target); } /** * 拷贝非空属性 * * @param source 数据源 * @param target 指向源 */ public static void convertIgnoreNull(Object source, Object target) { DozerBeanMapperBuilder dozerBeanMapperBuilder = DozerBeanMapperBuilder.create(); Mapper mapper = dozerBeanMapperBuilder.withMappingBuilders(new BeanMappingBuilder() { @Override protected void configure() { mapping(source.getClass(), target.getClass(), mapNull(false)); } }).build(); mapper.map(source, target); } } ``` Last modification:January 1, 2024 © Allow specification reprint Like 0 如果觉得我的文章对你有用,请随意赞赏
Comment here is closed