网文网站开发方案,以绿色为主色的网站模版,2021安全员证报名入口,一个网站如何做推广方案老铁们是不是经常为写一些实体转换的原始代码感到头疼#xff0c;尤其是实体字段特别多的时候。有的人会说#xff0c;我直接使用get/set方法。没错#xff0c;get/set方法的确可以解决#xff0c;而且也是性能较高的处理方法#xff0c;但是大家有没有想过#xff0c;要…老铁们是不是经常为写一些实体转换的原始代码感到头疼尤其是实体字段特别多的时候。有的人会说我直接使用get/set方法。没错get/set方法的确可以解决而且也是性能较高的处理方法但是大家有没有想过要是转换的实体字段比较多那么get/set方法的代码量是非常恐怖的有人会说用自带的BeanUtils工具类但在属性拷贝的过程中会遇到类型转换异常或是影响性能等等问题。所以我把自己项目中使用的这款转换神器分享出来。BeanUtils属性复制
之前对各种属性映射工具的性能进行了简单的对比结果如下 先贴下官网地址吧https://mapstruct.org/ 一、pom 配置 !-- 属性设置 --propertiesjava.version1.8/java.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingmybatisPlus.version3.5.3.1/mybatisPlus.versionlombok.version1.18.26/lombok.versionmysql.version8.0.30/mysql.versionalibaba.druid.version1.2.4/alibaba.druid.versionthymeleaf.version3.0.15.RELEASE/thymeleaf.versionspring4.version3.0.12.RELEASE/spring4.versionmapstruct.version1.5.3.Final/mapstruct.version/properties!-- 依赖关系 --dependencies!-- springmvc --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 测试test --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId/dependency!-- jpa(持久层) --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId/dependency!--mybatis-plus依赖--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion${mybatisPlus.version}/version/dependency!--lombok依赖--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/version/dependency!-- mysql(数据库) --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql.version}/version/dependency!-- alibaba数据库连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion${alibaba.druid.version}/version/dependencydependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf/artifactIdversion${thymeleaf.version}/version/dependency!-- Spring 4集成包这可能是Spring应用程序所需的一切--dependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf-spring4/artifactIdversion${spring4.version}/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdoptionaltrue/optional/dependency!-- 属性转换 --dependencygroupIdorg.mapstruct/groupIdartifactIdmapstruct/artifactIdversion${mapstruct.version}/version/dependency!-- idea 2018.1.1 之前的版本需要添加下面的配置后期的版本就不需要了可以注释掉我自己用的2022.2.3 --!-- dependency--!-- groupIdorg.mapstruct/groupId--!-- artifactIdmapstruct-processor/artifactId--!-- version${org.mapstruct.version}/version--!-- scopeprovided/scope--!-- /dependency--/dependencies!-- 编译插件 --buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationincludeSystemScopetrue/includeSystemScope/configuration/plugin!-- 原有工具自带的编译器时无法生成实现类需要maven 的方式来进行编译才会生成属性转换的实现类。需添加以下依赖 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource${java.version}/sourcetarget${java.version}/targetannotationProcessorPaths!-- lombok的依赖位置一定放在mapstruct之前 否则转换后的对象获取不到属性值 --pathgroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/version/pathpathgroupIdorg.mapstruct/groupIdartifactIdmapstruct-processor/artifactIdversion${mapstruct.version}/version/path/annotationProcessorPaths/configuration/plugin/plugins/build
/projectPSlombok和mapstruct的版本兼容问题可以直接使用上面pom里的版本
1、maven插件要使用3.6.0版本以上
2、lombok使用1.16.16版本以上
3、另外编译的lombok和mapstruct的插件不要忘了加上。否则会出现下面的错误No property named aaa exists in source parameter(s). Did you mean null? 二、转换实体类
⑴.源实体1
package com.***;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** 学生*/
Data
Builder
AllArgsConstructor
NoArgsConstructor
public class Student {/*** ID*/private Long userId;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 手机号*/private String phone;/*** 性别(1男 2女)*/private Integer sex;/*** 生日*/private String birthday;/*** 创建时间*/private Date createTime;}⑵.源实体2
package com.***;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 课程*/
Data
Builder
AllArgsConstructor
NoArgsConstructor
public class Course {/*** 课程ID*/private Long courseId;/*** 课程名称*/private String courseName;/*** 序号*/private Integer sortNo;}⑶.目标实体1
package com.***;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** 学生Vo*/
Data
Builder
AllArgsConstructor
NoArgsConstructor
public class StudentVo {/***用户ID */private Long userId;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 手机号*/private String phone;/*** 性别(1男 2女)*/private Integer gender;/*** 生日*/private String birthday;/*** 创建时间*/private Date createTime;}⑷.目标实体2
package com.***;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 学生课程Vo*/
Data
Builder
AllArgsConstructor
NoArgsConstructor
public class StudentCourseVo {/*** 学生姓名*/private String name;/*** 年龄*/private Integer age;/*** 性别(1男 2女)*/private String gender;/*** 生日*/private String birthday;/*** 课程名称*/private String course;}⑸.转换Mapper接口编译完成后会自动生成相应的实现类
package com.***;import com.test.java.domain.entity.Course;
import com.test.java.domain.entity.Student;
import com.test.java.domain.vo.StudentCourseVo;
import com.test.java.domain.vo.StudentVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 转换mapper*/
Mapper
public interface StudentWrapper {StudentWrapper INSTANCE Mappers.getMapper(StudentWrapper.class);// 转换一实体转实体Mapping(target userId, ignore true)Mapping(source sex, target gender)Mapping(target createTime, expression java(new java.util.Date()))Mapping(source name, target name, defaultValue 张三)StudentVo convertVo(Student student);// 转换二list转listListStudentVo convertList(ListStudent list);// 转换三多对象转换一个对象Mapping(source student.sex, target gender)Mapping(source course.courseName, target course)StudentCourseVo convertTo(Student student, Course course);}现在就可以直接使用mapper接口进行属性转换了以下举例有三种转换用法
1、转换一对象转对象
2、转换二集合转集合
3、转换三多个对象转单一对象 public static void main(String[] args) {// 转换一Student student Student.builder().userId(100L).age(18).phone(13012345678).sex(1).birthday(01-01).build();StudentVo convertVo StudentWrapper.INSTANCE.convertVo(student);System.out.println(转换一、实体转实体 convertVo);// 转换二Student student1 Student.builder().userId(1L).name(张三).age(18).phone(13012345678).sex(1).birthday(01-01).createTime(new Date()).build();Student student2 Student.builder().userId(2L).name(李四).age(20).phone(15026668652).sex(2).birthday(05-01).createTime(new Date()).build();ListStudent list new ArrayList();list.add(student1);list.add(student2);ListStudentVo convertList StudentWrapper.INSTANCE.convertList(list);System.out.println(转换二、list转list convertList);// 转换三Student student3 Student.builder().name(小明).age(18).phone(13512365568).sex(1).birthday(05-06).createTime(new Date()).build();Course course Course.builder().courseName(《Java从入门到放弃》).sortNo(1).build();StudentCourseVo convertTo StudentWrapper.INSTANCE.convertTo(student3, course);System.out.println(转换三、多对象转换一个对象 convertTo);}
转换结果 三、特殊处理
mapper转换接口中还可以进行字段映射改变字段类型指定格式化、赋予默认值、过滤不需要转换的字段、自定义转换等方式包括一些日期的默认处理只需在Mapping注解中添加相应参数即可如下
字段映射Mapping(source sex, target gender)StudentVo convertVo(Student student);
source代表源字段
target代表目标字段
日期格式化Mapping(source createTime,target createTime,dateFormat yyyy-MM-dd HH:mm:ss)StudentVo convertVo(Student student);
默认值Mapping(source name, target name, defaultValue 张三)StudentVo convertVo(Student student); defaultValue转换时赋予默认值
过滤不需要转换的字段Mapping(target userId, ignore true)StudentVo convertVo(Student student);
ignore默认为false不过滤
自定义转换Mapping(target createTime, expression java(new java.util.Date()))StudentVo convertVo(Student student);
expression自定义转换规则当前案例是createTime字段获取当前系统时间 如果这篇文章对您有所帮助或者有所启发的话求一键三连点赞、评论、收藏➕关注您的支持是我坚持写作最大的动力。