精华内容
下载资源
问答
  • Mapstruct
    2022-03-22 21:48:38

    官方文档:https://mapstruct.org/documentation/dev/reference/html/

    1.场景介绍

    在这里插入图片描述

    2.为什么要用框架?

    • 复杂而多的业务逻辑,不能突出业务的重点
    • 重复的劳动,代码无法复用

    3.使用介绍

    3.1引入POM

    <dependency>
       <groupId>org.mapstruct</groupId>
       <artifactId>mapstruct</artifactId>
       <version>1.4.2.Final</version>
    </dependency>
    <dependency>
       <groupId>org.mapstruct</groupId>
       <artifactId>mapstruct-processor</artifactId>
       <version>1.4.2.Final</version>
    </dependency>
    

    3.2新建抽象类并标注@Mapper

    @Mapper
    public interface UserConvert
    

    3.3编写转换方法

     /**
       * userDTO->UserVO
       */
      UserVO dto2vo(UserDTO userDTO);
    

    3.4动态获取Convert实例

    public UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
    

    3.5测试

    		UserDO userDO = UserDO.builder()
    				.id(1)
    				.username("maofeiyu")
    				.authorities(Arrays.asList("123", "455", "4343"))
    				.createTime(LocalDateTime.now())
    				.updateTime(LocalDateTime.now())
    				.version(1).build();
    		System.out.println(JSON.toJSONString(userDO, true));
    
    		UserDTO userDTO = UserConvert.INSTANCE.do2dto(userDO);
    		System.out.println(JSON.toJSONString(userDTO, true));
    
    

    4.高级配置

    4.1@Mapper

    • 默认映射规则
      1. 同类型,同名的属性会自动映射
    • 自动类型转换
      1. 8种基本数据类型和他们的包装类型会自动进行转换
      2. 8种基本数据类型和String之间会自动进行转换
      3. 日期类型和String之间会自动转换

    4.2@Mappings和@Mapping

    • 指定属性之间的映射关系
      • 数字格式化 numberFormat = “#.00”
      • 日期格式化 dateFormat = “yyyy-MM-dd HH:mm:ss”
    • source或者target多余的属性不会报错
    • ignore忽略属性映射(需要自己手动赋值)
    • 属性是引用的处理(需要在同一个类中配置引用类型的转换处理)
    • 批量映射(需要先指定单一映射)

    4.3案例

    4.3.1基本类型转换配置

    @Mappings(
          value = {
              /**
               * @param source-源属性名
               * @param target-转换对象属性名
               * @param numberFormat-数字格式化规则
               */
              @Mapping(
                  source = "totalPrice",
                  target = "totalPrice",
                  numberFormat = "#.00"
              ),
              /**
               * @param source-源属性名
               * @param target-转换对象属性名
               * @param dateFormat-日期格式化规则
               */
              @Mapping(
                  source = "publishDate",
                  target = "publishDate",
                  dateFormat = "yyyy-MM-dd HH:mm:ss"
              ),
              /**
               * @param target-忽略的目标属性
               */
              @Mapping(target = "color", ignore = true),
              @Mapping(source = "driverDTO", target = "driverVO"),
          }
      )
    

    4.3.2引用类型配置转换

    @Mappings(
          value = {
              @Mapping(source = "id", target = "id"),
              @Mapping(source = "name", target = "fullname")
          }
      )
      UserVO userDTO2userVO(UserDTO userDTO);
    

    4.4批量转换

    原始方法:for循环进行便利添加 优化做法:使用stream流进行遍历 高级做法:使用mapStruct进行批量转换

      /**
       * 批量转换
       */
      abstract List<UserVO> dto2vos(List<UserDTO> carDTO);
    

    5.高级注解

    5.1@AfterMapping和@MappingTarget自定义属性

    在映射的最后一步,进行自定义属性的映射处理

    场景:两种完全不同的类型需要映射(自定义映射)

    /**
       * 描述: 表示让mapstruct在调用完自动转换方法之后,会自动调用本方法
       * 自定义属性映射处理
       */
      @AfterMapping
      public void dto2voafter(UserDTO userDTO, @MappingTarget UserVO userVO) {
        // @MappingTarget 标识当前传递过来的target对象是已经赋值过得
    
        // 手动获取属性进行判断,并赋值
        List<UserDTO> partDTOs = userDTO.getPartDTOs();
        boolean hasPartDTOs = partDTOs != null && !partDTOs.isEmpty();
    
        userVO.setHasPart(hasPartDTOs);
      }
    

    5.2@BeanMapping

    忽略默认映射行为,避免不需要的赋值,避免属性覆盖

    场景:我们在映射的过程中,target类拥有很多的属性,但是只有几个属性需要我们自动映射,其他属性需要手动进行设置
    原始的方式: 通过@Mapping的方式来ignore来进行忽略(但是如果有非常多的属性不适合使用)

    /**
       * 配置忽略mapStruct的默认映射行为,只映射那些@Mapping的属性
       */
      @BeanMapping(ignoreByDefault = true)
      @Mapping(source = "id", target = "id")
      abstract UserVO userdto2uservo(UserDTO userDTO);
    

    5.3@InheritConfiguration

    • 更新的场景

    5.4@InheritInverseConfiguration

    • 反向反射过来不用重新写一次 只集成@Mapping注解配置,不会集成@BeanMapping

    6.SpringBoot整合

    注入Bean到Spring容器中

    @Mapper(componentModel="spring") 本质:给生成的类添加了一个@Component注解
    
    更多相关内容
  • IntelliJ IDEA插件,可与MapStruct一起使用 什么是MapStructMapStruct是一个Java用于为Java Bean类生成类型安全和高性能的映射器。 要了解有关MapStruct的更多信息,请查看存储库或 特征 代码完成 完成@Mapping...
  • 用于协议缓冲区的Mapstruct SPI实现 这种命名策略有助于在您的域类和protobuf类之间生成有效的映射代码。 无论和类支载。 注意:取决于mapstruct 1.4.0.CR1ProtobufAccessor命名策略扩展...
  • 赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0....
  • 赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后...
  • 赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0....
  • MapStruct 如何使您的映射任务变得有趣而有趣 它是什么? MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。 生成的映射代码使用简单的方法调用,因此快速,类型...
  • JDK11使用MapStruct

    2022-05-21 20:56:50
    JDK11使用MapStruct
  • MapStruct示例该存储库包含一些示例,这些示例显示了如何使用 (Java注释处理器)来生成类型安全的bean映射类。 当前,存在以下示例: mapstruct-on-ant :显示如何在基于Ant的项目中使用MapStruct; 要构建此示例,...
  • 今天小编就为大家分享一篇关于MapStruct实体转换及List转换的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 今天小编就为大家分享一篇关于MapStruct实体间转换的简单用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 赠送jar包:mapstruct-1.1.0.Final.jar; 赠送原API文档:mapstruct-1.1.0.Final-javadoc.jar; 赠送源代码:mapstruct-1.1.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.1.0.Final.pom; 包含翻译后...
  • mapstruct-spring-extensions-example
  • 今天小编就为大家分享一篇关于MapStruct处理Java中实体与模型间不匹配属性转换的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 赠送jar包:mapstruct-processor-1.2.0.Final.jar; 赠送原API文档:mapstruct-processor-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-processor-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct...
  • 赠送jar包:mapstruct-1.3.1.Final.jar; 赠送原API文档:mapstruct-1.3.1.Final-javadoc.jar; 赠送源代码:mapstruct-1.3.1.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.3.1.Final.pom; 包含翻译后...
  • 赠送jar包:mapstruct-1.2.0.Final.jar; 赠送原API文档:mapstruct-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-1.2.0.Final.pom; 包含翻译后...
  • 【java】mapstruct自定义类的转换示例(csdn)————程序
  • mapstruct-demo 该项目说明了如何使用mapstruct API自动执行Java映射 什么是MapStruct MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。 生成的映射代码使用简单的...
  • mapstruct_sandbox 沙盒,用于在SpringBoot项目中使用Mapstruct,H2和LiquibaseMapStruct概述MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。 项目设置用途: 摇动...
  • MapStruct-Java Bean映射,简单方法!什么是MapStructMapStruct是一个Java用于为Java Bean类生成类型安全和高性能的映射器。 它使您不必手工编写映射代码,这是一个繁琐且容易出错的任务。 该生成器具有合理的...
  • MapStruct - 简化不同类型bean之间映射的代码生成器,基于一个约定优于配置的方式。
  • 主要介绍了Java编码辅助工具Mapstruct用法详解,手动编码setter/getter各个对应属性,会显得臃肿繁琐。通过Mapstruct框架可简单方便地完成这一工作。,需要的朋友可以参考下
  • mapstruct

    千次阅读 2022-03-18 19:48:39
    (2)mapstruct会自动类型转化,支持的类型转化的类型如下: <1> 基本类型和他们对应的包装类型之间会自动转化; <2> 8中基本类型(包括他们的包装类型)和String类型之间的转化。 ...

    大致四部:
    第一步:引入依赖
    第二步:新建一个抽象类或接口,并标注Mapper注解
    第三步:编写转化方法
    第四步:获取对象并调用方法 

    @Mapper注解

    默认映射规则:
    (1)同名且同类型的属性,会自动映射,不同类型会尝试转化为同一类型。
    (2)mapstruct会自动类型转化,支持的类型转化的类型如下:

            <1> 基本类型和他们对应的包装类型之间会自动转化;
            <2> 8中基本类型(包括他们的包装类型)和String类型之间的转化。
            <3> 日期类型和String之间转化

    1、需求把UserEntity对象转化为Student对象:

    三个实体类:

    // Roles ===================================
    import lombok.AllArgsConstructor;
    import lombok.Data;
    @Data
    @AllArgsConstructor
    public class Roles {
        public Long roleId;
        public String name;
    }
    // Student ===================================
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import java.math.BigDecimal;
    import java.util.Date;
    @Data
    @AllArgsConstructor
    public class Student {
        public Long studentId;
        public String name;
        public String age;
        public String score;
        public Roles roles;
        public Date createTime;
    }
    
    // UserEntity ===================================
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import java.math.BigDecimal;
    import java.util.Date;
    @Data
    @AllArgsConstructor
    public class UserEntity {
        public Long userId;
        public String name;
        public Integer age;
        public Double score;
        public Roles roles;
        public String createTime;
    }
    

    引入包:

    <properties>
        <org.mapstruct.version>1.4.1.Final</org.mapstruct.version>
    </properties>
    <!-- mapStruct 核心注解 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${org.mapstruct.version}</version>
    </dependency>
    <!-- mapStruct 根据接口生成实现类 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${org.mapstruct.version}</version>
        <scope>provided</scope>
    </dependency>


    补充:
    · 获取UserConvert 对象实例两种方式:

        方式一:public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
                       使用:在调用类中直接通过类来掉用该实例
        方式二:在UserConvert类的@Mapper注解中添加 componentModel = "spring"
                       
    使用:在调用类中可直接注入UserConvert

    @SpringBootTest
    class SpringbootTest1ApplicationTests {
        @Autowired
        UserConvert userConvert;
        @Test
        void convert() {
            Student student = userConvert.UserEntityToStudent(new UserEntity("lxc"));
            System.out.println(student);
        }
    }

    在编译的源码中,mapstruct会帮助我们在实现类上添加@Component注解

     

     编写抽象类或接口:

    import com.example.springboottest1.domain.Student;
    import com.example.springboottest1.domain.UserEntity;
    import org.mapstruct.Mapper;
    import org.mapstruct.factory.Mappers;
    @Mapper
    public abstract class UserConvert {
        // 获取UserConvert 对象实例
        public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
        // 把UserEntity转化为Student
        public abstract Student userConvertToStudent(UserEntity userEntity);
    }

    测试:

    // @SpringBootTest
    class SpringbootTest1ApplicationTests {
        @Test
        void convert() {
            // 提前把Roles和UserEntity填充好
            Roles roles = new Roles(2L, "学生角色");
            UserEntity userEntity = new UserEntity(1L, "lxc", 20,  "123.235", roles, new Date());
            // 调用UserConvert类进行转化
            Student student = UserConvert.INSTANCE.userConvertToStudent(userEntity);
            System.out.println(student);
        }
    }

    打印如下: 

     字段不同,所以studentId 为null,createTime不是正常的时间格式,Date转字符串。
     

    @Mappings 和 @Mapping 注解

    @Mappings是一个数组,可定义映射规则。
    @Mapping是映射规则的实现。其常用方法如下:

    (1)source 源对象、target 目标对象 
    (2)dateFormat 日期格式化、numberFormat 数字格式化
    (3)ignore 忽略某个属性(不会映射到目标对象)

    color属性不会映射到目标对象。
    需求二:

    对于不同字段需要映射,时间格式"yyyy-MM-dd HH:mm:ss",小数点保留2位

    @Mapper
    public abstract class UserConvert {
        public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
        // 值是一个数组,类型是 Mapping
        @Mappings(value = {
                @Mapping(source = "userId", target = "studentId"),
                @Mapping(source = "createTime", target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss"),
                @Mapping(source = "score", target = "score", numberFormat = "#.00")
        })
        public abstract Student userConvertToStudent(UserEntity userEntity);
    }

    @AfterMapping 和@MappingTarget

    对映射完的对象进行自定义处理(属性的自定义处理),标注@AfterMapping 注解的方法,会在对象映射完毕之后执行,可以在这个时机做一些处理;@MappingTarget标注在参数字段之前,标记这是映射完的目标对象。
    例子:UserEntity和Student映射完之后,,我们把StudentRoles中的id改变。

    @Data
    @AllArgsConstructor
    public class UserEntity {public Roles roles;}
    @Data
    @AllArgsConstructor
    public class Roles {public Long roleId;public String name;}
    @Data
    @AllArgsConstructor
    public class Student {public StudentRoles studentRoles;}
    @Data
    @AllArgsConstructor
    public class StudentRoles {public Long roleId;public String name;}
    @Mapper
    public abstract class UserConvert {
        public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
        @Mappings(
                @Mapping(source = "roles", target = "studentRoles")
        )
        public abstract Student UserEntityToStudent(UserEntity userEntity);
        // 下边方法会在UserEntity 和Student对象映射完执行
        @AfterMapping
        public void handleAfter(UserEntity userEntity, @MappingTarget Student student){
            // 对于映射完的对象做自定义处理
            student.getStudentRoles().setRoleId(100L);
        }
    }

    测试:

    // @SpringBootTest
    class SpringbootTest1ApplicationTests {
        @Test
        void convert() {
            Roles roles = new Roles(2L, "学生角色");
            Student student = UserConvert.INSTANCE.UserEntityToStudent(new UserEntity(roles));
            System.out.println(student.getStudentRoles());
        }
    }

     批量映射

    @Mapper
    public abstract class UserConvert {
        public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
        public abstract List<Student> userToStudent(List<Student> studentList); 
    }

    @BeanMapping

    ignoreByDefault:可忽略mapstruct的默认映射行为。避免不需要的赋值、避免属性覆盖。

    只会映射配置了@Mapping注解的字段。

    @Mapper
    public abstract class UserConvert {
        public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
        @BeanMapping(ignoreByDefault = true)
        public abstract Student UserEntityToStudent(UserEntity userEntity);
    }

     测试:

    @Test
        void convert() {
            Student student = UserConvert.INSTANCE.UserEntityToStudent(new UserEntity("lxc"));
            System.out.println(student);
        }

     结果,studentName字段没有被映射:

     添加@Mapping

    @Mapper
    public abstract class UserConvert {
        public static UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
        @BeanMapping(ignoreByDefault = true)
        @Mapping(source = "name", target = "studentName")
        public abstract Student UserEntityToStudent(UserEntity userEntity);
    }

    展开全文
  • mapstruct, 一种用于生成安全bean映射器 MapStruct - Java映射,简单的方法 ! 什么是 MapStruct?要求使用 MapStructMavenGradle文档并获取帮助信息。许可协议来自源代码的构建链接什么是
  • MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解
  • mapstruct-1.1.0.Final.jar

    2021-01-10 14:44:48
    mapstruct-1.1.0.Final.jarmapstruct-1.1.0.Final.jar
  • mapstruct-1.0.0.Final.jar

    2021-01-10 14:45:02
    mapstruct-1.0.0.Final.jarmapstruct-1.0.0.Final.jar
  • mapstruct-1.0.0.CR1.jar

    2021-01-10 14:45:25
    mapstruct-1.0.0.CR1.jarmapstruct-1.0.0.CR1.jarmapstruct-1.0.0.CR1.jar

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 330,135
精华内容 132,054
关键字:

Mapstruct