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

Page<T>类型数据间的复制

Page类型间数据的复制

  • 数据复制
      • 手动复制公共属性
      • 使用BeanUtils.copyProperties
      • CGLIB进行列表复制

数据复制

在Java中,复制Page<T>类型数据主要可以通过以下几种方式进行,考虑到泛型的特性以及实际应用场景,这些方法既包括直接的属性复制也涉及数据转换技巧。
以下是两个不同的类型T1T2(实体类/基本数据类型等,不管哪种类型两者都需相同,实体类可以不同但必须都是实体类类型),Page为com.baomidou.mybatisplus.extension.plugins.pagination.Page

手动复制公共属性

可以通过手动为每个公共属性调用setter方法来复制Page对象的非泛型属性,如total、currentPage、pageSize等。
初始化目标Page对象:首先,确保你已经创建了目标类型的空Page对象。

Page<T2> page2 = new Page<>();

复制公共属性:接着,手动复制所有非泛型的公共属性,如页码、每页大小、总记录数等。

page2.setCurrent(page1.getCurrent()); // 或者使用setPageNo,具体方法名取决于MyBatis Plus版本和API
page2.setSize(page1.getSize());
page2.setTotal(page1.getTotal());

转换并设置数据列表:对于数据列表(通常是List<T>的形式),你需要遍历page1的数据列表,并将每个T1实例转换为T2实例。这可能涉及到复杂的业务逻辑转换,具体实现取决于T1和T2之间转换的规则。假设有一个简单的转换方法convertT1ToT2(T1 t1),用于将T1实例转换为T2实例,示例如下:

List<T2> resultList = new ArrayList<>();
for (T1 item : page1.getRecords()) {T2 convertedItem = convertT1ToT2(item);			// 需要根据实际情况实现convertT1ToT2方法,处理字段映射、类型转换等问题resultList.add(convertedItem);
}
page2.setRecords(resultList);

使用BeanUtils.copyProperties

对于非泛型部分,Spring框架提供的org.springframework.beans.BeanUtils中的copyProperties方法可以用来复制两个对象之间的属性。

BeanUtils.copyProperties(page1, page2);				// 将page1复制近page2

但是,由于泛型擦除的存在,直接使用BeanUtils.copyProperties来复制整个Page<T>对象可能不适用于泛型部分。需要单独处理数据列表的复制,如下所示:

BeanUtils.copyProperties(page1, page2, "records"); 						// 排除records属性
List<T2> newList = page1.getRecords().stream().map(element -> convert(element))		// 这里convert(element)是一个自定义的方法,用于将T1转换为T2.collect(Collectors.toList());
page2.setRecords(newList);

CGLIB进行列表复制

CglibUtil.copyList是一个示例,利用反射或字节码操作技术(如CGLIB)来批量创建新对象并复制属性。这种方法适用于简单属性复制,但复杂类型转换仍需自定义转换逻辑。
准备目标Page对象:首先,确保已经初始化了一个空的Page对象,就像之前提到的那样。

Page<T2> page2 = new Page<>();

使用CglibUtil.copyList进行转换:利用CglibUtil.copyList方法,可以将源页面中的记录列表转换为目标类型列表。这里的T2::new构造器引用表示对于列表中的每个T1对象,都会创建一个新的T2实例。

Page<T2> page2 = new Page<>();
// 设置page2的基本属性,如Current/Size/Total...List<T2> convertedRecords = CglibUtil.copyList(page1.getRecords(), T2::new);
page2.setRecords(convertedRecords);

相关文章:

  • Spring-bean实例化的方式
  • LeetCode 每日一题 2024/9/23-2024/9/29
  • 计算机毕业设计 基于Python国潮男装微博评论数据分析系统的设计与实现 Django+Vue 前后端分离 附源码 讲解 文档
  • 基于Node.js+Express+MySQL+VUE新闻网站管理系统的设计与实现
  • React学习笔记(四)——React 组件生命周期
  • 负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。
  • 【源码+文档+调试讲解】智能校园点餐管理系统springboot
  • 物联网系统中高精度压力检测方案_压力变送器
  • 15分钟学 Python 第29天 : 数据库基础
  • “不关心⚠️Warning”的代价:http自动升级https导致免费的存储服务扣费
  • 磁盘管理器
  • 多表查询。
  • 在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.1)
  • 基于单片机电容测量仪仿真设计
  • go语言实现新增代码单测覆盖率
  • bootstrap创建登录注册页面
  • leetcode386. Lexicographical Numbers
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Sass 快速入门教程
  • vue中实现单选
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 看域名解析域名安全对SEO的影响
  • 蓝海存储开关机注意事项总结
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 智能网联汽车信息安全
  • 仓管云——企业云erp功能有哪些?
  • 数据库巡检项
  • ​Linux·i2c驱动架构​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #职场发展#其他
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (04)odoo视图操作
  • (19)夹钳(用于送货)
  • (6)STL算法之转换
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Oracle)SQL优化技巧(一):分页查询
  • (待修改)PyG安装步骤
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (南京观海微电子)——示波器使用介绍
  • (十三)Flink SQL
  • (算法二)滑动窗口
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)OpenStack Hacker养成指南
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .dwp和.webpart的区别
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径