Springboot多种字段copy工具比较
结论:推荐使用spring自带的copy工具,不能copy的手动set

1、springboot自带的BeanUtils.copyProperties
package com.admin;
import cn.hutool.core.collection.CollectionUtil;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Description :
* @Date : 2022/12/26
* @Author :
*/
public class Test {
public static void main(String[] args) {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("2009");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes);
List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2= new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p);
TestDO testDO = new TestDO();
BeanUtils.copyProperties(testDTO, testDO);
}
}

总结

- 字段名不一致,属性无法复制
- 类型不一致,属性无法复制,但是注意,如果类型为基本类型以及基本类型的包装类,这种可以转化
- 嵌套对象字段,将会与源对象使用同一对象,即使用浅拷贝
2、hutool工具包的BeanUtil.copyProperties
package com.admin;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Description :
* @Date : 2022/12/26
* @Author :
*/
public class Test {
public static void main(String[] args) {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("2009");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes);
List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2 = new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p);
TestDO testDO = new TestDO();
BeanUtil.copyProperties(testDTO, testDO);
System.out.println("");
}
}

package com.admin;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Description :
* @Date : 2022/12/26
* @Author :
*/
public class Test {
public static void main(String[] args) {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("Fri May 19 15:59:09 CST 2023");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes);
List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2 = new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p);
TestDO testDO = new TestDO();
BeanUtil.copyProperties(testDTO, testDO);
System.out.println("");
}
}

总结
- hutool 可以copy不同类型的字段,只要字段的名称相同,对于字符串copy为date需要特定的格式
- copy对象也是浅拷贝
3、MapStruct
导入依赖
<!-- mapStruct 对象转换 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</dependency>
编写 MapStruct 转换接口
package com.admin.service;
import com.admin.TestDO;
import com.admin.TestDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
/**
* @Description :
* @Date : 2023/5/19
* @Author :
*/
@Mapper(componentModel = "spring")
public interface DTo2Do {
@Mapping(source = "no",target = "number")
TestDO dtoToDo(TestDTO testDTO);
}
测试需要启动容器
package com.admin;
import cn.hutool.core.collection.CollectionUtil;
import com.admin.service.DTo2Do;
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.Date;
import java.util.List;
@SpringBootTest
class VueadminJavaApplicationTests {
@Autowired
private DTo2Do dTo2Do;
@Test
void contextLoads() {
TestDTO testDTO = new TestDTO();
testDTO.setAge(1);
testDTO.setCreateDate("Fri May 19 15:59:09 CST 2023");
testDTO.setUpdateDate(new Date());
testDTO.setName("tom");
testDTO.setNo("1001");
testDTO.setSubjects(CollectionUtil.newArrayList("a", "b"));
Pes pes = new Pes();
pes.setPeopleName("people");
testDTO.setPeople(pes);
List<Pes> p = new ArrayList<>();
Pes pes1 = new Pes();
pes1.setPeopleName("people1");
Pes pes2 = new Pes();
pes2.setPeopleName("people2");
p.add(pes1);
p.add(pes2);
testDTO.setPes(p);
TestDO testDO = dTo2Do.dtoToDo(testDTO);
System.out.println("");
}
}

将日期注释掉

总结
- 部分类型不一致可以自动转换
- 深拷贝
- 对字符串转日期格式不支持
Springboot多种字段copy工具比较的更多相关文章
- fieldmeta 基于springboot的字段元数据管理,通用代码生成,快速开发引擎
fieldmeta: 基于springboot的字段元数据管理 version:Alpha 0.0.1 ,码云地址:https://gitee.com/klguang/fieldmeta 元数据(Me ...
- [下载]Oracle LOB字段编辑工具
OraLobEditor 是Oracle LOB (CLOB, BLOB) 字段编辑工具. 查看.编辑LOB (CLOB, BLOB)字段(plain text, RTF, image, hex, h ...
- springboot封装JsonUtil,CookieUtil工具类
springboot封装JsonUtil,CookieUtil工具类 yls 2019-9-23 JsonUtil public class JsonUtil { private static Obj ...
- SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式
SpringBoot系列(八) 分分钟学会SpringBoot多种跨域解决方式 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 s ...
- cglib、orika、spring等bean copy工具性能测试和原理分析
简介 在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO.DTO.Entity.DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护.通常情况下,这 ...
- SpringBoot集成Mybatis-PageHelper分页工具类,实现3步完成分页
在Mybatis中,如果想实现分页是比较麻烦的,首先需要先查询出总的条数,然后再修改mapper.xml,为sql添加limit指令. 幸运的是现在已经不需要这么麻烦了,刘大牛实现了一个超牛的分页工具 ...
- Spring-Boot ☞ ShapeFile文件读写工具类+接口调用
一.项目目录结构树 二.项目启动 三.往指定的shp文件里写内容 (1) json数据[Post] { "name":"test", "path&qu ...
- springboot工程自动生成工具
1 springboot工程自动生成网址 http://start.spring.io/ 2 工具 Spring Boot CLI
- SpringBoot 项目在静态工具类中注入 RedisTemplate
静态属性不能直接注入,可以通过其set方法进行注入.(注意生成的set方法需要去掉static). 在工具类里直接注入RedisTemplate,两种方法: (1)使用@Autowired priva ...
- springboot 整合redis redis工具类
一步 : pom中引入相关依赖 <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boo ...
随机推荐
- 移动App测试概述:移动App特性
移动App测试概述:移动App特性 移动App在现代人的日常生活中扮演着越来越重要的角色,因而对于它们的质量和稳定性的要求也越来越高.为了确保App的质量,开发商需要进行充分的测试和检验.本文将讨论移 ...
- 完成第一个 Vue3.2 项目后,使用体会
第一次Composition API 在vue3.2中,正式支持了script setup的写法,这样可以大大简化组件的代码量,减少一些重复操作,我认为当你写vue3时,应该把这当作默认写法.在vue ...
- 解决google翻译出错问题
解决google翻译问题 一.为什么失效 因为google把google翻译的API给关闭了,导致翻译不了. 据网上说是服务器耗钱,但盈利不够导致的. 二.可修复的前提 国内还存有服务器可以用API ...
- Python 九九乘法表的多种实现方式
简介 九九乘法表是初学者学习编程的必要练手题目之一,因此各种语言都有对应的实现方式,而 Python 也不例外.在 Python 中,我们可以使用多种方式来生成一个简单的九九乘法表. 本文共介绍了七种 ...
- hvv面试常见框架漏洞问题合集
1.thinkphp 特征判断 直接在url后加/?s=1 whatweb进行探测,方式:whatweb URL 漏洞 5.0 RCE 原理 thinkphp底层没有对控制器名进行很好的合法性校验,导 ...
- 精彩回顾 | 金蝶云苍穹技术开放日xUser Club广州站
6月14日,以"项目实践案例:性能优化与实践"为主题的金蝶云·苍穹技术开放日广州站圆满落幕.此次活动吸引了50多位开发者到场,大家不仅聆听了开发者关于"代码检查.性能优化 ...
- GO 项目依赖管理:go module总结
转载请注明出处: 1.go module介绍 go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用 go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mo ...
- 解放计算力:使用并行处理提升python for循环速度
Python 是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈.幸运的是,Python 提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作.本文将介绍如何 ...
- 基于drawio构建流程图编辑器
基于drawio构建流程图编辑器 drawio是一款非常强大的开源在线的流程图编辑器,支持绘制各种形式的图表,提供了Web端与客户端支持,同时也支持多种资源类型的导出. 描述 在我们平时写论文.文档时 ...
- 一篇随笔入门Java
Java helloWorld 随便新建一个文件夹存放代码 新建一个java文件 文件后缀名.java Hello.java [注意]系统可能不显示后缀名要手动打开 代码 public class H ...