每天坚持写一篇原创文章。
使用过MapStruct之后,再也没用过BeanCopy来复制对象了。确实是非常好用的工具库。
MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性都是相同的,只有少部分的不同,通过mapStruct,可以让不同实体之间的转换变的简单。我们只需要按照约定的方式进行配置即可。
大家的命名都不一样,我个人是习惯把数据库的DO对象叫Entity实体。
返回前端的叫VO。
把Entity复制到VO并做一些操作或者转换,再返回前端,都会用到。
安装
1、引用
唯一需要注意的就是如果配合Lombok,需要在编译源码的插件上做好配置。
1.3.0.Final
org.mapstruct
mapstruct
${mapstruct.version}
org.apache.maven.plugins
maven-compiler-plugin
${maven.compiler-plugin.version}
${java.version}
${java.version}
${java.version}
true
${project.build.sourceEncoding}
true
or服务器托管网g.projectlombok
lombok
${lombok.version}
org.mapstruct
mapstruct-processor
${mapstruct.version}
2、定义转换接口
@Mapper
public interface OrderConvertor {
OrderConvertor INSTANCE = Mappers.getMapper(OrderConvertor.class);
@Mapping(source = "student.birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss") // 指定时间格式
@Mapping(target = "name", source = "student.name", defaultValue = "张三") //默认值
OrderVo toVo(OrderEntity order);
}
target表示目标属性名,source表示源属性名,一般在目标属性和源属性不同时使用,相同的属性名会自动进行映射。
MapStruct会自动生成对应接口的实现,并自动完成属性映射关系,List会自动进行批量处理。
3、使用时
@Service
public class OrderService {
public List getOrderList() {
// 获取数据库数据
List result = selectOrderList();
// 参数转换
return OrderConvertor.INSTANCE.toVo(result);
}
}
下面是我常用的一些功能记录
1、添加为Spring的Component组件
@Mapper(componentModel = "spring")
2、List转换为String
类注解加上引用
@Mapper(imports = {Collectors.class, Tel服务器托管网egramGroupEntity.class})
代码里面:使用表达式,转换为字符串
@Mapping(target = "groupStr", expression = "java(source.getBindGroups()!= null? source.getBindGroups().stream().map(TelegramGroupEntity::getName).collect(Collectors.joining(", ")) : null)")
AcceptanceBankVo convert(AcceptanceBankEntity source);
直接转换List为换行的String
@Mapping(target = "groupStr", expression = "java(source.getBindGroups()!= null? source.getBindGroups().stream().map(TelegramGroupEntity::getName).collect(Collectors.joining("n")) : null)")
直接调用方法
@Mapper(imports = {Collectors.class, TelegramGroupEntity.class, IndiaDateUtil.class})
public interface TransferBankConvert {
TransferBankConvert INSTANCE = Mappers.getMapper(TransferBankConvert.class);
@Mapping(target = "timeAgo", expression = "java(source.getLastActiveTime()!= null? IndiaDateUtil.getTimeAgo(source.getLastActiveTime(),"Asia/Kolkata") : null)")
TransferBankVo convert(TransferBankEntity source);
}
3、获取时间
@Mapping(target = "recordTime",expression = "java(new java.util.Date())")
4、空检查
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
5、枚举映射String和string到枚举
int转枚举的value
@Mapper(imports = {AccptanceRoleTypeEnum.class}) // 加到类上引用进来
@Mapping(target = "roleText", expression = "java(AccptanceRoleTypeEnum.getItemValue(source.getRole()))")
枚举上加上:
/**
* 根据Value取描述
* @param value
* @return
*/
public static String getItemValue(Integer value) {
AccptanceRoleTypeEnum match = Stream.of(values()).filter(item -> item.value.equals(value)).findAny().orElse(null);
return match == null ? null : match.getDesc();
}
6、Fill同对象填充新对象,把source填充到target里面,和以前的beancopy一样的。
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
@Mappings({
@Mapping(target = "id", ignore = true),
@Mapping(target = "createTime", ignore = true),
@Mapping(target = "updateTime", ignore = true)
})
void fill(TelegramGroupRoleEntity source, @MappingTarget TelegramGroupRoleEntity target);
要忽略空值填充
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void update(DTO dto, @MappingTarget Bean bean);
7、Map提取,还是用表达式最简单
@Mappings({
@Mapping(expression = "java(mapConfig.getOrDefault("INPAY_RATES",""))", target = "inpayRates"),
@Mapping(expression = "java(mapConfig.getOrDefault("AUTO_CREDIT",""))", target = "autoCredit")
})
TelegramGroupWithConfigVo convert(TelegramGroupEntity entity);
8、空值判断
@Mapping(target = "targetField", expression = "java( sourceField == null || sourceField.isEmpty() ? null : sourceField )") 来将空字符串映射为 null
更多内容请关注我的公众号:青塬科技。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
最近的项目用spark做离线计算,所以有用到一些操作,简单笔记一下 1.Dataset纵向复制数据 当一个dataset中数据量太少,不能有效的随机联查别的dataset时,需要将数据纵向复制,把数据量撑起来。可以采用两种方式: 第一种: userDatase…