我们先看看前面的部分代码
@Override
public UserDto getUserById(Integer userId) {
User user = userDaoService.getById(userId);
UserDto userDto = new UserDto();
BeanUtils.copyProperties(user, userDto);
return userDto;
}
我们上面代码里面可以看到,处理参数和返回参数都要经过不同的转换,这里面看似乎增加了不少工作量,主要是测试案例写的比较简单,真实场景中,如果你不区分,就有可能引起各种问题,如信息泄露等。所以定义了不同的层次,当然,根据需要选择。
DO
:data object
,一般指实体对象,可以省略,如UserDO
或User
均可DTO
:data transfer object
,数据传输对象,VO
:view object
,视图对象,一般用来请求或返回参数,如XXXreqVO
,XXXRespVO
等BO
:Business object
,业务对象,用的不是很多,可选择使用
另外,上面我们使用了spring
的BeanUtils.copyProperties
来拷贝对象,但是这不是完全的深拷贝,我们可以用mapstruct
来实现深拷贝
1.添加依赖包
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>
注意,我们引入了lombok,要保证lombok的位置在mapstruct前面。
2.添加转换接口类,可以按照不同业务写多个接口,加上注解org.mapstruct.Mapper
,注意注解的路径
package com.fang.convert;
import com.fang.domain.User;
import com.fang.model.dto.UserDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
import java.util.List;
@Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE)
public interface UserConvert {
User userDto2User(UserDto userDto);
UserDto user2UserDto(User user);
List<UserDto> user2UserDtoList(List<User> userList);
}
3.修改UserService
方法
修改之前的方法
@Override
public UserDto getUserById(Integer userId) {
User user = userDaoService.getById(userId);
UserDto userDto = new UserDto();
BeanUtils.copyProperties(user, userDto);
return userDto;
}
@Override
public void saveUser(UserDto userdto) {
User user = new User();
BeanUtils.copyProperties(userdto, user);
userDaoService.save(user);
}
@Override
public List<UserDto> listUsers() {
List<User> list = userDaoService.list();
List<UserDto> restList = new ArrayList<>();
for (User user : list) {
UserDto userDto = new UserDto();
BeanUtils.copyProperties(user, userDto);
restList.add(userDto);
}
return restList;
}
修改之后的方法
private UserConvert userConvert = Mappers.getMapper(UserConvert.class);
private UserConvert userConvert = Mappers.getMapper(UserConvert.class);
@Override
public UserDto getUserById(Integer userId) {
User user = userDaoService.getById(userId);
UserDto userDto = userConvert.user2UserDto(user);
return userDto;
}
@Override
public void saveUser(UserDto userdto) {
User user = userConvert.userDto2User(userdto);
userDaoService.save(user);
}
@Override
public List<UserDto> listUsers() {
List<User> list = userDaoService.list();
List<UserDto> restList = userConvert.user2UserDtoList(list);
return restList;
}
这上面只是简单的参数相同和集合映射的例子,mapstruct
还支持不同字段映射
不同字段映射
@Mapping(source = "userNo", target = "userNo")
UserDto user2UserDto(User userDto);
好了,上面就是基本用法了,至于更复杂的用法,推荐查看官网案例。