使用MapStruct替换BeanUtils

博客介绍了对象间复制的常见场景,指出简单场景可用BeanUtils等工具类,但复杂字段映射和批量转换时效率不佳。MapStruct能在编译时自动生成映射代码,解决上述问题且效率翻倍。还介绍了其安装、使用和测试情况,测试显示100w笔数据复制仅需20ms。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于对象间复制应该是比较常见的了,一个对象O可以衍生出DO、DTO、VO等;一般比较简单的场景我们可以选择使用BeanUtils,或者spring官方的,或者其他第三方的,大同小异,但是比较复杂的字段映射这个工具类就不够用了,而且在批量转换的时候,效率也是一个问题;这个时候,MapStruct就能完美兼容这2个问题,在编译的时候帮你自动生成映射代码,而且效率翻倍。

安装

官方手册:https://mapstruct.org/documentation/stable/reference/html
这个有个小问题,使用官方推荐plugin的方式引入时,与lombok产生了冲突,估计是自动生成get/set方法的缘故。故改为以下依赖:

<org.mapstruct.version>1.3.1.Final</org.mapstruct.version>

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

使用

建立一个源对象

import lombok.Data;

@Data
public class User {

	private Long userId;// 用户ID
	private String userName;// 用户名

	private String nickName;// 用户昵称
	private String sex;// 用户性别
	private String status;// 状态

}

建立一个需要复制的对象

import lombok.Data;
import lombok.ToString;

@Data
public class UserDto {

	private String nickName;// 用户昵称
	private String sex;// 用户性别
	private String status;// 状态

}

新建一个字段映射接口,这里只是简单的映射,事实上,这里可以进行复杂的字段映射,比如2个对象字段名不一样,字段类型不一样,都是可以自定义的;
@Mapper()这里加上componentModel = "spring"表示该接口自动注入spring的IOC容器中,后续可以通过@Autowired装配

import com.example.mapstruct.bean.User;
import com.example.mapstruct.bean.UserDto;
import org.mapstruct.Mapper;

import java.util.List;

/**
 * 字段映射接口
 *
 * @author jason
 */
@Mapper(componentModel = "spring")
public interface UserConvert {

	/**
	 * 单个对象互转
	 *
	 * @param user
	 * @return
	 */
	UserDto user2UserDto(User user);

	/**
	 * 数组互转
	 *
	 * @param userList
	 * @return
	 */
	List<UserDto> userList2UserDtoList(List<User> userList);

}

测试

import com.example.mapstruct.bean.User;
import com.example.mapstruct.bean.UserDto;
import com.example.mapstruct.convert.UserConvert;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@SpringBootTest
class MapStructApplicationTests {

	@Autowired
	private UserConvert userConvert;

	@Test
	void contextLoads() {
		// 准备count笔测试数据
		int count = 100 * 10000;
		List<User> userList = getUserList(count);

		// 单个转换
		long star = System.currentTimeMillis();
		UserDto userDto = userConvert.user2UserDto(userList.get(0));
		long end = System.currentTimeMillis();
		log.info("单个转换耗时:{}ms", end - star);

		// 批量转换
		star = System.currentTimeMillis();
		List<UserDto> userDtoList = userConvert.userList2UserDtoList(userList);
		end = System.currentTimeMillis();
		log.info("{}笔批量转换耗时:{}ms", count, end - star);

	}

	/**
	 * 获取count笔测试数据
	 *
	 * @param count
	 * @return
	 */
	private List<User> getUserList(int count) {
		List<User> userList = new ArrayList<>();

		for (int i = 0; i < count; i++) {
			User user = new User();
			user.setUserId(20201117L);
			user.setUserName("z1353095373");
			user.setNickName("复制粘贴");
			user.setSex("男");
			user.setStatus("active");

			userList.add(user);
		}

		return userList;
	}

}

测试环境:本地win10,i7,16G
100w笔数据复制一次,仅20ms,可以说是相当不错了
在这里插入图片描述
另外,程序运行后,可以在编译后的文件夹看到MapStruct生成的实现类代码
在这里插入图片描述
再参考一下网友测的

工具十个对象复制1次一万个对象复制1次一百万个对象复制1次一百万个对象复制5次
mapStruct0ms3ms96ms281ms
hutools的BeanUtil23ms102ms1734ms8316ms
spring的BeanUtils2ms47ms726ms3676ms
apache的BeanUtils20ms156ms10658ms52355ms
apache的PropertyUtils5ms68ms6767ms30694ms

看了这个数据,也难怪阿里巴巴在Java开发手册中明令禁止使用Apache BeanUtils了
在这里插入图片描述

源码下载

《基于S7-200的全自动洗衣机控制系统》文主要探讨了如何利用西门子S7-200系列微型可编程控制器(PLC)来设计并实现全自动洗衣机控制系统。该系统旨在提升洗衣机的自动化水平,满足现代生活及工业生产对洗衣机功能的更高要求。S7-200系列PLC凭借其高性能与经济性,成为理想的控制设备,其丰富的设计知识和方法可确保系统的稳定性和可靠性。 洗衣机的历史可追溯至19世纪,从最初的木制手摇洗衣机到电动洗衣机,再到如今的全自动洗衣机,其发展经历了从半自动到全自动再到智能化的演变。全自动洗衣机可自动完成除放衣、取衣和启动之外的所有洗衣步骤,极大地便利了人们的生活。在工业领域,洗衣机也在断进化,追求更高的效率、更低的能耗和更优化的结构。 全自动洗衣机的发展历程见证了技术创新的足迹。1932年,前装式滚筒全自动洗衣机的出现标志着洗衣机进入新段,其在个滚筒内完成洗涤、漂洗和脱水全过程。此后,洗衣机技术断进步,包括微电脑控制、新型洗涤方式、高速脱水和低噪音等特性。近年来,中国在全自动洗衣机制造技术上取得显著进步,产品种类丰富,技术性能优良,产量逐年增长。 全自动洗衣机的控制系统有多种类型,如单片机控制、PLC控制和工业控制计算机集中控制。单片机控制虽小巧、功耗低,但开发难度大,硬件保护机制复杂,可能增加故障率和维修成本;工业控制计算机则适合大型控制系统,提供强大的软硬件支持。而PLC因其卓越的抗干扰能力、高可靠性、编程便利性、操作简便性、维护快捷性和设计灵活性等优势,成为全自动洗衣机控制系统的首选。S7-200系列PLC的模块化设计使系统扩展和维护更简单,能够快速完成设计和调试,推动洗衣机控制系统向更高级别的自动化迈进。基于S7-200的全自动洗衣机控制系统是现代科技与传统家电的完美结合,体现了PLC技术在日常生活中的广泛应用和价值。通过深入理解和掌握PLC的工作原理和编程技巧,可
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值