两个实体类字段不同实现赋值 (MapStruct)

场景:我调用的下游服务返回的参数命名是拼音首字母,而我返回给第三方的需要是英文命名。故需两个实体类字段完全不一样赋值 (不想用get 在 set)

MapStruct特点

  1. 基于注解
  2. 在编译期自动生成映射转换代码
  3. 类型安全、高性能、无依赖性

实现:

1. 引入 jar 包依赖

    <properties>
		 
		<!--第三方依赖-->		 
		<mapstruct.version>1.5.3.Final</mapstruct.version>
		<lombok-mapstruct.version>0.2.0</lombok-mapstruct.version>
	   <lombok.version>1.18.24</lombok.version>
	</properties>

   <dependency>
	   <groupId>org.mapstruct</groupId>
	   <artifactId>mapstruct</artifactId>
	   <version>${mapstruct.version}</version>
	</dependency>

	 <!--mapstruct编译 必要 需要编译mapstruct实现类-->
	<dependency>
	    <groupId>org.mapstruct</groupId>
		<artifactId>mapstruct-processor</artifactId>
		<version>${mapstruct.version}</version>
	</dependency>

 	<!--引入mapstruct 如果lombok版本>= 1.18.16则需要如下配置 我的lombok版本是1.18.24-->
	 <dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok-mapstruct-binding</artifactId>
		<version>${lombok-mapstruct.version}</version>
	  </dependency>


	<dependency>
	  <groupId>org.projectlombok</groupId>
	  <artifactId>lombok</artifactId>
	  <version>${lombok.version}</version>
	</dependency>

2. 创建映射器类(该@Mapper注解将使得MapStruct代码生成器 生成一个实现类, Mappers.getMapper则是得到该实现类的实例)

实体类:

/**
* 目标实体
*
*/
@Data
public class SchoolVO {

    /**
     * 学校编码
     */
    @ApiModelProperty("学校编码")
    private String code;
    /**
     * 学校名称
     */
    @ApiModelProperty("学校名称")
    private String name;

  
}

/**
* 源实体
*
*/
@Data
public class xxbmVO {

    /**
     * 学校编码
     */
    @ApiModelProperty("学校编码")
    private String xxbm;
    /**
     * 学校名称
     */
    @ApiModelProperty("学校名称")
    private String xxmc;

    
}
package com.cunw.cloud.dataworks.openplatform.converters.vo;

import com.cunw.cloud.dataworks.common.vo.openplatform.SchoolVO;
import com.cunw.framework.vo.PageList;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import vo.ThreeDSchoolListVO;

import java.util.List;

/**
 * * @description: 学校实体类转换器 类
 * * @author:  
 * * @create: 2022/12/17 10:19
 */
@Mapper
public interface SchoolMapper {

    SchoolMapper INSTANCT = Mappers.getMapper(SchoolMapper.class);

    /**
     * 转换单个对象
     * @param school
     * @return
     */
    @Mapping(target = "code", source = "xxbm")
    @Mapping(target = "name", source = "xxmc")
    SchoolVO cover(ThreeDSchoolListVO school);

    /**
     * 转换多个对象
     * @param schoolListVOS
     * @return
     */
    List<SchoolVO> coverList(List<ThreeDSchoolListVO> schoolListVOS);

  
    /**
     * 转换多个对象(PageList)
     * @param voPageList
     * @return
     */    PageList<SchoolVO>coverPage(com.cunw.cloud.framework.service.pagehelper.PageList<ThreeDSchoolListVO> voPageList);
}

打开实现类看一下(实体类源码在  target/generated-sources/annotations 目录下)

coverList实际上就是调用单个对象的cover

PageList方法调用coverList方法

package com.cunw.cloud.dataworks.openplatform.converters.vo;

import com.cunw.cloud.dataworks.common.vo.openplatform.SchoolVO;
import com.cunw.framework.vo.PageList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import vo.ThreeDSchoolListVO;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-12-26T09:32:19+0800",
    comments = "version: 1.5.3.Final, compiler: javac, environment: Java 1.8.0_291 (Oracle Corporation)"
)
public class SchoolMapperImpl implements SchoolMapper {

    @Override
    public SchoolVO cover(ThreeDSchoolListVO school) {
        if ( school == null ) {
            return null;
        }

        SchoolVO schoolVO = new SchoolVO();

        schoolVO.setCode( school.getXxbm() );
        schoolVO.setName( school.getXxmc() );

        return schoolVO;
    }

    @Override
    public List<SchoolVO> coverList(List<ThreeDSchoolListVO> schoolListVOS) {
        if ( schoolListVOS == null ) {
            return null;
        }

        List<SchoolVO> list = new ArrayList<SchoolVO>( schoolListVOS.size() );
        for ( ThreeDSchoolListVO threeDSchoolListVO : schoolListVOS ) {
            list.add( cover( threeDSchoolListVO ) );
        }

        return list;
    }

    @Override
    public PageList<SchoolVO> coverPage(com.cunw.cloud.framework.service.pagehelper.PageList<ThreeDSchoolListVO> voPageList) {
        if ( voPageList == null ) {
            return null;
        }

        PageList<SchoolVO> pageList = new PageList<SchoolVO>();

        pageList.setTotal( voPageList.getTotal() );
        pageList.setList( coverList( voPageList.getList() ) );
        pageList.setPageNum( voPageList.getPageNum() );
        pageList.setPageSize( voPageList.getPageSize() );
        pageList.setSize( voPageList.getSize() );
        pageList.setStartRow( voPageList.getStartRow() );
        pageList.setEndRow( voPageList.getEndRow() );
        pageList.setPages( voPageList.getPages() );
        pageList.setPrePage( voPageList.getPrePage() );
        pageList.setNextPage( voPageList.getNextPage() );
        pageList.setIsFirstPage( voPageList.isIsFirstPage() );
        pageList.setIsLastPage( voPageList.isIsLastPage() );
        pageList.setHasPreviousPage( voPageList.isHasPreviousPage() );
        pageList.setHasNextPage( voPageList.isHasNextPage() );
        pageList.setNavigatePages( voPageList.getNavigatePages() );
        int[] navigatepageNums = voPageList.getNavigatepageNums();
        if ( navigatepageNums != null ) {
            pageList.setNavigatepageNums( Arrays.copyOf( navigatepageNums, navigatepageNums.length ) );
        }
        pageList.setNavigateFirstPage( voPageList.getNavigateFirstPage() );
        pageList.setNavigateLastPage( voPageList.getNavigateLastPage() );

        return pageList;
    }
}

测试类:

 public static void main(String[] args) {
        xxbmVO vo=new xxbmVO();
        vo.setXxbm("学校编码");
        vo.setXxmc("学校名称");
        

        SchoolVO conver = SchoolMapper.INSTANCT.cover(vo);
        String schoolCode = conver.getCode();
        String schoolName = conver.getName();
       
        System.out.println(schoolCode);
        System.out.println(schoolName);
   
    }

打印结果 :

学校编码
学校名称
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,我们可以使用多种方式将一个实体类的值赋给另一个不同实体类。 一种常见的方式是使用构造函数。我们可以在目标实体类定义一个带有源实体类类型的构造函数,并通过参数传递源实体类的对象。然后,在构造函数内部,将源实体类对象的属性值赋给目标实体类的相应属性。这样,我们就可以通过创建目标实体类的对象,将源实体类的属性值赋给目标实体类的对象。 另一种常见的方式是使用setter方法。我们可以在目标实体类定义与源实体类属性相同的setter方法。然后,通过获取源实体类的对象和目标实体类的对象,使用源实体类的getter方法获取属性值,并通过目标实体类的setter方法将值赋给目标实体类的属性。 以下是一个示例代码,演示了如何将一个Student类的属性值赋给一个Person类的对象: ``` public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } } public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } } public class Main { public static void main(String[] args) { Student student = new Student("John", 20); Person person = new Person(); person.setName(student.getName()); person.setAge(student.getAge()); System.out.println("Person name: " + person.getName()); System.out.println("Person age: " + person.getAge()); } } ``` 在上述示例,我们创建了一个Student类和一个Person类。然后,我们实例化一个Student对象,并将其name和age属性值赋给一个Person对象。最后,我们输出Person对象的name和age属性值,验证赋值是否成功。 以上就是将两个不同实体类进行赋值的一种常见方式。当然,具体的实现方式可能因实际需求而有所不同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值