首页 > 其他分享 >SpringBoot中的MapStruct使用

SpringBoot中的MapStruct使用

时间:2023-06-05 10:31:38浏览次数:36  
标签:PersonDto SpringBoot MapStruct List new Person 使用 import name

目的:MapStruct可以实现对象之间的转换

一、引入依赖

<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--mapstruct-->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.2.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.2.Final</version>
</dependency>

二、创建两个实体类

import lombok.*;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人实体类
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person {
 
    private Long id;
 
    private String name;
 
    private Integer age;
 
}


import lombok.*;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人的dto类
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {
 
    private Long id;
 
    private String name;
 
    private Integer age;
 
}

三、创建MapStruct对象转换接口

import com.example.quartzdemo.bean.Person;
import com.example.quartzdemo.dto.PersonDto;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
 
import java.util.List;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人的对象mapstruct转换类
 */
@Mapper
public interface PersonConverter {
 
    // 使用工厂方法获取对象实例
    PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);
 
    PersonDto personToPersonDto(Person person);
 
    Person personDtoToPerson(PersonDto personDto);
 
    List<PersonDto> personToPersonDto(List<Person> personList);
 
    List<Person> personDtoToPerson(List<PersonDto> personDtoList);
 
}

四、测试

import com.example.quartzdemo.bean.Person;
import com.example.quartzdemo.convert.PersonConverter;
import com.example.quartzdemo.dto.PersonDto;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.util.ArrayList;
import java.util.List;
 
@SpringBootTest
class QuartzDemoApplicationTests {
 
    /**
     * person转PersonDto
     */
    @Test
    void personToPersonDto() {
        Person person = new Person(1L, "张三", 25);
        PersonDto personDto = PersonConverter.INSTANCE.personToPersonDto(person);
        // 输出PersonDto(id=1, name=张三, age=25)
        System.out.println(personDto);
    }
 
    /**
     * personDto转Person
     */
    @Test
    void personDtoToPerson() {
        PersonDto personDto = new PersonDto(2L, "李四", 26);
        Person person = PersonConverter.INSTANCE.personDtoToPerson(personDto);
        // 输出Person(id=2, name=李四, age=26)
        System.out.println(person);
    }
 
    /**
     * personList转PersonDtoList
     */
    @Test
    void personListToPersonDtoList() {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1L, "张三", 25));
        personList.add(new Person(2L, "李四", 26));
        List<PersonDto> personDtoList = PersonConverter.INSTANCE.personToPersonDto(personList);
        // 输出[PersonDto(id=1, name=张三, age=25), PersonDto(id=2, name=李四, age=26)]
        System.out.println(personDtoList);
    }
 
    /**
     * PersonDtoList转personList
     */
    @Test
    void prsonDtoListToPersonList() {
        List<PersonDto> personDtoList = new ArrayList<>();
        personDtoList.add(new PersonDto(1L, "张三", 25));
        personDtoList.add(new PersonDto(2L, "李四", 26));
        List<Person> personList = PersonConverter.INSTANCE.personDtoToPerson(personDtoList);
        // 输出[Person(id=1, name=张三, age=25), Person(id=2, name=李四, age=26)]
        System.out.println(personList);
    }
 
}

五、如果遇到两个实体类属性名不相同的情况,我们需要对转换器接口进行处理

import java.io.Serializable;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人实体类
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Serializable {
 
    private Long id;
 
    private String name;
 
    private Integer age;
 
    private String address;
    
 
}
 
import lombok.*;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人的dto类
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {
 
    private Long id;
 
    private String name;
 
    private Integer age;
 
    private String addr;
 
}

两个实体中的address和addr代表的都是地址,但是表现形式不一样。这种情况我们需要对抓获接口进行配置

import com.example.quartzdemo.bean.Person;
import com.example.quartzdemo.dto.PersonDto;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
 
import java.util.List;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人的对象mapstruct转换类
 */
@Mapper
public interface PersonConverter {
 
    // 使用工厂方法获取对象实例
    PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);
 
    // source:需要转换的属性 target:转换后的属性
    @Mappings({
            @Mapping(source = "address", target = "addr")
    })
    PersonDto personToPersonDto(Person person);
 
    @Mappings({
            @Mapping(source = "addr", target = "address")
    })
    Person personDtoToPerson(PersonDto personDto);
 
    @Mappings({
            @Mapping(source = "address", target = "addr")
    })
    List<PersonDto> personToPersonDto(List<Person> personList);
 
    @Mappings({
            @Mapping(source = "addr", target = "address")
    })
    List<Person> personDtoToPerson(List<PersonDto> personDtoList);
 
}

测试

import com.example.quartzdemo.bean.Person;
import com.example.quartzdemo.convert.PersonConverter;
import com.example.quartzdemo.dto.PersonDto;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.util.ArrayList;
import java.util.List;
 
@SpringBootTest
class QuartzDemoApplicationTests {
 
    /**
     * person转PersonDto
     */
    @Test
    void personToPersonDto() {
        Person person = new Person(1L, "张三", 25, "广州");
        PersonDto personDto = PersonConverter.INSTANCE.personToPersonDto(person);
        // 输出PersonDto(id=1, name=张三, age=25, addr=广州)
        System.out.println(personDto);
    }
 
    /**
     * personDto转Person
     */
    @Test
    void personDtoToPerson() {
        PersonDto personDto = new PersonDto(2L, "李四", 26, "广州");
        Person person = PersonConverter.INSTANCE.personDtoToPerson(personDto);
        // 输出Person(id=2, name=李四, age=26, address=广州)
        System.out.println(person);
    }
 
    /**
     * personList转PersonDtoList
     */
    @Test
    void personListToPersonDtoList() {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1L, "张三", 25, "广州"));
        personList.add(new Person(2L, "李四", 26, "广州"));
        List<PersonDto> personDtoList = PersonConverter.INSTANCE.personToPersonDto(personList);
        // 输出[PersonDto(id=1, name=张三, age=25, addr=广州), PersonDto(id=2, name=李四, age=26, addr=广州)]
        System.out.println(personDtoList);
    }
 
    /**
     * PersonDtoList转personList
     */
    @Test
    void prsonDtoListToPersonList() {
        List<PersonDto> personDtoList = new ArrayList<>();
        personDtoList.add(new PersonDto(1L, "张三", 25, "广州"));
        personDtoList.add(new PersonDto(2L, "李四", 26, "广州"));
        List<Person> personList = PersonConverter.INSTANCE.personDtoToPerson(personDtoList);
        // 输出[Person(id=1, name=张三, age=25, address=广州), Person(id=2, name=李四, age=26, address=广州)]
        System.out.println(personList);
    }
 
}

六、自定义转换 对于某些类型,没有办法通过代码生成器来进行处理,就需要自定义方法来进行转换。

import java.io.Serializable;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人实体类
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Serializable {
 
    private Long id;
 
    private String name;
 
    private Integer age;
 
    private String address;
 
    private SubPerson subPerson;
 
 
}
 
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class SubPerson {
 
    private Integer deleted;
 
    private String name;
 
}
import lombok.*;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人的dto类
 */
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {
 
    private Long id;
 
    private String name;
 
    private Integer age;
 
    private String addr;
 
    private SubPersonDto subPersonDto;
}
 
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class SubPersonDto {
 
    private Boolean result;
 
    private String name;
 
}

我们需要在转换接口中添加自定义的转换方法

import com.example.quartzdemo.bean.Person;
import com.example.quartzdemo.bean.SubPerson;
import com.example.quartzdemo.dto.PersonDto;
import com.example.quartzdemo.dto.SubPersonDto;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
 
import java.util.List;
 
/**
 * @author qinxun
 * @date 2023-06-05
 * @Descripion: 人的对象mapstruct转换类
 */
@Mapper
public interface PersonConverter {
 
    // 使用工厂方法获取对象实例
    PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);
 
    // source:需要转换的属性 target:转换后的属性
    @Mappings({
            @Mapping(source = "address", target = "addr"),
            @Mapping(source = "subPerson", target = "subPersonDto")
    })
    PersonDto personToPersonDto(Person person);
 
    @Mappings({
            @Mapping(source = "addr", target = "address"),
            @Mapping(source = "subPersonDto", target = "subPerson")
    })
    Person personDtoToPerson(PersonDto personDto);
 
    @Mappings({
            @Mapping(source = "address", target = "addr"),
            @Mapping(source = "subPerson", target = "subPersonDto")
    })
    List<PersonDto> personToPersonDto(List<Person> personList);
 
    @Mappings({
            @Mapping(source = "addr", target = "address"),
            @Mapping(source = "subPersonDto", target = "subPerson")
    })
    List<Person> personDtoToPerson(List<PersonDto> personDtoList);
 
    /**
     * 属性的自定义转换
     */
    default SubPersonDto subPersonToSubPersonDto(SubPerson subPerson) {
        if (subPerson == null) {
            return null;
        }
        SubPersonDto subPersonDto = new SubPersonDto();
        subPersonDto.setResult(!subPerson.getDeleted().equals(0));
        subPersonDto.setName(subPerson.getName());
        return subPersonDto;
    }
 
    /**
     * 属性的自定义转换
     */
    default SubPerson subPersonDtoToSubPerson(SubPersonDto subPersonDto) {
        if (subPersonDto == null) {
            return null;
        }
        SubPerson subPerson = new SubPerson();
        subPerson.setDeleted(subPersonDto.getResult() ? 1 : 0);
        subPerson.setName(subPersonDto.getName());
        return subPerson;
    }
}

测试

import com.example.quartzdemo.bean.Person;
import com.example.quartzdemo.bean.SubPerson;
import com.example.quartzdemo.convert.PersonConverter;
import com.example.quartzdemo.dto.PersonDto;
import com.example.quartzdemo.dto.SubPersonDto;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.util.ArrayList;
import java.util.List;
 
@SpringBootTest
class QuartzDemoApplicationTests {
 
    /**
     * person转PersonDto
     */
    @Test
    void personToPersonDto() {
        SubPerson subPerson = new SubPerson(0, "zhangsan");
        Person person = new Person(1L, "张三", 25, "广州", subPerson);
        PersonDto personDto = PersonConverter.INSTANCE.personToPersonDto(person);
        // 输出PersonDto(id=1, name=张三, age=25, addr=广州, subPersonDto=SubPersonDto(result=false, name=zhangsan))
        System.out.println(personDto);
    }
 
    /**
     * personDto转Person
     */
    @Test
    void personDtoToPerson() {
        SubPersonDto subPersonDto = new SubPersonDto(false, "lisi");
        PersonDto personDto = new PersonDto(2L, "李四", 26, "广州", subPersonDto);
        Person person = PersonConverter.INSTANCE.personDtoToPerson(personDto);
        // 输出Person(id=2, name=李四, age=26, address=广州, subPerson=SubPerson(deleted=0, name=lisi))
        System.out.println(person);
    }
 
    /**
     * personList转PersonDtoList
     */
    @Test
    void personListToPersonDtoList() {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1L, "张三", 25, "广州", new SubPerson(0, "zhangsan")));
        personList.add(new Person(2L, "李四", 26, "广州", new SubPerson(1, "lisi")));
        List<PersonDto> personDtoList = PersonConverter.INSTANCE.personToPersonDto(personList);
        // 输出[PersonDto(id=1, name=张三, age=25, addr=广州, subPersonDto=SubPersonDto(result=false, name=zhangsan)), PersonDto(id=2, name=李四, age=26, addr=广州, subPersonDto=SubPersonDto(result=true, name=lisi))]
        System.out.println(personDtoList);
    }
 
    /**
     * PersonDtoList转personList
     */
    @Test
    void prsonDtoListToPersonList() {
        List<PersonDto> personDtoList = new ArrayList<>();
        personDtoList.add(new PersonDto(1L, "张三", 25, "广州", new SubPersonDto(false, "zhangsan")));
        personDtoList.add(new PersonDto(2L, "李四", 26, "广州", new SubPersonDto(true, "lisi")));
        List<Person> personList = PersonConverter.INSTANCE.personDtoToPerson(personDtoList);
        // 输出[Person(id=1, name=张三, age=25, address=广州, subPerson=SubPerson(deleted=0, name=zhangsan)), Person(id=2, name=李四, age=26, address=广州, subPerson=SubPerson(deleted=1, name=lisi))]
        System.out.println(personList);
    }
 
}


标签:PersonDto,SpringBoot,MapStruct,List,new,Person,使用,import,name
From: https://blog.51cto.com/u_13312531/6413555

相关文章

  • 从源码分析 Go 语言使用 cgo 导致的线程增长
    TDengineGo连接器https://github.com/taosdata/driver-go使用cgo调用taos.so中的API,使用过程中发现线程数不断增长,本文从一个cgo调用开始解析Go源码,分析造成线程增长的原因。转换cgo代码对driver-go/wrapper/taosc.go进行转换gotoolcgotaosc.go执行后生成......
  • PostgreSQL中使用动态SQL-实现自动按时间创建表分区
    PostgreSQL中通过继承,可以支持基本的表分区功能,比如按时间,每月创建一个表分区,数据记录到对应分区中。按照官方文档的操作,创建子表和index、修改trigger等工作都必须DBA定期去手动执行,不能实现自动化,非常不方便。尝试着通过在plpgsql代码中使用动态SQL,将大表分区的运维操作实现......
  • babel-plugin-enhance-log插件使用
    一个用来为console.log添加代码行数,log参数名以及添加分隔符的插件#1.安装插件npmibabel-plugin-enhance-log-D#oryarnaddbabel-plugin-enhance-log-D#orpnpmaddbabel-plugin-enhance-log-D#2.在babel.congfig.js中添加插件://babel.config.jsmodule.expo......
  • 在elementUI-admin中使用printjs进行打印功能的处理
    1.需要加入依赖npminstallprint-js--save-dev2.通过数据的处理打印表格(推荐)在utils文件夹下创建print.js文件importprintJSfrom"print-js";/** * *@param{ *   title:"",//表名 *   serial:false,//是否需要序号 *   data:[],//......
  • Springboot 链接DataSource前检查或创建库,并设置时区及sql_mode
    /**Copyright(c)2022.AsiacomTechnologyInc.Allrightsreserved*/importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Configuration;......
  • SpringBoot打包成WAR包的时候把第三方jar包打到LIB文件夹下和把第三方jar包打入到Spri
    SpringBoot打包成WAR包的时候把第三方jar包打到LIB文件夹下和把第三方jar包打入到SpringBootjar包中转载首先我们应该知道我们把SPRINGBOOT项目打包成WAR包和JAR包的时候分别需要何种插件我们最常用的把springBoot打成jar包的插件是下面这样的一个插件,这是把我们的springBoot......
  • 专业人士使用的7个秘密TypeScript技巧
    TypeScript是一种出色的工具,可以让我们的生活更轻松并避免错误,但有时使用起来会让人不知所措。 动图 本文概述了所有专业人士都使用的7个TypeScript技巧,它们将使您的生活更轻松。(更多优质教程:java567.com,搜"ts")1.类型推断Typescript足够聪明,可以在您帮助缩小数据类型......
  • 使用Go语言中的Channel实现并发编程
    引言:Go语言是一门开源的编程语言,以其高效、简洁和并发编程的能力而闻名。在Go语言中,Channel是一个重要的概念,它提供了一种安全、高效地在并发程序中进行通信的机制。本文将介绍Go语言中的Channel,以及如何使用Channel实现并发编程。一、什么是Channel?在Go语言中,Channel是一种用......
  • 1-3Linux帮助使用小技巧
    获取帮助方法:whatis:使用数据库来显示命令的简短描述此工具在系统刚安装后,不可立即使用,需要制作数据库后才可以使用执行以下命令生成数据库command--helpman/usr/share/doc/RedHatdocumentation、Ubuntudocumentation软件项目网站其它网站搜索 1)如......
  • springboot案列
    当创建多个springboot项目在同一个文件时,注意每一个springboot项目的serverport(端口)要不一样,否则会报错;另外要注意的是:在创建的springboot目录中;其他它文件的目录必须在springboot的项目的内部,否则会找不到指定的内容,报404错误 ......