网站首页 > java教程 正文
MapStruct解决的问题
在java分层架构中,会出现很多的POJO对象,如DO/DTO/BO/VO,在同一业务不同分层中的传输,或者不同业务中传输,常常需要相互转换。通常情况下,代码中需要大量的 convert类来实现不同领域中对象的转换,而MapStruct可以动态生成代码,来达到不同对象中的转换,而且还支持自定义转换。
DO(Data Object)对象
与数据库表结构一致的类结构,通过DAO层向上传递对象
BO(Business Object)业务对象
封装对象,复杂对象,用于服务层(Manager层)内部调用的对象。可以做业务运算。
DTO(Data Transfer Object)数据传输对象
前端(视图层)调用时传输。
VO 展示层对象
通常由DTO转换而成,而且两者的字段大多数时候是一致的。
一般情况下,DO转DTO,DTO转VO ,VO转DTO、DTO转DO
废话不多说,直接上代码。
Pom.xml
引入依赖,项目配置
mapstruct引入
<properties>
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
maven插件配置
这是动态生成代码的关键
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- depending on your project -->
<target>1.8</target> <!-- depending on your project -->
<annotationProcessorPaths>
<!--使用lombok的需要配置,不使用的,可以不用配置-->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
编写DO类
假设数据库中有一张user表,然后有字段user_name、phone、setting、create_time等
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String userName;
private String phone;
private String setting;
private Date createTime;
}
编写DTO类
假设dto对象中createTime字段需要的是时间戳
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserDto {
private String userName;
private String phone;
private Long createTime;
}
编写转换类Convert
@Mapper 是MapStruct提供的注解,@Mapping指定转换的方式。
@Mapper
public interface UserConvert {
UserConvert INSTANCE = Mappers.getMapper( UserConvert.class );
@Mapping(target = "createTime", expression = "java(user.getCreateTime().getTime())")
UserDto userToUserDto(User user);
}
编译
编译完成后,会对UserConvert生成其实现类,在target目录中,如下:
public class UserConvertImpl implements UserConvert {
public UserConvertImpl() {
}
public UserDto userToUserDto(User user) {
if (user == null) {
return null;
} else {
UserDto userDto = new UserDto();
userDto.setUserName(user.getUserName());
userDto.setPhone(user.getPhone());
userDto.setCreateTime(user.getCreateTime().getTime());
return userDto;
}
}
}
测试使用
public static void main(String[] args) {
User user = new User("name", "18899999999", "{}", new Date());
UserDto userDto = UserConvert.INSTANCE.userToUserDto(user);
System.out.println(userDto);
}
代码输出
UserDto(userName=name, phone=18899999999, createTime=1638076270281)
说明我们的转换生效了。
总结
- 本文只是入门学习了MapStruct,需要进一步学习的同学可以到MapStruct中学习,链接:https://mapstruct.org/
- 优点是:代码简洁,可以方便快速避免很多重复的代码。有的时候getter/setter多了会导致手误把属性复制错,这样就不会有这种问题。
本文对MapStruct进行了简单的介绍,如果有不对的地方,还请读者指出。
猜你喜欢
- 2024-10-03 SpringBoot中如何根据JSON数据生成一个动态对象?
- 2024-10-03 边玩手机边学Java----Java基础之Map
- 2024-10-03 Java Stream API:优雅地操作Map(java map stream filter)
- 2024-10-03 聊聊Mybatis的初始化之Mapper.xml映射文件的解析
- 2024-10-03 MapStruct 使用教程, 万字详解(mapstruct enum)
- 2024-10-03 看似简单,在JAVA中如何将一个Object转换成Array
- 2024-10-03 java8函数式Map操作也太强大了吧,1次就帮我省了10多行代码
- 2024-10-03 map的一个骚操作!你学废了么?#互联网
- 2024-10-03 轻松搞定!用JavaScript将列表转换为Map
- 2024-10-03 告别 BeanUtils,拥抱 MapStruct:高效 Java 对象映射的经典之选
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)