map怎么转化dto_使用Orika实现DO与DTO的互转

本文提供了一个利用OrikaUtil进行DO与DTO之间转换的示例,包括UserDO到UserDTO的转换,以及转换中特殊字段映射的处理。通过单元测试展示了转换的正确性。
摘要由CSDN通过智能技术生成

使用OrikaUtil实现DO与DTO的互转

本文主要讲些什么呢

orika是什么?orika的优缺点? orika怎么集成?

No No No !!!

想看这些东西的请往这边走 --> Orika Orika Orika Orika

这些东西网上太多了,随便查一下就有了,在这里主要就是提供一个Util类的代码。

看到这里,有同学就要开始问了,上面那些都看完之后写个Util那还不是信手捏来?

是的,你说的都对。

解决的主要问题

这里主要是提供一种思路。比如你需要在DO和DTO间实现互转,但是他们之间又有些不太一样的东西。

比如:UserDO转成UserDTO时,需要将UserDO的id赋值给UserDTO的userId,或者转回来的时候userId要赋值给id。

在这里又有秀儿要说话了 手动set一下不就ok了吗?

是的,你说的都对。

先看看单元测试的效果吧。好用不好用一看就知道 (#.#)

@Slf4j

public class OrikaUtilTest {

@Test

public void convert() {

UserDO userDO = new UserDO();

userDO.setId(100L);

userDO.setName("test");

log.info("userDO :{}",userDO);

//userDO :OrikaUtilTest.UserDO(id=100, name=test)

UserDTO userDTO = OrikaUtil.convert(userDO,UserDTO.class);

log.info("userDTO :{}",userDTO);

//userDTO :OrikaUtilTest.UserDTO(userId=100, name=test)

UserDO userDO1 = OrikaUtil.convert(userDTO,UserDO.class);

log.info("userDO1 :{}",userDO1);

//userDO1 :OrikaUtilTest.UserDO(id=100, name=test)

}

@Data

static

class UserDO extends BaseDO {

private Long id;

private String name;

}

@Data

static

class UserDTO{

private Long userId;

private String name;

}

}

Talk is cheap, show me the code

都看到这里来了,说明你肯定跟我一样,够懒的。 (〃''〃)

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import lombok.experimental.UtilityClass;

import lombok.extern.slf4j.Slf4j;

import ma.glasnost.orika.MapperFactory;

import ma.glasnost.orika.MappingContext;

import ma.glasnost.orika.MappingException;

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 org.apache.commons.lang3.time.DateUtils;

import org.apache.commons.lang3.time.FastDateFormat;

import java.math.BigDecimal;

import java.text.ParseException;

import java.util.Date;

/**

* @author onlinever

*/

@Slf4j

@UtilityClass

public class OrikaUtil {

private final MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();

private final String entitySuffix = "DO";

static {

mapperFactory.getConverterFactory().registerConverter(new UtilDateConverter());

mapperFactory.getConverterFactory().registerConverter(new BigDecimalConverter());

}

public T convert(R source, Class targetClass) {

if(mapperFactory.existsRegisteredMapper(TypeFactory. valueOf(source.getClass()), TypeFactory.valueOf(targetClass), false)){

return mapperFactory.getMapperFacade().map(source, targetClass);

}

ClassMapBuilder, T> builder = mapperFactory.classMap(source.getClass(), targetClass);

if (source instanceof BaseDO) {

try {

builder = builder.field("id", StringUtils.firstCharToLower(source.getClass().getSimpleName().replaceAll(entitySuffix, "Id")));

} catch (MappingException e) {

// do nothing

}

}

if (BaseDO.class.equals(targetClass.getSuperclass())) {

try {

builder = builder.field(StringUtils.firstCharToLower(targetClass.getSimpleName().replaceAll(entitySuffix, "Id")), "id");

} catch (MappingException e) {

// do nothing

}

}

builder.byDefault().register();

return mapperFactory.getMapperFacade().map(source, targetClass);

}

private class UtilDateConverter extends BidirectionalConverter {

public static final FastDateFormat DEFAULT_FAST_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

@Override

public String convertTo(Date source, Type destinationType, MappingContext context) {

return DEFAULT_FAST_DATE_FORMAT.format(source);

}

@Override

public Date convertFrom(String source, Type destinationType, MappingContext context) {

try {

return DateUtils.parseDate(source, "yyyy-MM-dd HH:mm:ss");

} catch (final ParseException e) {

log.error("[OrikaUtil] Exception ", e);

throw new RuntimeException(e);

}

}

}

private class BigDecimalConverter extends BidirectionalConverter {

@Override

public String convertTo(BigDecimal source, Type destinationType, MappingContext context) {

return source.toString();

}

@Override

public BigDecimal convertFrom(String source, Type destinationType, MappingContext context) {

return new BigDecimal(source);

}

}

}

Emmm... 既然你都看到这里了,干脆点个赞再走呗 ╮(╯﹏╰)╭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值