Bootstrap

MapStruct参数拷贝

我们先看看前面的部分代码

@Override
public UserDto getUserById(Integer userId) {
    User user = userDaoService.getById(userId);
    UserDto userDto = new UserDto();
    BeanUtils.copyProperties(user, userDto);
    return userDto;
}

我们上面代码里面可以看到,处理参数和返回参数都要经过不同的转换,这里面看似乎增加了不少工作量,主要是测试案例写的比较简单,真实场景中,如果你不区分,就有可能引起各种问题,如信息泄露等。所以定义了不同的层次,当然,根据需要选择。

  • DOdata object,一般指实体对象,可以省略,如UserDO 或User均可
  • DTOdata transfer object,数据传输对象,
  • VOview object,视图对象,一般用来请求或返回参数,如XXXreqVOXXXRespVO
  • BOBusiness object,业务对象,用的不是很多,可选择使用

另外,上面我们使用了springBeanUtils.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);

好了,上面就是基本用法了,至于更复杂的用法,推荐查看官网案例。

;