java之mapstruct的应用
一、MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性都是相同的,只有少部分的不同,通过mapStruct,可以让不同实体之间的转换变的简单。我们只需要按照约定的方式进行配置即可。
MapStruct是一个可以处理注解的Java编译器插件,可以在命令行中使用,也可以在IDE中使用。MapStruct有一些默认配置,但是也为用户提供了自己进行配置的途径。
缺点就是这玩意在使用工具自带的编译器是,不会生成实现类,需要通过maven的方式来进行编辑,才会生成实现类,总体上面来说还是很好用的。相对于BeanUtil等,简介性还是很明显的。目前MapStruct的版本基本都是固定了,可以自己尝试着弄一下。
官方api文档地址:http://mapstruct.org/documentation/stable/reference/html/
二、用到MapStruct需要一个依赖包和一个插件(pom.xml的官方配置)
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.2.0.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source> <!-- or higher, depending on your project -->
<target>1.8</target> <!-- or higher, depending on your project -->
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
三、我这里谢了一个简单的例子供参考
package com.troy.jpa.service.mapper; import com.troy.jpa.dto.UserDTO;
import com.troy.jpa.entity.User;
import com.troy.jpa.service.util.AgeUtil;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings; import java.util.List; @Mapper(componentModel = "spring", uses = {AgeUtil.class})
public interface UserMapper { @Mappings({
@Mapping(source = "age", target = "age", qualifiedByName = {"AgeUtil", "ageAdd"}),
})
UserDTO userToDTO(User user); @InheritConfiguration
User DTOToUser(UserDTO userDTO); List<UserDTO> userListToDTOList(List<User> users); }
package com.troy.jpa.service.util; import org.springframework.stereotype.Component; import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; @Component
public class AgeUtil { public String ageAdd(String age) throws ScriptException {
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("JavaScript");
Object eval = engine.eval(age + "+1");
return eval.toString();
}
}
说明:
1)在接口上面加入@Mapper,就可以实现实体和DTO之间的装换
2)componentModel 是加入模块,一般都是spring容器,在实现类中会加入@Component注解
3)uses引入外部类,用于实体和DTO之间的工具类
4) 多个@Mapping在@Mappings里面编写,也可以单个编写@Mapping。如果实体和DTO之间数据字段一样,可以不加任何注解
5)qualifiedByName 的用法,主要是用来转换特殊数据处理的自定义方式。{}中第一个代表bean,第二种达标方法。
6)@InheritConfiguration 的用法,也就是反向映射。当source,target字段不一样,写第一个。其它的映射可以不用再写@Mapping,直接加入@InheritConfiguration注解即可
7)@Mapping 中的ignore 赋值 true可以忽略某个字段(这个主要是在字段相同,但是类型不同,并且不能装换的时候用)
四、当然我这里主要是写的几种常用的用法,mapstruct中还有其他的写法,和api我这里不一一介绍。我提到的主要是比较常用的写法,其他很多方式。可能会用到。但是可以作为自己学习的开始。
java之mapstruct的应用的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 推荐一个 Java 实体映射工具 MapStruct
声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...
- 业务代码的救星——Java 对象转换框架 MapStruct 妙用
简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...
- Java实体映射工具MapStruct的使用
官网地址:http://mapstruct.org/ MapStruct 是一个代码生成器,简化了不同的 Java Bean 之间映射的处理,所谓的映射指的就是从一个实体变化成一个实体.例如我们在实际 ...
- mapstruct解放Java对象转换
摘要 当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换.这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手 ...
- 【工具库】Java实体映射工具MapStruct
一.什么是MapStruct? MapStruct是用于代码中JavaBean对象之间的转换,例如DO转换为DTO,DTO转换为VO,或Entity转换为VO等场景,虽然Spring库和 Apache ...
- Java实体映射工具MapStruct使用详解
1.序 通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储:通常使用的BeanUtils.copyProperties方法 ...
- Java编码辅助工具:Mapstruct—— Java对象转换框架
项目开发中,业务分层会涉及不同类型的Bean之间需要相互转换,如PO与DTO之间,PO与VO之间等.手动编码setter/getter各个对应属性,会显得臃肿繁琐.通过Mapstruct框架可简单方便 ...
- Java资源大全中文版(Awesome最新版)
Awesome系列的Java资源整理.awesome-java 就是akullpp发起维护的Java资源列表,内容包括:构建工具.数据库.框架.模板.安全.代码分析.日志.第三方库.书籍.Java 站 ...
随机推荐
- Recover Binary Search Tree,恢复二叉排序树
问题描述:题意就是二叉树中有两个节点交换了,恢复结构. Two elements of a binary search tree (BST) are swapped by mistake. Recov ...
- codeforces 354 div2 C Vasya and String 前缀和
C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 使用CAS实现无锁的SkipList
无锁 并发环境下最常用的同步手段是互斥锁和读写锁,例如pthread_mutex和pthread_readwrite_lock,常用的范式为: void ConcurrencyOperation() ...
- 菜单项onCreateOptionsMenu()和onOptionsItemSelected()的使用
Java源文件 package com.example.macname.myapplication; import android.support.v7.app.AppCompatActivity; ...
- Docker简单部署Ceph测试集群
通过docker可以快速部署小规模Ceph集群的流程,可用于开发测试. 以下的安装流程是通过linux shell来执行的;假设你只有一台机器,装了linux(如Ubuntu)系统和docker环境, ...
- domain---Node.js 异步异常的处理与domain模块解析
var domain = require('domain'); app.use(function (req, res, next) { var reqDomain = domain.create(); ...
- LeetCode 47
class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) ...
- Ubuntu 分区方安
方案一: / 40G/boot 200MBswap 1G-2G /home 20G 剩 下的分为几个独立的分区,不用指定挂载点,而是安装完成后修改 /etc/fstab ,将这些区挂载在/home的子 ...
- Python - Learn Note (2)
Python注释 Python的注释以#开头,后面的文字直到行尾都算注释 Python基本数据类型 整数.浮点数(浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置 ...
- HALCON之喷码OCR识别案例
一个喷码识别的案例 1 read_image (Image, 'D:/用户目录/Desktop/2.png') 2 3 rgb1_to_gray(Image, Image) 4 5 get_image ...