0
点赞
收藏
分享

微信扫一扫

二、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

/**
* 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);
}


举报

相关推荐

0 条评论