别再用 BeanUtils 了,这款 PO VO DTO 转换神器不香么?

Nginx 常用配置清单

这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。

来源:toutiao.com/i6891531055631696395

老铁们是不是经常为写一些实体转换的原始代码感到头疼,尤其是实体字段特别多的时候。介绍一个开源项目 mapstruct ,可以轻松优雅的进行转换,简化你的代码。

当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思路。

先贴下官网地址吧:https://mapstruct.org/

废话不多说,上代码:

pom 配置:

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

<org.mapstruct.version>1.4.1.Final</org.mapstruct.version>

<org.projectlombok.version>1.18.12</org.projectlombok.version>

org.mapstruct

mapstruct

${org.mapstruct.version}

org.projectlombok

lombok

${org.projectlombok.version}

provided

org.mapstruct

mapstruct-processor

${org.mapstruct.version}

provided

org.apache.maven.plugins

maven-compiler-plugin

3.8.1

1.8

1.8

org.projectlombok

lombok

${org.projectlombok.version}

org.mapstruct

mapstruct-processor

${org.mapstruct.version}

关于lombok和mapstruct的版本兼容问题多说几句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外编译的lombok mapstruct的插件不要忘了加上。否则会出现下面的错误:No property named "aaa" exists in source parameter(s). Did you mean "null"?

这种异常就是lombok编译异常导致缺少get setter方法造成的。还有就是缺少构造函数也会抛异常。学习资料:Java进阶视频资源

@Data

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class Student {

private String name;

private int age;

private GenderEnum gender;

private Double height;

private Date birthday;

}

public enum GenderEnum {

Male(“1”, “男”),

Female(“0”, “女”);

private String code;

private String name;

public String getCode() {

return this.code;

}

public String getName() {

return this.name;

}

GenderEnum(String code, String name) {

this.code = code;

this.name = name;

}

}

@Data

@Builder

@AllArgsConstructor

@NoArgsConstructor

public class StudentVO {

private String name;

private int age;

private String gender;

private Double height;

private String birthday;

}

@Mapper

public interface StudentMapper {

StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);

@Mapping(source = “gender.name”, target = “gender”)

@Mapping(source = “birthday”, target = “birthday”, dateFormat = “yyyy-MM-dd HH:mm:ss”)

StudentVO student2StudentVO(Student student);

}

实体类是开发过程少不了的,就算是用工具生成肯定也是要有的,需要手写的部分就是这个Mapper的接口,编译完成后会自动生成相应的实现类

d6675eff9a716c7272993999c6d1b75e.png

然后就可以直接用mapper进行实体的转换了

public class Test {

public static void main(String[] args) {

Student student = Student.builder().name(“小明”).age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();

System.out.println(student);

//这行代码便是实际要用的代码

StudentVO studentVO = StudentMapper.INSTANCE.student2StudentVO(student);

System.out.println(studentVO);

}

}

b09d9eba3b043d18375e6a315a4b017f.png

mapper可以进行字段映射,改变字段类型,指定格式化的方式,包括一些日期的默认处理。

可以手动指定格式化的方法:

@Mapper

public interface StudentMapper {

StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);

@Mapping(source = “gender”, target = “gender”)

@Mapping(source = “birthday”, target = “birthday”, dateFormat = “yyyy-MM-dd HH:mm:ss”)

StudentVO student2StudentVO(Student student);

default String getGenderName(GenderEnum gender) {

return gender.getName();

}

}

上面只是最简单的实体映射处理,下面介绍一些高级用法

1.List 转换

属性映射基于上面的mapping配置

@Mapper

public interface StudentMapper {

StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);

@Mapping(source = “gender.name”, target = “gender”)

@Mapping(source = “birthday”, target = “birthday”, dateFormat = “yyyy-MM-dd HH:mm:ss”)

StudentVO student2StudentVO(Student student);

List students2StudentVOs(List studentList);

}

public static void main(String[] args) {

Student student = Student.builder().name(“小明”).age(6).gender(GenderEnum.Male).height(121.1).birthday(new Date()).build();

List l

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

ist = new ArrayList<>();

list.add(student);

List result = StudentMapper.INSTANCE.students2StudentVOs(list);

System.out.println(result);

}

fdecbc393a7f2ab3d437435e7220cfa5.png

2.多对象转换到一个对象

@Data

@Builder

@AllArgsConstructor

@NoArgsConstructor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值