MapStruct基本使用 以及MapStruct使用时出现得问题


一、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.使用思路

1. 创建一个接口 并且定义转换规则 (核心)

2.将接口交给Sping容器管理 通过@Autowire 等注解实现依赖注入

3.调用j接口中对应的转换方法

MapStruct会自动根据接口定义得规则生成一个实现类,

3.具体实现

业务逻辑说明:转换后 userDTO.name=user.name+user.id (使用了StructTransferUtil工具类实现)

1.定义接口

@Mapper(componentModel = "spring",imports = {StructTransferUtil.class})

    /**
     * 转换成 InterviewCandidateBaseInfo
     * @param user
     * @return
     */
    @Mappings({
            @Mapping(target = "name",expression = "java(StructTransferUtil.strName(user.getName(),user.getId()))")
    })
    UserDTO toInterviewCandidateBaseInfoList( User user);
}

2.交给Spring管理

    @Autowired
    CandidateMapper candidateMapper;

3.调用接口实现转换

   User user = new User();
   user.setName("张三");
   user.setId(10);
   user.setPosition("程序员");
  UserDTO userDTO = candidateMapper.toInterviewCandidateBaseInfoList(Uuser);
    /*
       UserDTO 属性
       name   position
                 */

4. 接口注解功能讲解

  • @Mapper(componentModel = “spring”,imports = {StructTransferUtil.class})

componentModel = “spring” 是将该接口的实现类交给 SprIng管理 以后只需要通过依赖注入就可以使用该注解
imports = {StructTransferUtil.class} 引入工具类,通过工具类的方法实现类如:身份证加密解密,信息脱敏,日期格式化,类型转换等

存在的BUG
StructMap中Mapper注解和Mybatis的注解是一样的 注意在Mybatis扫描包的时候不要放在一起不然容易引起错误:会说实现类找不到

  • @Mappings({
    @Mapping(target = “name”,expression = “java(StructTransferUtil.strName(user.getName(),user.getId()))”)
    })

Mapping 转换规则
target: 目标类中的属性 (前端展示的数据DTO)
expression:自定义转换规则 (一般定义规则和目标类属性后 如果名称一样可以省略 source)
source: 资源类

如果需要多个类转换成同一个类 需要指定类中的属性 例如user.name teacher.name

总结