MapStruct

  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  • DTO(Data Transfer Object):数据传输对象,这个概念来源于 J2EE 的设计模式,原来的目的是为了 EJB 的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
  • BO(Business Object):业务对象, 由 Service 层输出的封装业务逻辑的对象。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应 PO 的一个(或若干个)属性。

vo-dto-bo-po.png

示例

User

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* User
*
* @author <a href ='jxh98@foxmail.com'>Josway</a>
* @date 2020/8/28
* @since JDK 1.8
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private Integer age;
private String gender;
}

Person

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
* Person
*
* @author <a href ='jxh98@foxmail.com'>Josway</a>
* @date 2020/8/28
* @since JDK 1.8
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Person {
private Long id;
private String name;
private String email;
private Date birthday;
private User user;
}

PersonDTO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
* PersonDTO
*
* @author <a href ='jxh98@foxmail.com'>Josway</a>
* @date 2020/8/28
* @since JDK 1.8
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
public class PersonDTO {
private Long id;
private String name;
/**
* 对应 Person.user.age
*/
private Integer age;
/**
* 对应 Person.user.gender
*/
private String gender;
private String email;
/**
* 与 DO 里面的字段名称(birthDay)不一致
*/
private Date birth;
/**
* 对 DO 里面的字段(birthDay)进行拓展,dateFormat 的形式
*/
private String birthDateFormat;
/**
* 对 DO 里面的字段(birthDay)进行拓展,expression 的形式
*/
private String birthExpressionFormat;

}

PersonConverter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
* PersonConverter
*
* @author <a href ='jxh98@foxmail.com'>Josway</a>
* @date 2020/8/28
* @since JDK 1.8
*/
@Mapper
public interface PersonConverter {

PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);

@Mappings({
@Mapping(source = "birthday", target = "birth"),
@Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),\"yyyy-MM-dd HH:mm:ss\"))"),
@Mapping(source = "user.age", target = "age"),
@Mapping(source = "user.gender", target = "gender"),
@Mapping(target = "email", ignore = true)
})
PersonDTO domain2dto(Person person);

List<PersonDTO> domain2dto(List<Person> people);
}

参考

https://mapstruct.org/
https://juejin.im/post/6844904046097072141
https://juejin.im/entry/6844903620874338317
https://www.jianshu.com/p/3f20ca1a93b0


MapStruct
https://blog.josway.cc/2022/04/25/yuque/MapStruct/
作者
JOSWAY
发布于
2022年4月25日
许可协议