首先来了解一下DTO,DTO简单的理解就是做数据传输对象的,类似于VO,但是VO用于传输到前端。
1.MapStruct是用来做什么的?
现在有这么个场景,从数据库查询出来了一个user对象(包含id,用户名,密码,手机号,邮箱,角色这些字段)和一个对应的角色对象role(包含id,角色名,角色描述这些字段),现在在controller需要用到user对象的id,用户名,和角色对象的角色名三个属性。一种方式是直接把两个对象传递到controller层,但是这样会多出很多没用的属性。更通用的方式是需要用到的属性封装成一个类(DTO),通过传输这个类的实例来完成数据传输。
2 依赖
<dependency>
<groupId>org.mapstruct</groupId>
<!-- jdk8以下就使用mapstruct -->
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
User.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String password;
private String phoneNum;
private String email;
}
UserRoleDto.java,这个类就是封装的类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserRoleDto {
/**
* 用户id
*/
private Long userId;
/**
* 用户名
*/
private String name;
/**
* 角色名
*/
}
3 新建一个UserRoleMapper.java,这个来用来定义User.java和UserRoleDto.java之间属性对应规则:
UserRoleMapper.java
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
@Mapper
public interface UserRoleMapper {
/**
* 获取该类自动生成的实现类的实例
* 接口中的属性都是 public static final 的 方法都是public abstract的
*/
UserRoleMapper INSTANCES = Mappers.getMapper(UserRoleMapper.class);
/**
* 这个方法就是用于实现对象属性复制的方法
*
* @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性
*
* @param user 这个参数就是源对象,也就是需要被复制的对象
* @return 返回的是目标对象,就是最终的结果对象
*/
@Mappings({
@Mapping(source = "id", target = "userId"),
@Mapping(source = "username", target = "name"),
})
// User ------>UserRoleDto
UserRoleDto toUserRoleDto(User user);
@Mappings({
@Mapping(source = "userId", target = "id"),
@Mapping(source = "name", target = "username"),
})
// UserRoleDto ------>User
User toUserRoleDto1111(UserRoleDto user);
}
4 测试
public static void main(String[] args) {
User user = new User();
user.setId(112224L);
user.setUsername("aa");
UserRoleDto userRoleDto = UserRoleMapper.INSTANCES.toUserRoleDto(user);
System.out.println("User ------>UserRoleDto ");
System.out.println(userRoleDto);
UserRoleDto userRoleDto1 = new UserRoleDto();
userRoleDto1.setName("bbb");
userRoleDto1.setUserId(232L);
User user1 = UserRoleMapper.INSTANCES.toUserRoleDto1111(userRoleDto1);
System.out.println("UserRoleDto ------>User ");
System.out.println(user1);
}
输出结果:
User ------>UserRoleDto
UserRoleDto(userId=112224, name=aa)
UserRoleDto ------>User
User(id=232, username=bbb, password=null, phoneNum=null, email=null)