Java对象转换最佳方案

2023-11-04

系统变的复杂,系统的层次划分越来越细,边界也越来越明确。 然后每一层之间一般都有自己要处理的领域对象,统称为pojo一般在model或者domain包下(类的后缀不能为pojo)。

常见的一些模型类型:

  • PO、DO:持久层对象,一般和数据库直接打交道。
  • DTO:数据传输对象,系统之间的交互,再服务层提供服务的时候输出到其它系统。
  • VO:视图对象,用于前端模型展示。 当然有时候前端也可以看做另外一个系统,使用DTO模型;
  • BO:业务逻辑对象,比较少用...

为什么模型要分这么多层?

在复杂一点的业务中,业务建模是非常有必要的,一定要抽象出业务上常用的领域模型,统一技术和非技术同学的语言。

建完模型之后,在技术的系统中,为了方便维护代码,分离关注点,也会进行再次分层,让每一层解决特定的问题。模型的分层是随着系统的分层而来的;试想所有的模型属性在一个对象中,这个对象你看的懂吗?

举个实际的案例:

  • 数据层一般用DO

  • 现在要透出数据给其他系统,DO中一般都会有创建人,创建时间,修改人,修改时间,当前对象所处的环境等信息; 但是外部的系统需要环境、创建人信息吗? 很多时候不需要,站在数据安全的角度,一般只透出必要的字段就可以; 这些要输出要外部系统的必要字段,一般定义在DTO中。

  • 到前端系统,前端系统展示上所需的逻辑和输出到外部系统的又有点不太一样,前端系统可能要创建人,创建时间,但是不要另外一些东西,或者一些敏感的配置不能透出给前端,这个时候一般也会再定义一个新的对象。

简单说就是当我们的系统要输出能力到外部系统的时候,不同系统要的数据不一样,数据安全要求我们不能透出这么多的数据,一定要做一层处理。 另外给另外一个系统关注的数据,而不是一股脑的全部都给对方,对方处理起来也方便。

模型之间的转换

建议不要用的方式

  • 手写get\set; 虽然性能高,但是费劲并且眼花缭乱,一不小心就写错了,难以维护,复用度不高
  • BeanUtils,apacha和spring包下都有对应的类,但是底层用到的都是反射,性能比较差,大流量的情况下一般不用
  • 直接fastjson,gc会很频繁,而且性能比较差

常用的方式

  • cglib的beanCopier,开销在创建BeanCopier,一般在创建类的时候提前创建好一个,在代码运行的时候直接进行copy,性能接近原生。
  • mapstruct 性能和原生代码一样,支持复杂的转化场景,实现原理同lombok编译的时候生成对应的代码。

以上从技术分类的角度来看:

  • 反射:fastjson,beanutil 都不建议用
  • get\set: beancoper通过字节码进行getset,mapstruct编译的时候生成getset。 性能相对较好。

使用方式

个人觉得,如果说对象比较简单的时候,使用BeanCopier就可以了,因为spring的aop依赖cglib,默认情况下就已经引入了对应的包了,不需要额外的依赖直接就可以用。

如果很复杂的模型之间的转换,并且对性能有更极致的要求,考虑使用下MapStruct。

定义对象

UserDO

@Data
public class UserDO {

  private Long id;

  private String name;

  private Integer gender;

  private String password;

  private Date gmtCreate;

  private Date gmtModified;

}
复制代码

UserDTO

@Data
public class UserDTO {

  private Long id;

  private String name;

  private Integer gender;

}

复制代码

BeanCopier

最简单的使用方式

B

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java对象转换最佳方案 的相关文章

随机推荐

  • docker odoo创建模块

    docker启动的如下步骤将创建并安装一个新的插件模块 进入到工作目录即你要操作并放置新建的自定义模块的插件目录中 为新模块选择一个技术名称并使用该名称作为模块名创建目录 本例中 我们使用my library pert PertdeMacB
  • JPA-Specification常用条件查询构造方式

    JPA Specification常用条件查询构造方式 1 toPredicate方法 Predicate toPredicate Root
  • 【TS】Error: Property ‘children‘ does not exist on type ‘X‘

    最近 在做项目模块的迁移 新项目需要使用ts 遇到的问题有点多 记录一下 先来复现一下场景 import React from react type PersonProps name string age number const Pers
  • 阿里云云服务器ECS要怎么绑定域名?

    阿里云云服务器ECS要怎么绑定域名 使用阿里云云服务器ECS 可以轻松地将域名与您的服务器实例进行绑定 以便通过域名来访问您的网站或应用程序 本文将提供详细的步骤和说明 教您如何在阿里云上绑定域名到ECS实例 一 购买域名 首先 在绑定域名
  • 目标检测——Anchor-Based算法的学习笔记

    1 前言 在写这篇笔记之前 首先我们需要确定的是 Anchor Based的思路一定优于Anchor Free的算法 这是毋庸置疑的 你想想 一个事情分成两步做 正负目标分类 目标的精细定位和回归 一个事情一步做 目标分类和回归 负样本被当
  • PixelStreaming数据通信

    PixelStreaming数据通信 简介 H5到UE4通信 H5发送 UE4接收 UE4到H5通信 UE4发送 H5接收 iframe postMessage 父页面 子页面 改造UE4提供的像素流送H5 UE4项目bat启动器 问题 U
  • MySQL生产环境部署架构

    MySQL生产环境部署架构 常用的分库分表架构 按业务id分库分表 建立索引映射表同时进行分库分表 数据同步到ES做复杂搜索 分库分表下如何分页 假设用户现在要查询自己的订单 同时订单要求要支持分页 该怎么做 方案一 因为同一个用户的订单可
  • 黑客突破防火墙常用的几种技术(转)

    一 防火墙基本原理 首先 我们需要了解一些基本的防火墙实现原理 防火墙目前主要分包过滤 和状态检测的包过滤 应用层代理防火墙 但是他们的基本实现都是类似的 路由器 网卡 防火墙 网卡 内部网络 防火墙一般有两个以上的网络卡 一个连到外部 r
  • 使用SSM框架进行Crud时后台出现javax.validation.UnexpectedTypeException: HV000030: No validator could be found

    1 处理之前的效果 2 原因是 Java实体类中属性是Integer类型 用了 NotBlank判断不能为空 而这个注解是判断字符串是否为空 3 解决办法 去掉 NotBlank注解 使用 NotNull 两者的区别 1 NotNull 适
  • ClassLoader.getSystemResource("") 为空的原因

    在idea自带的tomcat中 运行正常 发布到tomcat下获取为空 现修改成类 class getClassLoader getResource 获取方式
  • Vue整体架构分解

    Vue js的整体架构可以分解为以下几个部分 文章目录 1 数据驱动 2 组件化 3 响应式系统 4 虚拟DOM 5 插件系统 6 单文件组件 7 模板编译 总结 1 数据驱动 Vue的一个核心特点是数据驱动 Vue会在初始化的时候给数据提
  • 【image】src相对地址的引入

    src相对地址的引入 前言 相对路径 src引用 前言 在引入图片的时候 突然发现通过相对地址引入项目内图片不会了 特此在这里记录一下 以便学习 相对路径 使用原因 对于放在一个项目包内的图片资源 通过相对路径可直接引用 绝对路径是对于网络
  • ASP.NET Core 8 的 Web App

    Web App Web App 与 Web API 的不同之处在于包含 UI 部分 所谓的 UI 就是 HTML 页面 Web App 支持几种渲染HTML 的方式 服务端渲染 客户端渲染 混合渲染 服务端渲染 服务端渲染UI是在浏览器请求
  • Spyder闪退的解决过程记录

    安装了高版本的 PYQT5 后 原来安装的 老版本的 spyder打开闪退 考虑是版本不兼容的问题 卸载了spyder 重新安装了最新版 Version 5 3 1的spyder 在anaconda prompt中输入如下命令 pip un
  • 学习安卓应用开发一课一得+计算器

    一 在学习安卓应用开之前要掌握语言 本文章以Java为基础的安卓应用开发 二 Android开发环境配置 三 计算器开发 一 在学习安卓应用开之前要掌握语言 本文章以Java为基础的安卓应用开发 1 在学习Android开发之前 我首先需要
  • 网络编程(附代码)

    网络编程 1 网络通信协议 1 1 协议和七层模型 七层模型 也称为OSI Open System Interconnection 参考模型 是国际标准化组织 ISO 制定的一个用于计算机或通讯系统间互联的标准体系 它是一个七层的 抽象的模
  • MIPI信号的分析--结合示波器实际测试波形

    MIPI已经不陌生了 对于现在的设计中 摄像头接口 显示接口都有MIPI 所以有了CSI和DSI接口 MIPI最早是手机里面的协议 为了形成行业统一标准 MIPI联盟发起MIPI 移动行业处理器接口 作为移动应用处理器制定的开放标准 1 M
  • 深度学习—卷积神经网络(Convolutional Neural Networks)

    卷积神经网络 Convolutional Neural Networks 卷积神经网络 convolutional neural network CNN 是一种专门用来处理具有类似网格结构的数据的神经网络 例如时间序列数据 可以认为是在时间
  • sqli-labs通关详解

    sqli labs通关详解 Less1 Less1sqlmap运用 Less2 Less2sqlmap运用 Less3 sqlmap运用 Less4 sqlmap一把梭 Less5 sqlmap直接梭 Less6 Less7 Less8 s
  • Java对象转换最佳方案

    系统变的复杂 系统的层次划分越来越细 边界也越来越明确 然后每一层之间一般都有自己要处理的领域对象 统称为pojo一般在model或者domain包下 类的后缀不能为pojo 常见的一些模型类型 PO DO 持久层对象 一般和数据库直接打交