开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地址: http://mapstruct.org/

  		<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.1.0.Final</version>
       </dependency>

我们假设有学生student 类 需要转换成 用户 user 类,将学生信息存入用户信息库

此时Student 类内容如下:

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
  	//setters, getters, toString()  方法此处省略不写,但是实际开发需要写的哦 

此时User 类内容如下:

public class User {
   	private Integer id;
    private String name;
    private Integer age;
    private String sex;
   //setters, getters, toString()  方法此处省略不写,但是实际开发需要写的哦 

转换model

此时 Student 和 User 的属性名字都相同那么转换接口就是

import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
     * Student 转化为 User
     * @param Student
     * @return
     User studentToUser(Student student);

程序运行前要先编译 mvn clean compile , 从而mapstruct框架生成UserMappingImpl 实现类。

转换model 属性不匹配

如果 User 和 Student 的属性名不对应例如:

此时Student 类内容如下:

public class Student {
    private Integer id;
    private String sname;
    private Integer age;
    private String sex;
  	//setters, getters, toString()  方法此处省略不写,但是实际开发需要写的哦 

此时User 类内容如下:

public class User {
   	private Integer id;
    private String uname;
    private Integer age;
    private String sex;
   //setters, getters, toString()  方法此处省略不写,但是实际开发需要写的哦 

那么转换接口为

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
     * Student 转化为 User
     * @param Student
     * @return
     @Mappings({
            @Mapping(target = "uname", source = "sname")
          // 多个属性不对应可以用 "," 隔开编写多个@Mapping
          // ,@Mapping(target = "uname", source = "sname")
     User studentToUser(Student student);

转换model 属性类型不匹配

比如说user 类的sex字段类型改为boolean
此时User 类内容如下:

public class User {
   	private Integer id;
    private String uname;
    private Integer age;
    private boolean sex;
   //setters, getters, toString()  方法此处省略不写,但是实际开发需要写的哦 

这个转换需求有点变态,所以 需要我门自己写个转换类

public class UserTransform {
    public String booleanToString(boolean value){
        if(value){
            return "男";
        return "女";
    public boolean strToBoolean(String str){
        if ("男".equals(str)) {
            return true;
        return false;

那么转换接口为(使用 UserTransform.class 类)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring",uses = UserTransform.class)
public interface UserMapping {
     * Student 转化为 User
     * @param Student
     * @return
     @Mappings({
            @Mapping(target = "uname", source = "sname")
          // 多个属性不对应可以用 "," 隔开编写多个@Mapping
          // ,@Mapping(target = "uname", source = "sname")
     User studentToUser(Student student);

转换list

当user 和 student 都是集合形式list 时应当如下转换
转化 List<> 集合时必须有 实体转化,因为在实现中,List 转换是 for循环调用 实体转化的。所以当属性名不对应时,应该在 实体转化进行 @Mappings 的属性名映射配置,然后list的转换也会继承这和属性的映射。

例如 属性名相同

import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
     * Student 转化为 User
     * @param Student
     * @return
     User studentToUser(Student student);
     * Students 转化为 Users
     * @param Students
     * @return
     List<User> studentsToUsers(List<Student> students);

属性名不同:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
     * Student 转化为 User
     * @param Student
     * @return
     @Mappings({
            @Mapping(target = "uname", source = "sname")
          // 多个属性不对应可以用 "," 隔开编写多个@Mapping
          // ,@Mapping(target = "uname", source = "sname")
     User studentToUser(Student student);
     * 此时 studentsToUsers 的实现为循环调用 studentToUser 并继承了 studentToUser 的属性映射
     * Students 转化为 Users
     * @param Students
     * @return
     List<User> studentsToUsers(List<Student> students);

展示 自动生成的 UserMappingImpl 实现(此类为 执行 mvn clean compile 后自动生成)

@Component
public class UserMappingImpl implements UserMapping {
    @Override
    public User studentToUser(student student) {
        if ( student == null ) {
            return null;
        User user = new User();
        User.setId(student.getId() );
        User.setName(student.getName() );
        // 如果配置了属性映射则为
        //User.setUname(student.getSname() );
        User.setSex(student.getSex() );
        User.setAge(student.getAge() );
        return user;
    @Override
    public List<User> studentsToUsers(List<student> students) {
        if ( students == null ) {
            return null;
        List<User> list = new ArrayList<User>();
        for ( student student : students ) {
            list.add( studentToUser( student ) );
        return list;

参考资料 :https://blog.csdn.net/jiangchao858/article/details/77604469

开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地...
总结:MapStructList转换是使用了单个类转换的 public List<ExtranetConfigVO> findAllExtranetConfigs(Long workStationId) { List<ExtranetConfig> extranetConfigs = extranetConfigService.getBaseMapper().selectList(Wrappers.<ExtranetConfig>lambdaQu
mybatis-plus依赖要用高版本,低版本没有convert方法(测的时候用3.0.5发现没有convert方法) <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
在使用MapStruct进行List转换时,需要进行实体转换和属性映射配置。在转换接口中,可以通过@Mappings注解来进行属性映射配置。如果属性名不对应,可以使用@Mapping注解在实体转换时进行属性名映射。当有多个属性不对应时,可以使用逗号隔开多个@Mapping注解。例如,在UserMapping接口中,可以使用@Mappings和@Mapping注解来定义Student转化为User的属性映射。然后可以使用studentToUser方法来进行List转换。 如果List中的实体类型的属性类型不匹配,可以在转换接口中通过定义属性转换方法来进行类型转换。例如,在UserMapping接口中,可以使用@Mapping注解来定义属性的类型转换,将Student的sname属性转换为User的uname属性。 注意,需要在转换接口上加上@Mapper注解,并指定componentModel为"spring",以便在Spring应用中进行注入和使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [mapstruct 实体转换List转换](https://blog.csdn.net/u012373815/article/details/88367456)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]