Java 实体类转为DTO、VO几种方式介绍

本文探讨了Java中BeanUtil.copyProperties、原始的get&set方式、ModelMapper、MapStruct以及Lombok的toBuilder在对象拷贝中的应用,强调了它们的优缺点,推荐ModelMapper和MapStruct,尤其是MapStruct由于性能和编译时检查的优点。
摘要由CSDN通过智能技术生成

一、bean拷贝BeanUtil.copyProperties

BaseChangeYear year = new BaseChangeYear();
year.setName("测试");
year.setType(1);
ChangeYearVo vo = new ChangeYearVo();
BeanUtil.copyProperties(year, vo);

注意事项:hutool包版本为5.7.2一下没有问题,如果以上版本,两个类中的字段名一样类型不一样会出现问题

二、原始的get、set方式

BaseChangeYear year = new BaseChangeYear();
year.setName("测试");
year.setType(1);
ChangeYearVo vo = new ChangeYearVo();
vo.setName(year.getName());
vo.setType(year.getType());

注意事项:字段少的时候可以使用,如果实体类字段太多就很麻烦,而且影响代码阅读体验

IDEA插件推荐:Bean Converter ,这个插件可以快速生成get set 减少工作量

三、开源库ModelMapper

pom.xml引入依赖

<!-- https://mvnrepository.com/artifact/org.modelmapper/modelmapper -->
<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>3.2.0</version>
</dependency>
BaseChangeYear year =   new BaseChangeYear();
year.setLandTypeName("测试");
year.setAreaPreCode("03210091");
ModelMapper modelMapper = new ModelMapper();
ChangeYearVo vo = modelMapper.map(year, ChangeYearVo.class);
//当只转化一次的时候简化写法
ChangeYearVo vo = new ModelMapper().map(year, ChangeYearVo.class);

注意事项:该库底层使用的是反射实现的映射,自持自定义映射规则

四、开源库MapStruct

pom.xml引入依赖

<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version>
</dependency>
//创建映射接口
@Mapper
public interface BaseChangeYearMapperStruct{
    BaseChangeYearMapperStruct INSTANCE = Mappers.getMapper(BaseChangeYearMapperStruct.class);
    ChangeYearVo toVo(BaseChangeYear year);
}
//使用
BaseChangeYear year =   new BaseChangeYear();
year.setLandTypeName("测试");
year.setAreaPreCode("03210091");
ModelMapper modelMapper = new ModelMapper();
ChangeYearVo vo = BaseChangeYearMapperStruct.INSTANCE.toVo(year);

注意事项:MapStruct是在编译阶段生成对应映射文件,所以有映射问题可以在编译阶段发现,同时也要注意如果实体类增加字段之后没有清除对应的映射文件,新增的字段不会映射到就不会有值。

五、IDEA插件lombok的toBuilder功能(局限)

//实体类
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "BaseChangeYear对象", description = "年度变更表")
public class BaseChangeYear implements Serializable {
    @ApiModelProperty(value = "地类名称")
    private String landTypeName;
    
    @ApiModelProperty(value = "图斑预编号")
    private String areaPreCode;
}
//使用代码
BaseChangeYear year =   new BaseChangeYear();
year.setLandTypeName("测试");
year.setAreaPreCode("03210091");
BaseChangeYear build = year.toBuilder().build();
//如果需要更改某个字段值
BaseChangeYear build = year.toBuilder().landTypeName("变更").build();

注意事项:该方法只适用一个实体类对象拷贝另一个对象,实体类为同一个。

使用@Builder(toBuilder = true)注解

同时需要加上

@AllArgsConstructor
@NoArgsConstructor

如果实体类有父类,父类需要增加

@SuperBuilder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor

代码入侵太高不推荐使用

六、总结

以上方法中推荐使用ModelMapper和MapStruct,MapStruct性能更好,但是需要创建接口,如果开发时间宽松推荐。

注意:以上方法均为深拷贝

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实体类(Entity)是指在领域模型中表示具体业务对象的类,它通常包含了业务逻辑和持久化状态的方法。在软件开发中,实体类一般与数据库中的表相对应。 VO(Value Object)是值对象的缩写,它是一种不可变的对象,用于封装一组相关的数据。VO对象通常用于数据传输和展示层,用于将数据从一个组件传递到另一个组件,它包含了一些属性和相关的getter和setter方法。 DTO(Data Transfer Object)是数据传输对象的缩写,它用于在不同层之间传输数据。DTO对象通常包含了多个属性,用于将数据从一个层传输到另一个层,它可以通过序列化和反序列化来实现数据的传输。 区别: 1. 定位不同:实体类用于表示具体业务对象,在领域模型中具有业务逻辑;VO用于封装数据用于传输和展示;DTO用于在不同层之间进行数据传输。 2. 可变性:实体类通常具有可变性,因为它包含了业务逻辑和状态的改变;VO通常是不可变的,因为它只用于封装数据;DTO可以是可变或不可变的,根据具体需求而定。 3. 方法:实体类通常包含了业务逻辑和持久化状态的方法;VO通常只包含了属性和相关的getter和setter方法;DTO通常只包含了属性和相关的getter和setter方法,用于数据传输。 需要注意的是,实际使用中,实体类VODTO的定义和使用可能会有一些差异,具体要根据项目需求和开发规范来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值