关于SpringBoot中使用mapstruct插件实现复杂的对象映射

我们都知道,随着一个工程的越来越成熟,模块划分会越来越细,其中实体类一般存于 domain 之中,但 domain 工程最好不要被其他工程依赖,所以其他工程想获取实体类数据时就需要在各自工程写 model,自定义 model 可以根据自身业务需要映射相应的实体属性。如此,便比较复杂,使用mapstruct插件用来处理 domin 实体类与 model 类的属性映射的,我们只需定义 mapper 接口,mapstruct 在编译的时候就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现。

  1. 准备工作,导入依赖
   <dependency>
        <groupId>org.mapstruct</groupId>
        <!-- jdk8以下就使用mapstruct -->
        <artifactId>mapstruct-jdk8</artifactId>
        <version>1.2.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.2.0.Final</version>
    </dependency>

2、创建实体类UserVo和User

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVo {
    private Integer id;
    private String name;
    private String createTime;
}

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
     //声明当前私有属性为主键
    @Id 
    //配置主键的生成策略【主键由数据库自动生成(主要是自动增长型,底层数据库支持的自动增长方式,如mysql支持)】
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id;
    private String name;
    private String createTime;
    private LocalDateTime updateTime;
}

观察发现:User对象【实际开发中可看作pojo】比UserVo【比如前端需要的数据】多了一个属性updateTime!我这里的ORM框架使用的Soring Data JPA ,调用中的findAll()是不能直接使用UserVo作为查询结果集映射对象的【Mybatis可以根据自定义返回自己想要的对象,指定属性与字段匹配即可!】,但是我们的需求只需要返回UserVo对象即可,不用返回updateTime的数据值!解决的方法有三种:
【1】在UserRespority中自定义查询方法,自定义SQL返回指定的字段!(不喜欢写SQL)
【2】使用BeanUtils中的方法也可以把User对象映射到UserVo!(反射机制:效率低、不能集合映射)
【3】第三种就是今天的主角mapstruct插件!

3、定义UserCovertBasic接口

@Mapper(componentModel = "spring")
public interface UserCovertBasic {

   /**
    * 让客户端可以访问 Mapper 接口的实现
    */
    UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class);

   /**
    * pojo实体类转换vo实体类
    */
	UserVo toConvertVO(User source);
	
   /**
    * vo实体类转换pojo实体类
    */
	User fromConvertEntity(UserVo userVO);
	
   /**
    * pojo实体类集合转换vo实体类集合
    */
    List toConvertVOList(List source);
    
}

4、客户端如何使用

UserVo userVo = UserCovertBasic .INSTANCE .toConvertVO(new User());

User user = UserCovertBasic .INSTANCE.fromConvertEntity(new UserVo);

List userVoList =  UserCovertBasic .INSTANCE.toConvertVOList(List);

结论:简单高效,对于mapstruct的使用就说到这里,有些特殊的类型比如日期,枚举或者vo和pojo的属性名称不一致/属性类型不一致等情况可以留言或者自行百度解决!

你可能感兴趣的:(SpringBoot)