一、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性能更好,但是需要创建接口,如果开发时间宽松推荐。
注意:以上方法均为深拷贝