学习目标

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


文章目录

  • 一、mapstruct是什么?
  • 1.1 使用背景
  • 1.2 优势
  • 二、基础用法
  • 2.1 导入mapstruct依赖
  • 2.2创建2个实体类
  • 2.3 定义映射器
  • 测试




一、mapstruct是什么?

1.1 使用背景

  1. 需求场景多。
    在我们日常的Java开发工作中,经常会遇到模型对象的转化,例如从实体类转化为DTO模型,DTO转化为VO、TO等模型的业务场景
  2. 模型转化枯燥、编码价值低。而模型的转化是枯燥且无技术含量的,不仅耗费大量时间而且很容易出错
  3. 问题排查困难。若涉及多个具有很多字段的Bean的模型转化时,不得不排查是否两个模型的相同字段的转化映射关系有缺失

1.2 优势

  1. MapStruct 是一个 Java注释处理器,用于生成类型安全的 bean 映射类。
  2. 您所要做的就是定义一个Bean的映射抽象类,在该抽象类中声明任何所需的映射方法。
  3. 在编译期间,MapStruct 将生成此抽象类的实现类。这个实现使用普通的 Java 方法调用来映射源对象和目标对象。
  4. 与手动编写映射代码相比,MapStruct 通过生成编写繁琐且容易出错的代码来节省时间。
  5. 与动态映射框架相比,MapStruct 具有以下优势:
    (1)通过使用普通方法getter、setter调用,而不是反射来快速执行,效率很高。
    (2)编译时类型安全:只能映射相互映射的对象和属性,不会将其余模型属性进行映射

二、基础用法

2.1 导入mapstruct依赖

<dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct</artifactId>
                <version>1.5.0.Beta1</version>
            </dependency>
            <!--mapstruct编译-->
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.5.0.Beta1</version>
            </dependency>
            //lombok的依赖最好是1.16.16的以上
            <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <version>1.18.12</version>
        
        </dependency>

2.2创建2个实体类

@Data
@Accessors(chain = true) //加了这个注解之后,那么导入的时候无法获取到值
public class Person {

    String describe;

    private String id;

    private String name;

    private int age;

    private BigDecimal source;

    private double height;

    private Date createTime;
	
}




@Data
@Accessors(chain = true) //加了这个注解之后,那么导入的时候无法获取到值
public class PersonDTO {

    String describe;

    private Long id;

    private String personName;

    private String age;

    private String source;

    private String height;

    private  String createTime;
    
}

2.3 定义映射器

其中target 代表的是PersonDTO 中的字段,source 代表的是Person中的字段

//指定依赖注入框架
@Mapper(componentModel = "spring")
public interface PersonConvert {
    //PersonConvert INSTANCT = Mappers.getMapper(PersonConvert.class);

    @Mappings({
            //不对2个相同的字段进行映射
            @Mapping(target = "id",ignore = true),
            //对2个不相同的字段进行映射
            @Mapping(target = "personName",source = "name"),
            //如果describe为空时,那么它的默认值为admin
            @Mapping(target = "describe",source = "describe",defaultValue = "admin"),
            //如果属性从字符串映射到日期,则该格式字符串可由SimpleDateFormat处理
            @Mapping(target = "createTime",source = "createTime",dateFormat = "yyyy-mm-dd")
    })
    PersonDTO convert(Person person);

    //多个源对象
    @Mappings({@Mapping( target = "createTime",source = "basicEntity.createTime")})
    PersonDTO convert(Person person, BasicEntity basicEntity);

    //使用其他的值
    @Mapping(target = "id",source = "id")
    PersonDTO convert(Person person,String id);
}

测试

@Autowired
    private PersonConvert personConvert;
    @GetMapping
    public PersonDTO list(){
        Person person = new Person();
        person.setAge(12).setName("hy").setId("1").setCreateTime(new Date());
        PersonDTO personDTO = personConvert.convert(person);
        return personDTO;
    }

springboot导出map中数据 springboot map转对象_前端