SpringBoot的MapStruct使用

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

一、引入依赖



    org.projectlombok
    lombok



    org.mapstruct
    mapstruct
    1.5.2.Final


    org.mapstruct
    mapstruct-processor
    1.5.2.Final

二、创建两个实体类 Person和PersonDto

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 personToPersonDto(List personList);

    List personDtoToPerson(List 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 personList = new ArrayList<>();
        personList.add(new Person(1L, "张三", 25));
        personList.add(new Person(2L, "李四", 26));
        List 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 personDtoList = new ArrayList<>();
        personDtoList.add(new PersonDto(1L, "张三", 25));
        personDtoList.add(new PersonDto(2L, "李四", 26));
        List 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 personToPersonDto(List personList);

    @Mappings({
            @Mapping(source = "addr", target = "address")
    })
    List personDtoToPerson(List 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 personList = new ArrayList<>();
        personList.add(new Person(1L, "张三", 25, "广州"));
        personList.add(new Person(2L, "李四", 26, "广州"));
        List 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 personDtoList = new ArrayList<>();
        personDtoList.add(new PersonDto(1L, "张三", 25, "广州"));
        personDtoList.add(new PersonDto(2L, "李四", 26, "广州"));
        List 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 personToPersonDto(List personList);

    @Mappings({
            @Mapping(source = "addr", target = "address"),
            @Mapping(source = "subPersonDto", target = "subPerson")
    })
    List personDtoToPerson(List 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 personList = new ArrayList<>();
        personList.add(new Person(1L, "张三", 25, "广州", new SubPerson(0, "zhangsan")));
        personList.add(new Person(2L, "李四", 26, "广州", new SubPerson(1, "lisi")));
        List 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 personDtoList = new ArrayList<>();
        personDtoList.add(new PersonDto(1L, "张三", 25, "广州", new SubPersonDto(false, "zhangsan")));
        personDtoList.add(new PersonDto(2L, "李四", 26, "广州", new SubPersonDto(true, "lisi")));
        List 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);
    }

}

你可能感兴趣的:(SpringBoot,spring,boot,java,spring)