zoukankan      html  css  js  c++  java
  • 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我这里不一一介绍。我提到的主要是比较常用的写法,其他很多方式。可能会用到。但是可以作为自己学习的开始。

  • 相关阅读:
    ffmpeg中的sws_scale算法性能测试
    ffmpeg 新老接口问题及对照集锦
    入门视频采集与处理(显示YUV数据)
    RGB与YUV图像视频格式的相互转换
    ffmpeg视频解码简明教程
    FFmpeg源代码简单分析——sws_getContext()
    FFmpeg解码H264及swscale缩放详解
    我所理解的ThreadLocal
    网络通信Socket模块实现文件传输
    设计一个基于flask的高并发高可用的查询ip的http服务
  • 原文地址:https://www.cnblogs.com/ll409546297/p/8258435.html
Copyright © 2011-2022 走看看