博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MapStruct使用和原理分析
阅读量:2065 次
发布时间:2019-04-29

本文共 3584 字,大约阅读时间需要 11 分钟。

在代码开发中,经常会遇到不同实体类之间的字段copy,以前经常用到的有通过set赋值或者apache、spring的BeanUtils.copyProperties(),原生的set赋值随便速度比较快,但是当字段多的时候,就显得比较麻烦了,每个都要自己手动set一下值,而apache、spring的BeanUtils.copyProperties()可以解决这种字段比较多的情况,但是这种方式有个弊端,就是,字段的类型和名称都必须一样才可以,否则copy时会被忽略掉,还有个关键的问题就是apache的BeanUtils.copyProperties()效率比较低,spring的BeanUtils.copyProperties()效率还可以。直到接触了一种新的方式,使用MapStruct方式。

加入MapStruct的依赖jar包

1.2.0.Final
org.mapstruct
mapstruct-jdk8
${mapstruct.version}
org.mapstruct
mapstruct-processor
${mapstruct.version}

创建实体类User

public class User {    private Integer id;    private String userName;    private String desc;    private Integer age;    private Double salary;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getDesc() {        return desc;    }    public void setDesc(String desc) {        this.desc = desc;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public Double getSalary() {        return salary;    }    public void setSalary(Double salary) {        this.salary = salary;    }}

创建UserDTO类

public class UserDTO {    private Integer id;    private String userName;    private Date createDate;    private String remark;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public Date getCreateDate() {        return createDate;    }    public void setCreateDate(Date createDate) {        this.createDate = createDate;    }    public String getRemark() {        return remark;    }    public void setRemark(String remark) {        this.remark = remark;    }    public UserDTO() {    }    @Override    public String toString() {        return "UserDTO{" +                "id=" + id +                ", userName='" + userName + '\'' +                ", createDate=" + createDate +                ", remark='" + remark + '\'' +                '}';    }

创建接口UserMapStruct

import org.mapstruct.MapMapping;import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.Mappings;import org.mapstruct.factory.Mappers;@Mapperpublic interface UserMapStruct {    UserMapStruct INSTANCE = Mappers.getMapper(UserMapStruct.class);    @Mappings({        @Mapping(source = "desc",target = "remark")    })    public UserDTO userToDto(User user);}

代码测试

public class TestUserMapStruct {    public static void main(String[] args) {        User user = new User();        user.setId(1000);        user.setAge(21);        user.setDesc("测试复制工具");        user.setSalary(400.44);        user.setUserName("张三");        UserDTO userDTO = UserMapStruct.INSTANCE.userToDto(user);        System.out.println(userDTO.toString());    }}

输出结果

我们可以看到字段的值已经赋值到UserDTO上了。

MapStruct原理:

MapStruct是基于JSR 269的Java注解处理器,因此可以在命令行构建中使用(javac、Ant、Maven等等),也可以在IDE内使用。包括以下几个组件

org.mapstruct:mapstruct:包含了必要的注解,例如@Mapping;在Java 8或更高版本中,使用

org.mapstruct:mapstruct-jdk8,而不是利用Java 8中引入的语言进行改进。
org.mapstruct:mapstruct-processor:包含生成映射器实现的注解处理器
在编译过程中会根据自己的Mapper接口生成对应的实现类,比如上面定义的UserMapStruct类
 

 

 

 

 

 

 

 

 

 

 

转载地址:http://pswmf.baihongyu.com/

你可能感兴趣的文章
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java集合框架知识梳理
查看>>
笔试题(一)—— java基础
查看>>
Redis学习笔记(二)— 在linux下搭建redis服务器
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>
Intellij IDEA使用(二)—— 在Intellij IDEA中配置JDK(SDK)
查看>>
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
程序员涨薪宝典
查看>>