首页 > 其他分享 >MapStruct的使用

MapStruct的使用

时间:2022-11-20 15:34:58浏览次数:61  
标签:return MapStruct mapstruct version 使用 Date org lombok


目录

  • ​​pom.xml​​
  • ​​在不使用 lombok 的情况下使用 mapstruct​​
  • ​​同时使用 lombok、mapstruct​​
  • ​​基本使用​​
  • ​​作为bean注入​​
  • ​​自定义类型转换​​
  • ​​自定义字段映射​​


 

mapstruct 是一个bean copy、类型转换的类库,在编译时自动生成生成转换的硬编码代码,执行效率极高

pom.xml

在不使用 lombok 的情况下使用 mapstruct

<properties>
<java.version>1.8</java.version>
<mapstruct.version>1.5.3.Final</mapstruct.version>
</properties>

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

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<!-- 引入mapstruct-processor -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>

 

同时使用 lombok、mapstruct

二者都是在编译时自动生成代码,mapstruct 会用到 lombok 生成的getter、setter方法,引入时需要配置执行顺序

<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.20</lombok.version>
<mapstruct.version>1.5.3.Final</mapstruct.version>
</properties>

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

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<!-- 先执行lombok-processor -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<!-- 再执行mapstruct-processor -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>

 

基本使用

@Mapper  //是mapstruct的注解,不是mybatis的注解
public interface UserMapper {

/**
* 对象转对象
*/
UserVo bo2Vo(UserBo bo);

/**
* list转list
*/
List<UserVo> bos2Vos(List<UserBo> bos);

}
//获取mapper实例
UserMapper userMapper = Mappers.getMapper(UserMapper.class);

UserVo userVo = userMapper.bo2Vo(userBo);
List<UserVo> userVos = userMapper.bos2Vos(userBos);

如果修改mapper接口后编译、执行报错,可能是未生成最新的代码实现,可以尝试 mvn clean 后重新编译。

 

作为bean注入

//会作为bean放到spring容器中,也可以使用对应的常量 MappingConstants.ComponentModel.SPRING
@Mapper(componentModel = "spring")
public interface UserMapper {

}
@Resource
private UserMapper userMapper;

 

自定义类型转换

其它常见的bean copy框架,往往需要字段名、数据类型相同,才会复制;mapstruct默认字段名相同就会复制,如果字段名相同,但mapstruct编译生成代码时无法实现对应数据类型的转换,编译时会报错,通不过编译

//可以用uses引入需要的类型转换mapper,值是Class[],同名字段会自动使用引入的转换mapper中对应的方法进行转换
@Mapper(uses = {ConvertMapper.class})
public interface UserMapper {

}
import org.mapstruct.Mapper;

import java.util.Date;

/**
* 转换mapper
*/
@Mapper //mapstruct的注解
public interface ConvertMapper {

/**
* Date转时间戳
*
* @param date Date对象
* @return Long
*/
static Long date2Timestamp(Date date) {
return date == null ? null : date.getTime();
}

/**
* 时间戳转Date
*
* @param timestamp 时间戳
* @return Date
*/
static Date timestamp2Date(Long timestamp) {
return timestamp == null ? null : new Date(timestamp);
}

/**
* Integer 转 Boolean
*
* @param intValue 整型数据
* @return Boolean
*/
static Boolean int2Boolean(Integer intValue) {
if (intValue == null || intValue == 0) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}

/**
* Boolean 转 Integer
*
* @param boolValue 布尔类型数据
* @return Integer
*/
static Integer bool2Integer(Boolean boolValue) {
if (boolValue == null || !boolValue) {
return 0;
}
return 1;
}

}
  • 不局限于jdk自带的数据类型转换,也可以写自定义的实体类之间的转换
  • 生成代码时,mapstruct会自动使用当前mapper中已存在的方法、uses引入的mapper中的方法

 

自定义字段映射

@Mapper
public interface UserMapper {

//分别指定参数、目标类中的字段,可同时标注多个 @Mapping
@Mapping(source = "tel", target = "phoneNumber")
@Mapping(source = "name", target = "username")
UserVo bo2Vo(UserBo bo);


//同时使用多个时,也可以放在 @Mappings 中
@Mappings({
@Mapping(source = "tel", target = "phoneNumber"),
@Mapping(source = "name", target = "username")
})
UserVo bo2Vo(UserBo bo);


//只有1个参数时可以不带参数名,有多个参数时要带上参数名
@Mapping(source = "userBo.userId", target = "userId")
@Mapping(source = "orderBo.amount", target = "orderAmount")
UserVo bo2Vo(UserBo userBo, OrderBo orderBo);

}


标签:return,MapStruct,mapstruct,version,使用,Date,org,lombok
From: https://blog.51cto.com/u_12462157/5871521

相关文章

  • libusb系列-007-Qt下使用libusb1.0.26源码
    libusb系列-007-Qt下使用libusb1.0.26源码文章目录​​libusb系列-007-Qt下使用libusb1.0.26源码​​​​摘要​​​​安装编译环境​​​​确认需要的文件​​​​开始编译......
  • EasyX图形库安装,以及使用样例(vc6.0,vs2013,其他类同)
    ①​​官网下载​​②解压安装(由于自己电脑安装了vc6.0和vs2013以该两个为例,其他都是一样的安装方法)③图形库测试利用图形库画星空(l编译器vs2013)#include<stdafx.h>#......
  • github加速器 FastGithub的安装与使用
    github加速器FastGithub的安装与使用国内访问github网址不稳定,时而可以访问时而访问失败,找到了一个稳定的方法来访问,通过FastGithub加速来进行访问工作原理修改本机......
  • 使用数据库连接池Druid 时 如果未主动关闭连接,会怎样 备忘录
     开启连接泄露检测:removeAbandoned=true一旦开启,CreateConnectionThread线程就会每隔 timeBetweenEvictionRunsMillis毫秒轮询一次,检测是否存在running=false......
  • Django中使用Redis---通用方案和第三方django-redis
    1.通用方案通用方案和Django没关系,其他框架也是一样用。首先,在user文件夹下,建立pool.py└─apps│├─user│││pool.py│││views.py│││......
  • docker使用
    例子:dockerrun-d--namegame-p8080:80game2048映射到系统的8080端口 ​​http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/​​ yumi......
  • Jedis的使用
    Jedis的使用Jedis是为redis设计的一个java客户端,目的是提高性能与易用性。目前Jedis与lettuce是redis官方推荐使用的javaredis客户端官方文档介绍:https://redis.io/r......
  • 使用Gradle编译Spring源码
    最近想研究下spring的源码,决定先把源码跑起来,在此记录一下本次遇到的问题。本次使用的工具有:git、IDEA2021社区版、jdk17、gradle7.5.1从BuildfromSource得知,需要git和......
  • windows--cmake与c++的使用教程(13)
    1概述本文基于前文环境本节目标:为发布项目关闭调试控制台(/SUBSYSTEM:WINDOWS)2CMake脚本设置debug显示控制台还是很有帮助的,可输出调试信息到控制台,观察成勋运......
  • windows--cmake与c++的使用教程(12)
    1概述本文基于前文环境本节目标:为项目增加链接选项:requireAdministrator(/level='requireAdministrator'),用于增加管理员权限2目标程序安装C盘(windows默认系......