二、SpringBoot 整合 Mapstuct

(一)为什么用?

   apache-beanutils 可以实现对象拷贝,但是其对一些深层次对象拷贝做不到,虽然可以通过改写其内部源码实现对嵌套对象属性拷贝,但是出现特殊业务转换,如 属性名字不匹配,beanutils对于mapstruct就相形见绌了。

(2)怎么用

1、添加依赖

		<!-- Mapstruct PO 和 DTO 转换工具 -->
		<dependency>
			<groupId>org.mapstruct</groupId>
			<artifactId>mapstruct</artifactId>
			<version>1.2.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.mapstruct</groupId>
			<artifactId>mapstruct-processor</artifactId>
			<version>1.2.0.Final</version>
			<scope>provided</scope>
		</dependency>
		<!-- 案例中需要用到的工具类 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
		</dependency>

2、准备 POJO 和 DTO

User

@Data
@NoArgsConstructor
public class User implements Serializable {
    private BigInteger id;
    private String name;
    private Integer age;
    private Date birthdate;
    private float wallet;
}

UserDto

@Data
@NoArgsConstructor
public class UserDto {
    private String name;
    private Integer age;
    //与po对象属性名不一致
    private Date birth;
    private float wallet;
    //通过po对象的某一属性扩展
    private String birthformat;
}

3、编写转换接口

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import org.pc.mongodb.dto.UserDto;
import org.pc.mongodb.entity.User;

import java.util.List;

/**
 * @author 咸鱼
 * @date 2018/12/13 19:59
 */
@Mapper
public interface User2UserDto {
    User2UserDto MAPPER = Mappers.getMapper(User2UserDto.class);

    /**
     * POJO 转 DTO
     * 备注:只有属性名不一样的才需要单独写出来
     */
    @Mappings({
            @Mapping(target = "birth", source = "birthdate"),
            @Mapping(target = "birthformat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(user.getBirthdate(),\"yyyy-MM-dd HH:mm:ss\"))")
    })
    UserDto userToUserDto(User user);

    /**
     * 集合转集合
     */
    List<UserDto> usersToUserDtos(List<User> users);
}

(1) POJO 转 DTO

 /**
     * POJO 转 DTO
     * 备注:只有属性名不一样的才需要单独写出来
     */
    @Mappings({
            @Mapping(target = "birth", source = "birthdate"),
            @Mapping(target = "birthformat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(user.getBirthdate(),\"yyyy-MM-dd HH:mm:ss\"))")
    })
    UserDto userToUserDto(User user);

    /**
     * POJO集合 转 DTO集合
     */
    List<UserDto> usersToUserDtos(List<User> users);

验证:

public class Demo {
    public static void main(String[] args) {
        User user = new User();
        user.setId(BigInteger.valueOf(1));
        user.setName("pc");
        user.setAge(25);
        user.setBirthdate(new Date());
        user.setWallet(1.3467f);
        
        UserDto userDto = User2UserDto.MAPPER.userToUserDto(user);
        System.out.println(userDto);
    }
}

(2)DTO 转 POJO

扫描二维码关注公众号,回复: 4715589 查看本文章
	/**
     * DTO  转 POJO
     */
    @InheritInverseConfiguration
    User userDtoToUser(UserDto userDto);

(3)自定义转义

  自定义特殊转义,比如对于 float 类型,四舍五入,保留两位小数

public class MapStructUtils {
    /**
     * 四舍五入,保留2位小数
     */
    public float asFloat(float inputFloat){
        BigDecimal bigDecimal = new BigDecimal(inputFloat + "");
        return bigDecimal.setScale(2, RoundingMode.HALF_UP).floatValue();
    }
}

mapper上面添加注解

//uses = MapStructUtils.class:会将所有的浮点数,四舍五入,保留2位小数
@Mapper(uses = MapStructUtils.class)
public interface User2UserDto {
...
}

(4)map 映射

 @MapMapping(valueDateFormat ="yyyy-MM-dd HH:mm:ss")
 public Map<String ,String> DateMapToStringMap(Map<String,Date> sourceMap);

验证

 public void mapMappingTest(){
        Map<String,Date> map=new HashMap<>();
        map.put("key1",new Date());
        map.put("key2",new Date(new Date().getTime()+9800000));
        Map<String, String> stringObjectMap = Person2PersonVoMapper.MAPPER.DateMapToStringMap(map);
    }

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/84994842