当前位置: 首页 > news >正文

【业务功能篇71】Cglib的BeanCopier进行Bean对象拷贝

选择Cglib的BeanCopier进行Bean拷贝的理由是,
其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,
尤其是数据量比较大的情况下。

  • BeanCopier的主要作用是将数据库层面的Entity转化成service层的POJO。BeanCopier其实已经有很多开源版本,例如DozerMapper、Apache BeanUtils、Spring、Jodd BeanUtils甚至是Cglib都提供了这样的功能。我们这里讲的BeanCopier来自net.sf.cglib.BeanCopier包,cglib是一款比较底层的操作java字节码的框架。 而其他多数都是基于 反射 来实现的 对象复制,所以更底层的字节码方式获取数据赋值,效率会更高
  • 顾名思义,BeanCopier是用于在两个bean之间进行属性拷贝的。BeanCopier支持两种方式,一种是不使用Converter的方式,仅对两个bean间属性名和类型完全相同的变量进行拷贝。另一种则引入Converter,可以对某些特定属性值进行特殊操作。

简单用例 


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;import java.math.BigDecimal;import java.sql.Timestamp;
import java.text.SimpleDateFormat;import static org.junit.jupiter.api.Assertions.*;class BeanCopyUtilsTest {/*** 测试说明: 类型不同BeanCopier不会拷贝*/@Testvoid copy() {User user = new User();user.setId(1);user.setName("dearth");BeanCopier copier = BeanCopier.create(User.class, UserVo.class, false);UserVo userVo = new UserVo();copier.copy(user, userVo, null);Assertions.assertNull(userVo.getId());}/*** 测试说明: 提供转换器可以实现不同类型的拷贝*/@Testvoid copyUseConverter() {User user = new User();user.setId(1);user.setName("dearth");user.setCreateTime(new Timestamp(10043143243L));user.setBalance(BigDecimal.valueOf(4000L));BeanCopier copier = BeanCopier.create(User.class, UserVo.class, true);UserVo vo = new UserVo();copier.copy(user, vo, new UserConverter());Assertions.assertNotNull(vo.getCreateTime());Assertions.assertNotNull(vo.getBalance());}@Data@NoArgsConstructor@AllArgsConstructorstaticclass User {private String name;private int id;private Timestamp createTime;private BigDecimal balance;}@Data@NoArgsConstructor@AllArgsConstructorstaticclass UserVo {private String name;private Integer id;private String createTime;private String balance;}static class UserConverter implements Converter {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Overridepublic Object convert(Object o, Class aClass, Object o1) {if (o instanceof Integer) {return (Integer) o;} else if (o instanceof Timestamp) {Timestamp data = (Timestamp) o;return sdf.format(data);} else if (o instanceof BigDecimal) {BigDecimal bg = (BigDecimal) o;return bg.toPlainString();} else {return null;}}}
}

 

  1. BeanCopier只拷贝名称和类型都相同的属性。
  2. 当目标类的setter数目比getter少时,创建BeanCopier会失败而导致拷贝不成功。
  3. 自定义Converter转换器可以转换不同类型的属性

 

http://www.lryc.cn/news/133016.html

相关文章:

  • 让eslint的错误信息显示在项目界面上
  • 手摸手带你实现一个开箱即用的Node邮件推送服务
  • 【Linux网络】网络编程套接字 -- 基于socket实现一个简单UDP网络程序
  • Python学习笔记第六十四天(Matplotlib 网格线)
  • 机器学习与模式识别3(线性回归与逻辑回归)
  • vue启动配置npm run serve,动态环境变量,根据不同环境访问不同域名
  • HTML <strike> 标签
  • 数学建模-模型详解(1)
  • MySQL 数据库表的基本操作
  • 企业微信电脑端开启chrome调试
  • Maven官网下载配置新仓库
  • 银河麒麟V10 达梦安装教程
  • Python操作MongoDB数据库
  • 《HeadFirst设计模式(第二版)》第十一章代码——代理模式
  • QT的工程文件认识
  • typeScript安装及TypeScript tsc 不是内部或外部命令,也不是可运行的程序或批处理文件解决办法
  • SWUST 派森练习题:P111. 摩斯密码翻译器
  • 如何在控制台查看excel内容
  • Echarts、js编写“中国主要城市空气质量对比”散点图 【亲测】
  • linux不分区直接在文件系统根上开swap
  • React请求机制优化思路 | 京东云技术团队
  • CompletableFuture总结和实践
  • 使用Nginx调用网关,然后网关调用其他微服务
  • windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】
  • PAT 1097 Deduplication on a Linked List
  • Flink 数据集成服务在小红书的降本增效实践
  • jellyfin使用ipv6+DDNS实现外网访问
  • Codeforces EDU 151 Div.2
  • V2board缓存投毒漏洞复现
  • 2023面试八股文 ——Java基础知识