mapstruct 使用总结

介绍

mapstruct 专门用来处理 domin 实体类与 model 类的属性映射的,我们只需定义 mapper 接口,mapstruct 在编译的时候就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现
简单说:快捷实现domain 实体与DTO 、VO实体的映射转化。

使用

引入

在pom.xml中引入jar包

	<!--mapstruct核心-->
	<dependency>
	 	<groupId>org.mapstruct</groupId>
	    <artifactId>mapstruct</artifactId>
	    <version>1.3.1.Final</version>
	</dependency>
	<!--mapstruct编译-->
	<dependency>
	    <groupId>org.mapstruct</groupId>
	    <artifactId>mapstruct-processor</artifactId>
	    <version>1.3.1.Final</version>
	</dependency>

注:mapstruct-jdk8 这种引用方式官方已经废弃

 <dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.3.1.Final</version>
</dependency>

使用方式

spring 中注入:

@Mapper
public interface UserRoleMapper {

    /**
     * 获取该类自动生成的实现类的实例
     * 接口中的属性都是 public static final 的 方法都是public abstract的
     */
    UserRoleMapper INSTANCES = Mappers.getMapper(UserRoleMapper.class);

    /**
     * 这个方法就是用于实现对象属性复制的方法
     *
     * @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性
     *
     * @param user 这个参数就是源对象,也就是需要被复制的对象
     * @return 返回的是目标对象,就是最终的结果对象
     */
    @Mappings({
            @Mapping(source = "id", target = "userId"),
            @Mapping(source = "username", target = "name"),
            @Mapping(source = "role.roleName", target = "roleName")
    })
    UserRoleDto toUserRoleDto(User user);
@RestController
public class DemoMapstructApplication {

    @Autowired
    private UserRoleMapper  mapper;
    
    @GetMapping("convert3")
    public String convertEntity3() {
      	Role role  = new Role(2L, "administrator", "超级管理员");
   		user  = new User(1L, "zhangsan", "12345", "17677778888", "123@qq.com", role);
   		UserRoleDto userRoleDto = mapper.toUserRoleDto(user);
        return userRoleDto.toString();
    }
    
}

javabeen:

@Mapper(componentModel = "spring")
public interface UserRoleMapper {

    /**
     * 获取该类自动生成的实现类的实例
     * 接口中的属性都是 public static final 的 方法都是public abstract的
     */
    UserRoleMapper INSTANCES = Mappers.getMapper(UserRoleMapper.class);

    /**
     * 这个方法就是用于实现对象属性复制的方法
     *
     * @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性
     *
     * @param user 这个参数就是源对象,也就是需要被复制的对象
     * @return 返回的是目标对象,就是最终的结果对象
     */
    @Mappings({
            @Mapping(source = "id", target = "userId"),
            @Mapping(source = "username", target = "name"),
            @Mapping(source = "role.roleName", target = "roleName")
    })
    UserRoleDto toUserRoleDto(User user);
public static void main(String[] args) {
	Role role  = new Role(2L, "administrator", "超级管理员");
    user  = new User(1L, "zhangsan", "12345", "17677778888", "123@qq.com", role);
	UserRoleDto userRoleDto = UserRoleMapper.INSTANCES.toUserRoleDto(user);
	System.out.println(userRoleDto);  
}

问题总结

MapStruct需要Impl类

参考: java - MapStruct需要实现类
没有引入 mapstruct-processor-xx 包导致的

参考

MapStruct超级简单的学习笔记_qq122516902的博客-CSDN博客_mapstruct

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
廖雪峰的 Python 教程 4 关于作者 4 Python 简介 6 安装 Python 9 Python 解释器 12 第一个 Python 程序 14 使用文本编辑器 17 Python 代码运行助手 20 输入和输出 25 Python 基础 28 数据类型和变量 29 字符串和编码 37 使用 list 和 tuple 46 条件判断 53 循环 58 使用 dict 和 set 63 函数 70 调用函数 72 定义函数 75 函数的参数 80 递归函数 93 高级特性 97 切片 98 迭代 102 列表生成式 105 生成器 109 迭代器 118 函数式编程 121 高阶函数 122 map/reduce 125 filter 130 sorted 134 返回函数 137 匿名函数 141 装饰器 143 偏函数 148 模块 151 使用模块 153 安装第三方模块 157 面向对象编程 159 类和实例 161 访问限制 165 继承和多态 169 获取对象信息 175 实例属性和类属性 183 面向对象高级编程 185 使用 slots 186 使用@property 189 多重继承 193 定制类 198 使用枚举类 209 使用元类 212 错误、调试和测试 221 错误处理 222 调试 233 单元测试 239 文档测试 244 IO 编程 249 文件读写 250 StringIO 和 BytesIO 254 操作文件和目录 257 序列化 261 进程和线程 267 多进程 269 多线程 278 ThreadLocal 285 进程 vs. 线程 289 分布式进程 292 正则表达式 298 常用内建模块 304 datetime 305 collections 312 base64 317 struct 320 hashlib 322 itertools 327 contextlib 331 XML 336 HTMLParser 341 urllib 344 常用第三方模块 349 virtualenv 355 图形界面 357 网络编程 361 TCP/IP 简介 362 TCP 编程 364 UDP 编程 370 电子邮件 373 SMTP 发送邮件 375 POP3 收取邮件 384 访问数据库 390 使用 SQLite 395 使用 MySQL 399 使用 SQLAlchemy 403 Web 开发 408 HTTP 协议简介 410 HTML 简介 417 WSGI 接口 422 使用 Web 框架 428 使用模板 433 异步 IO 439 协程 441 asyncio 445 async/await 449 aiohttp 451 实战 453 Day 1 - 搭建开发环境 457 Day 2 - 编写 Web App 骨架 459 Day 3 - 编写 ORM 461 Day 4 - 编写 Model 471 Day 5 - 编写 Web 框架 477 Day 6 - 编写配置文件 484 Day 7 - 编写 MVC 486 Day 8 - 构建前端 488 Day 9 - 编写 API 499 Day 10 - 用户注册和登录 501 Day 11 - 编写日志创建页 511 Day 12 - 编写日志列表页 520 Day 13 - 提升开发效率 527 Day 14 - 完成 Web App 532 Day 15 - 部署 Web App 534 Day 16 - 编写移动 App 544 FAQ 546 期末总结 549
Mapreduce实验报告 前言和简介 MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计 算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分 ,分别解决然后合并得到最终结果。Mapreduce可以让程序员以简单的程序来解决实际问 题,而隐藏了诸如分布、工作调度、容错、机器间通信,使得大规模任务简单而迅速地 完成。 1. Mapreduce的基本原理 1. 核心思想。 "Divide and Conquer"是Mapreduce的核心思想。面对一个规模庞大的问题,要 处理是以TB计的数据,Mapreduce采用"输入"------"分解"------"解决"----- -"聚合"------"输出结果"的基本过程。 2. 基本原理 Map和Reduce是两个核心操作,用户定义的map函数接收被切割过的原始的key/ value对集并且计算出一个中间key/value对集。Mapreduce库函数将所有的具有 相同key值的value聚合在一起交给用户定义的reduce函数处理。reduce函数将 同一key值的所有value合并成得到输出文件。在整个过程中,Mapreduce库函数 负责原始数据的切割,中间key/value对集的聚合,以及任务的调度,容错、通 信控制等基础工作。而用户定义的map和reduce函数则根据实际问题确定具体操 作。 2. 框架的基本结构和执行流程 基本结构 Mapreduce框架的主要程序分为三种即Master,Map和Reduce。 1. Master:主要功能有两个,任务的分割和任务的调度。Master把输入文件切成许 多个split,每个split文件一般为几十M。Master同时还要调度任务监视各个 map worker和reduce worker的工作状态,以做出相应的安排。Master还要监视各个子任务的完成进 展情况。 Master用到的数据结构 Struct Split[] //文件切割后的信息 struct MapSTATE[] //记录各个map任务的情况。 struct ReduceSTATE[R] //各个reduce任务的情况。 Type Map=0,Reduce=0 //记录map任务和reduce任务的完成个数。 MapWorkerSTATE[] ReduceWorkerSTATE[] //各个工作机器的忙闲状态 FileSplit(string inputfilename) //输入文件切割 JobAssign() //工作任务分配 2. Map:主要功能是读取经过切割split文件形成一个map任务,分析map任务,得到 中间结构并且将同一类型的中间文件存放在同一个区域内等待特定的reduce程 序读取。 3. Reduce:不同的Reduce读取各个Map得到的特定的中间文件,将所有相同的中间 文件整合成最后的输出文件。 任务执行基本流程 基本流程图见下一页 首先输入收据文件被Mapreduce库函数分割成M个split集。用户定义的程序被 拷贝到机群中,其中一个是master,其它的都是worker。M个map任务和R个reduc e任务将被分配。Master负责调度任务和过程监视。随时检测worker的工作状况, 任务的完成进度。Map worker每完成一个子任务向master报告。 一个被分配了map任务的worker读取一个split集,该worker从这个split集中 分析出key/value对,然后有map函数来处理这些key/value对并得到中间key/val ue对,这些key/value对将最终存放在map worker的本地硬盘上。每完成一个任务报告master。 中间key/value对被存在本地硬盘的R个不同的区域中,由于可能的key值很可 能不止R个,故必须利用一个分割函数来划分中间文件,常用的是散列的方法(如 hash(key) mod R)。保证key值相同的key/value对被存放同一区域中,并且将位置报告给maste r。如果同一个key的中间文件多而小可以考虑用cmobine函数在本地进行合并。 当所有的split都被分析完成之后,reduce worker开始工作,每个reduce根据master的安排和信息指示利用机群的内部文件 系统读取map worker本地磁盘中特定位置的中间文件。 Reduce开始聚合中间文件,得到自己的输出文件。在聚合的过程中由于有很 多key值,一般将用到排序。Reduce worker完成自己的工作后向master报告。 控制 分析key/value对 分区写入磁盘 读取 *单向箭头表示控制,双向箭头表示控制
刚刚学习Python, 边看廖神的教程边想着搞个离线版,用requests+beautifulsoup抓的。仅供学习用 Python教程 Python简介 安装Python Python解释器 第一个Python程序 使用文本编辑器 Python代码运行助手 输入和输出 Python基础 数据类型和变量 字符串和编码 使用list和tuple 条件判断 循环 使用dict和set 函数 调用函数 定义函数 函数的参数 递归函数 高级特性 切片 迭代 列表生成式 生成器 迭代器 函数式编程 高阶函数 map/reduce filter sorted 返回函数 匿名函数 装饰器 偏函数 模块 使用模块 安装第三方模块 单元测试 文档测试 IO编程 文件读写 StringIO和BytesIO 操作文件和目录 序列化 进程和线程 多进程 多线程 ThreadLocal 进程 vs. 线程 分布式进程 正则表达式 常用内建模块 datetime collections base64 struct hashlib hmac itertools contextlib urllib XML HTMLParser 常用第三方模块 Pillow requests chardet psutil virtualenv 图形界面 网络编程 TCP/IP简介 TCP编程 UDP编程 电子邮件 SMTP发送邮件 POP3收取邮件 访问数据库 使用SQLite 使用MySQL 使用SQLAlchemy Web开发 HTTP协议简介 HTML简介 WSGI接口 使用Web框架 使用模板 异步IO 协程 asyncio async/await aiohttp 实战 file:///E|/Personal/PythonCreep/liaoxuefeng/0_index.html[2018-6-7 下午 08:03:16] Day 1 - 搭建开发环境 Day 2 - 编写Web App骨架 Day 3 - 编写ORM Day 4 - 编写Model Day 5 - 编写Web框架 Day 6 - 编写配置文件 Day 7 - 编写MVC Day 8 - 构建前端 Day 9 - 编写API Day 10 - 用户注册和登录 Day 11 - 编写日志创建页 Day 12 - 编写日志列表页 Day 13 - 提升开发效率 Day 14 - 完成Web App Day 15 - 部署Web App Day 16 - 编写移动App FAQ 期末总结
MapStruct是一个Java Bean映射框架,它可以帮助开发人员轻松地处理Java Bean之间的转换。使用MapStruct,您可以定义一个映射接口,该接口将自动实现Bean之间的转换。在本文中,我将向您展示如何使用MapStruct处理烦人的Bean转换。 1. 添加MapStruct依赖 首先,您需要将MapStruct添加到您的项目中。您可以在Maven中添加以下依赖项: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> ``` 2. 创建映射接口 接下来,您需要定义一个映射接口来描述Bean之间的映射。这个接口应该只包含一些抽象方法,这些方法定义了如何从源Bean映射到目标Bean。 例如,假设您有两个Bean:`SourceBean`和`TargetBean`。您希望将`SourceBean`的属性映射到`TargetBean`的属性。那么你可以创建一个映射接口,如下所示: ```java @Mapper public interface SourceTargetMapper { TargetBean mapToTargetBean(SourceBean source); } ``` `@Mapper`注解告诉MapStruct这是一个映射接口。`mapToTargetBean`方法将源Bean映射到目标Bean。请注意,这个方法是抽象的,所以您需要提供一个实现。 3. 生成映射器 现在,您需要让MapStruct生成映射器实现。为此,您可以使用`MapperFactory`类。以下是一个示例: ```java MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); SourceTargetMapper mapper = mapperFactory.getMapper(SourceTargetMapper.class); ``` 这将创建一个新的`SourceTargetMapper`实例,它将使用MapStruct生成的映射器实现。 4. 执行映射 现在,您可以使用映射器将源Bean映射到目标Bean。以下是一个示例: ```java SourceBean source = new SourceBean(); source.setName("John"); source.setAge(30); TargetBean target = mapper.mapToTargetBean(source); System.out.println(target.getName()); // Output: John System.out.println(target.getAge()); // Output: 30 ``` 这将创建一个新的`SourceBean`实例,并将其映射到一个`TargetBean`实例。`TargetBean`实例将具有与`SourceBean`实例相同的属性值。 总结 MapStruct是一个非常有用的Java Bean映射框架,它可以帮助您轻松处理Bean之间的转换。通过定义一个映射接口,然后让MapStruct生成一个映射器实现,您可以快速、轻松地实现Bean之间的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值