Java实体映射工具MapStruct使用详解
1.序
通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储;通常使用的BeanUtils.copyProperties方法也比较粗暴,不仅效率低下(使用反射)而且仅映射相同名的属性,多数情况下还需要手动编写对应的转换方法实现。
插件MapStruct以接口方法结合注解优雅实现对象转换,MapStruct生成器生成代码以更贴近原生的Setter、Getter方法处理属性映射更为高效。
https://github.com/mapstruct/mapstruct/
https://github.com/mapstruct/mapstruct-examples
2.简单用例
实体对象User
@Data
@AllArgsConstructor
public class User {
private int id;
private String name;
private int age;
private String address;
}
转换对象UserVO
@Data
public class UserVO {
private String name;
private int age;
}
转换接口
@Mapper
public interface UserConvert {
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
@Mapping(source = "name", target = "userName")
UserVO toVO(User entity);
}
使用示例
@Test
public void contextLoads() {
User user = new User(0, "Tester", 1, "上海市徐汇区");
UserVO userVO = UserConvert.INSTANCE.toVO(user);
}
3.使用详解
1)关于接口注解@Mapper几种属性用法详解
uses 使用其他手动编写的或者其他Mapper接口覆写相关的转换方法,不能循环引用
@Mapper(uses=DateMapper.class)
imports 引用相关类,允许通过mapping.expression()、mapping.defaultExpression()直接使用这些类型
@Mapper(imports = DateUtil.class)
public interface UserConvert {
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
@Mappings({
@Mapping(source = "name", target = "userName"),
// 以指定方法转换属性,这里如果不使用imports,则需要写全引用类包路径
@Mapping(target = "birthday", expression = "java(DateUtil.formatDate(entity.getBirthday()))")
})
UserVO toVO(User entity);
}
unmappedSourcePolicy、unmappedTargetPolicy 针对源类型/目标类型中未映射属性的反馈策略,主要有三种:IGNORE,默认值,忽略未映射的字段。WARN,警告。ERROR,报错
typeConversionPolicy 针对有损转换的反馈策略,例如Long转Integer
@Mapper(unmappedSourcePolicy = ReportingPolicy.ERROR)
componentModel 指定生成映射器实例的模式,主要有四种:default,不主动生成实例,通常以Mappers.getMapper(Class)实例化。cdi,以CDI标准实例化映射器,使用@Inject注入相关实例,spring,Spring Bean方式实例化,jsr330,jsr330标准实例化
@Mapper(componentModel = "spring")
public interface UserConvert {
@Mapping(source = "name", target = "userName")
UserVO toVO(User entity);
}
@Autowired
private UserConvert userConvert;
implementationName 指定实现类名称,映射生成器接口会自动生成实现类<CLASS_NAME>Impl,使用此属性可避免类冲突
implementationPackage 指定实现类包路径
config 指定配置类,由指定的@MapperConfig配置类,config导入相关配置
配置类
@MapperConfig(
uses = DateUtil.class,
unmappedSourcePolicy = ReportingPolicy.WARN
)
public interface UserConfig {
}
导入配置类
@Mapper(componentModel = "spring", config = UserConfig.class)
collectionMappingStrategy 集合映射策略,这里注意集合映射时,如果集合中的类型已有对应转换方法,集合转换时会优先使用
@Mappings({
@Mapping(source = "name", target = "userName"),
@Mapping(target = "birthday", expression = "java(DateUtil.formatDate(entity.getBirthday()))")
})
UserVO toVO(User entity);
List<UserVO> collectionCvt(List<User> entities);
GENERATED CODE 生成器生成代码
public List<UserVO> collectionCvt(List<User> entities) {
if (entities == null) {
return null;
} else {
List<UserVO> list = new ArrayList(entities.size());
Iterator var3 = entities.iterator();
while(var3.hasNext()) {
User user = (User)var3.next();
// 集合转换时优先使用了已定义的toVO方法
list.add(this.toVO(user));
}
return list;
}
}
nullValueMappingStrategy null作为源值映射策略;RETURN_NULL默认返回null, RETURN_DEFAULT返回默认值,对于对象会通过构造器自动构造对象返回,集合会返回空集合
当值为RETURN_DEFAULT时,如果映射规则中包含Mapping.expression、Mapping.constant必须手动判空处理,否则NPE
@MapperConfig(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
NullValuePropertyMappingStrategy null作为源属性映射策略;SET_TO_NULL默认返回null,SET_TO_DEFAULT返回默认值,IGNORE 忽略该值,以目标对象已存在的值为准
MappingInheritanceStrategy 继承方法级映射配置策略:EXPLICIT 显示使用InheritConfiguration生效。AUTO_INHERIT_FROM_CONFIG 自动继承正向转换的配置。AUTO_INHERIT_REVERSE_FROM_CONFIG 自动继承反向转换的配置。AUTO_INHERIT_ALL_FROM_CONFIG 都继承
@MapperConfig(
mappingInheritanceStrategy = MappingInheritanceStrategy.EXPLICIT
)
@InheritConfiguration
void cvtVO(User entity, @MappingTarget UserVO vo);
nullValueCheckStrategy 空值监测策略
2) 其他方法级别注解
@InheritInverseConfiguration 反向转换时继承映射规则
@Mapping 配置类型属性的映射规则;
dateFormat 格式化日期
@Mapping(target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss")
numberFormat 数字格式化
@Mapping(target = "price", numberFormat = "$#.00")
constant 常量
@Mapping(target = "age", constant = "0")
Java实体映射工具MapStruct使用详解的更多相关文章
- Java实体映射工具MapStruct的使用
官网地址:http://mapstruct.org/ MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体.例如我们在实际 ...
- 推荐一个 Java 实体映射工具 MapStruct
声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...
- 【工具库】Java实体映射工具MapStruct
一.什么是MapStruct? MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,虽然Spring库和 Apache ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- 日志分析工具ELK配置详解
日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...
- 【转】Java魔法堂:String.format详解
Java魔法堂:String.format详解 目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六. ...
- java线程池的使用与详解
java线程池的使用与详解 [转载]本文转载自两篇博文: 1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html ...
- hibernate集合映射inverse和cascade详解
hibernate集合映射inverse和cascade详解 1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
随机推荐
- 网络IO模型与Reactor模式
一.三种网络IO模型: 分类: BIO 同步的.阻塞式 IO NIO 同步的.非阻塞式 IO AIO 异步非阻塞式 IO 阻塞和同步的概念: 阻塞:若读写未完成,调用读写的线程一直等待 非阻塞:若读写 ...
- css 参考手册 部署到本地
* 到css参考手册网站 http://css.doyoe.com/ 下载chm手册 * 到github下载对应的html页面 cd /Applications/XAMPP/htdocs git cl ...
- 配置阿里云maven
在安装好Maven之后,默认的~/.m2目录下是没有maven仓库配置文件settings.xml的,默认使用的是官方的仓库,访问速度会非常慢,我们需要配置下国内的仓库. 创建~/.m2/settin ...
- str.strip(chars)
strip会去除给定字符串的指定字符,指定字符可以是一个或多个,去除从左右分别进行,没有则忽略,如果需要去除某个中间的字符,必须先去除外围的字符 看几个例子,以s为例,故意设置为非对称结构, s = ...
- 🧚♂️全套Java教程_Java基础入门教程,零基础小白自学Java必备教程👨💻004 # 第四单元 流程控制语句上 #
一.本单元知识点概述 二.本单元目标 (Ⅰ)重点知识目标 1.if语句的格式及执行流程2.switch语句的格式及执行流程 (Ⅱ)能力目标 1.掌握if语句的格式及执行流程2.掌握switch语句的格 ...
- 7.JVM调优-方法区,堆,栈调优详解
通常我们都知道在堆空间新生代Eden区满了,会触发minor GC, 在老年代满了会触发full GC, 触发full GC会导致Stop The World, 那你们知道还有一个区域满了一会触发Fu ...
- Markdown语法熟悉
==(1)标题== # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 ==(2)字体== **加粗** *斜体* ***斜体加粗*** ...
- 题解 CF1103E Radix sum
题目传送门 题目大意 给出一个\(n\)个数的序列\(a_{1,2,..,n}\),可以选\(n\)次,每次可以选与上次选的相同的数,问对于\(\forall p\in[0,n-1]\)满足选出来的数 ...
- 洛谷2046 NOI2010海拔
QwQ题目太长 这里就不复制了 题目 这个题...算是个比较经典的平面图最小割变成对偶图的最短路了QwQ 首先考虑最小割应该怎么做. 有一个性质,就是每个点的海拔要么是1,要么是0 QwQ不过这个我不 ...
- 洛谷3317 SDOI2014重建(高斯消元+期望)
qwq 一开始想了个错的做法. 哎 直接开始说比较正确的做法吧. 首先我们考虑题目的\(ans\)该怎么去求 我们令\(x\)表示原图中的某一条边 \[ans = \sum \prod_{x\in t ...