Java中VO、DTO、BO、DO、PO傻傻分不清?一篇文章让你彻底搞懂!_java vo,零基础入门到精通,收藏这篇就够了

JAVA多线程详解(超详细) 程序:开发写的代码称之为程序。程序就是一堆代码,一组数据和指令集,是一个静态的概念。进程(Process):将程序运行起来,我们称之为进程。进程是执行程序的一次执行过程,它是动态的概念。进程存在生命周期,也就是说程序随着程序的终止而销毁。进程之间是通过TCP/IP端口实现交互的。线程(Thread):线程是进程中的实际运作的单位,是进程的一条流水线,是程序的实际执行者,是最小的执行单位。通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程。线程是CPU调度和执行的最小单位。注意。 阅读详情

深入浅出讲解各层对象区别+实战应用+代码对比,告别概念混淆,设计出更优雅的系统架构!

“新手最大的噩梦:一个Java项目里,满眼都是XxxVO、XxxDTO、XxxBO、XxxDO、XxxPO…” 😵

是不是经常被这些相似的概念搞得头晕眼花?

  • 为什么一个User要定义成UserVO、UserDTO、UserPO好几个类?
  • 它们看起来字段都差不多,直接用一个User类不行吗?
  • 到底什么时候该用VO?什么时候该用DTO?

别慌!这是每个Java程序员成长的必经之路! 今天,我就用最通俗易懂的方式,帮你彻底理清这些"O"的区别和作用,让你从此告别混淆,设计出专业、规范的系统架构! 🚀


一、 为什么需要这么多"O"?—— 核心思想:职责分离

在回答具体区别之前,首先要明白一个核心思想:软件工程中最重要的原则之一就是"关注点分离"(Separation of Concerns)。

想象一个餐厅的后厨: 🍳

  • 采购员 买回来的原始食材 = PO(原始数据)
  • 厨师 处理后的半成品食材 = BO(业务处理后的数据)
  • 服务员 端给顾客的精致菜品 = DTO/VO(展示给外界的数据)

如果让采购员直接端着一筐土豆给顾客,或者让厨师去前台结账,会怎样? 同样的道理,在软件架构中,不同层次应该处理不同的数据形态。


二、 各层对象详解(附代码对比)

1. PO(Persistent Object)持久化对象

作用: 与数据库表结构直接映射的Java对象,专用于数据持久化层(DAO/Mapper层)。

特点:

  • 与数据库表一一对应,每个字段对应表中的一个列
  • 通常包含ORM框架注解(如MyBatis的@Table、JPA的@Entity)
  • 不应该包含业务逻辑

示例代码:

// 对应数据库表 `user`
import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "user")
public class UserPO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "username")
    private String username;
    
    @Column(name = "password")
    private String password;
    
    @Column(name = "email")
    private String email;
    
    @Column(name = "create_time")
    private Date createTime;
    
    @Column(name = "update_time")
    private Date updateTime;
    
    // 只有getter/setter,没有业务方法
    // getter/setter...
}

使用场景: MyBatis、JPA等ORM框架操作数据库时使用。


2. DO(Domain Object)领域对象

作用: 在领域驱动设计(DDD)中,代表业务领域中的核心实体,包含业务逻辑和数据。

特点:

  • 聚焦业务领域,不一定与数据库表完全对应
  • 可以包含业务方法(这是与PO的最大区别!)
  • 是业务逻辑的核心载体

示例代码:

// 领域对象 - 包含业务逻辑
public class UserDO {
    private Long id;
    private String username;
    private String password;
    private String email;
    private Integer status; // 状态:1-正常,2-禁用
    private Integer loginAttempts; // 登录尝试次数
    
    // 包含业务方法!
    public boolean isLocked() {
        return loginAttempts >= 5; // 尝试5次以上被锁定
    }
    
    public void incrementLoginAttempts() {
        this.loginAttempts++;
    }
    
    public void resetLoginAttempts() {
        this.loginAttempts = 0;
    }
    
    public boolean validatePassword(String inputPassword) {
        // 密码验证逻辑,可能包含加密验证
        return this.password.equals(encryptPassword(inputPassword));
    }
    
    private String encryptPassword(String password) {
        // 加密逻辑
        return DigestUtils.md5DigestAsHex(password.getBytes());
    }
    
    // getter/setter...
}

PO vs DO 关键区别:

  • PO是"贫血模型":只有数据,没有行为
  • DO是"充血模型":既有数据,也有业务行为

3. BO(Business Object)业务对象

作用: 由多个DO或PO组合而成的复合对象,用于完成特定的业务场景。

特点:

  • 由多个实体组合而成(聚合根)
  • 代表一个完整的业务概念
  • 在Service层使用

示例代码:

// 业务对象 - 组合多个实体完成业务场景
public class OrderBO {
    // 组合多个DO/PO
    private OrderDO order;           // 订单信息
    private List<OrderItemDO> items; // 订单项列表
    private UserDO user;             // 用户信息
    private AddressDO address;       // 收货地址
    
    // 业务方法
    public BigDecimal calculateTotalAmount() {
        BigDecimal total = BigDecimal.ZERO;
        for (OrderItemDO item : items) {
            total = total.add(item.getPrice().multiply(new BigDecimal(item.getQuantity())));
        }
        // 可能还有优惠券、运费等计算
        return total;
    }
    
    public boolean isAvailable() {
        return order.getStatus() == 1 && user.isActive();
    }
    
    public void applyCoupon(CouponDO coupon) {
        // 应用优惠券的业务逻辑
        if (coupon.isValid() && calculateTotalAmount().compareTo(coupon.getMinAmount()) >= 0) {
            // 应用优惠
        }
    }
    
    // getter/setter...
}

使用场景: 复杂的业务逻辑处理,需要多个实体协作时。


4. DTO(Data Transfer Object)数据传输对象

作用: 用于进程间数据传输,比如Service层与Controller层之间,或者微服务之间。

特点:

  • 扁平化数据结构,通常没有业务逻辑
  • 可以根据需要组合、裁剪字段
  • 关注数据传输的效率和安全

示例代码:

// 用于Service层返回给Controller层的数据
public class UserDTO {
    private Long id;
    private String username;
    private String email;
    private String statusDesc; // 状态描述(非数据库字段)
    private Date createTime;
    
    // 通常只有getter/setter,没有业务逻辑
    // getter/setter...
    
    // 转换方法(可选)
    public static UserDTO fromDO(UserDO userDO) {
        if (userDO == null) return null;
        
        UserDTO dto = new UserDTO();
        dto.setId(userDO.getId());
        dto.setUsername(userDO.getUsername());
        dto.setEmail(userDO.getEmail());
        dto.setCreateTime(userDO.getCreateTime());
        
        // 状态码转描述
        dto.setStatusDesc(userDO.getStatus() == 1 ? "正常" : "禁用");
        
        return dto;
    }
}


5. VO(Value Object / View Object)值对象/视图对象

作用: 专门用于前端展示,根据界面需求定制数据结构。

特点:

  • 高度定制化,完全为前端服务
  • 可能包含多个实体的字段组合
  • 字段类型可能转换为前端需要的格式(如日期格式化为字符串)

示例代码:

// 专门为前端页面定制的对象
public class UserVO {
    private Long userId;          // 前端需要的字段名
    private String userName;      // 前端需要的字段名
    private String userEmail;
    private String createTime;    // 格式化的字符串,非Date类型
    private String lastLoginTime; // 可能来自其他表的数据
    private Integer orderCount;   // 聚合数据
    
    // 可能包含前端需要的特定字段
    private Boolean canEdit;
    private String avatarUrl;
    
    // 转换方法
    public static UserVO fromDTO(UserDTO userDTO, UserStatsDTO stats) {
        UserVO vo = new UserVO();
        vo.setUserId(userDTO.getId());
        vo.setUserName(userDTO.getUsername());
        vo.setUserEmail(userDTO.getEmail());
        
        // 格式化日期
        vo.setCreateTime(DateUtil.format(userDTO.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
        
        // 组合其他数据
        vo.setOrderCount(stats.getOrderCount());
        vo.setLastLoginTime(DateUtil.format(stats.getLastLoginTime(), "yyyy-MM-dd HH:mm:ss"));
        
        // 业务逻辑判断
        vo.setCanEdit("正常".equals(userDTO.getStatusDesc()));
        
        return vo;
    }
    
    // getter/setter...
}


三、 核心区别对比表(重要!)

对象类型英文全称所处层级主要作用是否包含业务逻辑示例
POPersistent Object持久层数据库映射❌ 否UserPO
DODomain Object领域层业务实体✅ 是UserDO
BOBusiness Object业务层业务组合✅ 是OrderBO
DTOData Transfer Object传输层数据传输❌ 否UserDTO
VOView Object展示层前端展示❌ 否UserVO

四、 完整数据流转实战(重点理解!)

让我们通过一个"用户订单详情"API来看各层对象如何协作:

1. 数据库层(PO)
// 数据库表对应的PO
public class UserPO { /* 同上 */ }
public class OrderPO { /* 订单表映射 */ }
public class OrderItemPO { /* 订单项表映射 */ }
public class AddressPO { /* 地址表映射 */ }

2. 数据访问层(DAO)
@Repository
public class OrderDao {
    public OrderPO findById(Long orderId) {
        // 使用MyBatis/JPA查询数据库,返回PO
        return orderMapper.selectById(orderId);
    }
}

3. 领域层(DO)
// 各个领域对象包含自己的业务逻辑
public class UserDO { /* 包含用户相关业务方法 */ }
public class OrderDO { /* 包含订单相关业务方法 */ }

4. 业务层(BO + Service)
@Service
public class OrderService {
    
    public OrderBO getOrderDetail(Long orderId) {
        // 1. 查询多个PO
        OrderPO orderPO = orderDao.findById(orderId);
        List<OrderItemPO> itemPOs = orderItemDao.findByOrderId(orderId);
        UserPO userPO = userDao.findById(orderPO.getUserId());
        
        // 2. PO转DO(可能包含业务逻辑初始化)
        OrderDO orderDO = convertToDO(orderPO);
        UserDO userDO = convertToDO(userPO);
        
        // 3. 创建BO(业务对象)
        OrderBO orderBO = new OrderBO();
        orderBO.setOrder(orderDO);
        orderBO.setUser(userDO);
        orderBO.setItems(convertToDOs(itemPOs));
        
        // 4. 执行业务逻辑
        if (!orderBO.isAvailable()) {
            throw new BusinessException("订单不可用");
        }
        
        return orderBO;
    }
}

5. 控制层(DTO + Controller)
@RestController
public class OrderController {
    
    @Autowired
    private OrderService orderService;
    
    @GetMapping("/orders/{orderId}")
    public Result<OrderDTO> getOrderDetail(@PathVariable Long orderId) {
        // 1. 调用Service获取BO
        OrderBO orderBO = orderService.getOrderDetail(orderId);
        
        // 2. BO转DTO(数据传输对象)
        OrderDTO orderDTO = convertBOToDTO(orderBO);
        
        return Result.success(orderDTO);
    }
    
    private OrderDTO convertBOToDTO(OrderBO bo) {
        OrderDTO dto = new OrderDTO();
        // 拷贝基础字段
        BeanUtil.copyProperties(bo.getOrder(), dto);
        
        // 计算展示字段
        dto.setTotalAmount(bo.calculateTotalAmount());
        dto.setItemCount(bo.getItems().size());
        
        return dto;
    }
}

6. 前端展示层(VO)
// 前端需要的特定数据结构
public class OrderVO {
    private String orderNumber;    // 格式化订单号
    private String customerName;   // 客户姓名
    private String totalAmount;    // 格式化的金额:"¥199.00"
    private List<OrderItemVO> items; // 定制化的订单项
    private String statusText;     // 状态文本
    private String createTime;     // 格式化时间
    // ... 其他前端特定字段
}

@RestController
public class OrderController {
    
    @GetMapping("/api/v1/orders/{orderId}")
    public Result<OrderVO> getOrderForFrontend(@PathVariable Long orderId) {
        // 1. 获取DTO
        OrderDTO orderDTO = orderService.getOrderDetail(orderId);
        
        // 2. DTO转VO(为前端定制)
        OrderVO orderVO = convertDTOToVO(orderDTO);
        
        return Result.success(orderVO);
    }
}


五、 什么情况下可以简化?

虽然分层有很多好处,但也不是所有项目都需要这么复杂:

适合完整分层的情况:
  • 大型项目:团队规模较大,需要明确分工
  • 复杂业务:业务逻辑复杂,需要清晰的架构
  • 长期维护:项目需要长期迭代和维护
  • 微服务架构:服务间需要明确的数据契约
可以简化的情况:
  • 小型项目:个人项目或小型团队
  • 简单CRUD:没有复杂业务逻辑
  • 快速原型:需要快速验证想法

简化方案:

// 简单项目可以PO、DO合一
@Entity
public class User {
    @Id
    private Long id;
    private String username;
    
    // 也可以包含简单业务方法
    public boolean isActive() {
        return status == 1;
    }
}

// 甚至可以PO、DTO、VO合一(不推荐用于正式项目)


六、 最佳实践总结

  1. 明确各层职责:每层只处理自己该处理的数据
  2. 使用工具类转换:用BeanUtil、MapStruct等工具简化对象转换
  3. 避免过度设计:根据项目复杂度选择合适的分层方案
  4. 保持命名规范:使用PO、DTO、VO等后缀,提高代码可读性
  5. 文档化数据流:在团队中明确各层对象的转换关系

七、 常见问题解答(FAQ)

Q1:DO和PO一定要分开吗?
A:在领域驱动设计(DDD)中建议分开,简单CRUD项目可以合并。

Q2:DTO和VO有什么区别?
A:DTO关注数据传输(后端内部),VO关注前端展示。在前后端分离架构中,VO就是给前端用的API响应对象。

Q3:什么时候用BO?
A:当需要多个实体协作完成一个业务场景时使用BO。

Q4:这些对象转换会不会影响性能?
A:会有轻微影响,但对于大多数业务系统来说,可维护性的收益远大于性能损失。可以使用MapStruct等高效转换工具。


Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

在这里插入图片描述

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

java: 错误: 无效的源发行版:17 阅读详情

相关推荐

学习Java应该关注哪些网站?

下面是我总结的一些不错的网站,可以收藏看一下哈~希望对你有帮助

SiKi学院的博客 1095

java环境变量的配置

配置java环境变量,检测环境变量是否配置成功

weixin_52070377的博客 7万+

stm32f407VET6 系统学习 day01 GPIO 配置

stm32f407VET6 系统学习 day01 GPIO 配置 LED 蜂鸣器 按键的不讲了,之前讲过了

she666666的博客 8905

java安装教程

java安装教程

小白学CS 10万+

如何用python开发“跳一跳”游戏【附源码】

jump_start_time = pygame.time.get_ticks() # 记录跳跃开始时间。jump_duration = current_time - jump_start_time # 计算跳跃持续时间。current_time = pygame.time.get_ticks() # 获取当前时间。jump_velocity = -15 # 设置跳跃的初始速度。# 如果小球跳跃结束,重置跳跃状态。# 根据跳跃持续时间计算跳跃高度。# 移除超出屏幕的障碍物。

helloshili2011的博客 2496

告别重打包:在Android 9上实现免Root的Frida-Gadget持久化Hook(附AOSP源码修改详解)

本文详细介绍了在Android 9上实现免Root的Frida-Gadget持久化Hook技术方案。通过修改AOSP源码,绕过传统重打包方式面临的签名校验和完整性检查,实现在非Root环境下的系统级Hook。文章包含核心代码修改、编译配置调整及调试技巧,为移动安全研究提供高效稳定的解决方案。

weixin_33726313的博客 501

一篇文章讲清楚VO,BO,PO,DO,DTO的区别

随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC),伴随着这些编程模型,又有一大批新的概念蜂拥而至,什么VO,BO,PO,DO,DTO之类的,这些新的概念一直以来都是云里雾里,网上虽然也有不少文章来区分这些概念,但看下来基本都是几篇相同的文章转载来转载去,这些文章本身也说的不明,有些还互相矛盾,再加上有些文章在简化系统里面来使用这些概念,让人越看越迷糊 我们先来回答一个问题,为什么会...

cowcomic的专栏 1万+

ITIL 4 Foundation 自学通关笔记1

ITIL 4 Foundation 自学通关笔记

m0_58817196的博客 953

一文读懂java的dto、dao、vo、bo、do、po、pojo

在java编程中我们常常需要做数据交换,那么在数据交换过程中就需要使用到实体对象,这就不可避免的使用到vo、dto、po等实体对象,在java中都属于pojo的范畴,至少在不同场景下使用所表达的含义不同,其中常用的就是视图层和后端交互用vo,后端和持久化交换用dto、rpc等数据交换用dto等。

rainyonelove的专栏 3万+

RK3588开发板NPU加速YOLO目标检测完整实战教程

🚀 RK3588开发板NPU加速YOLO目标检测实战 本文详细介绍了如何在瑞芯微RK3588开发板上利用内置NPU加速YOLO目标检测的全流程: 1️⃣ 环境准备:配置RKNPU2 SDK和aarch64交叉编译器,搭建Ubuntu开发环境 2️⃣ 模型转换:从ONNX格式转换为专用RKNN模型,适配NPU硬件特性 3️⃣ 性能对比:NPU推理将处理时间从833ms降至50ms以下,帧率提升16倍 4️⃣ 实战应用:支持图像/视频流/摄像头实时检测,提供完整编译和运行命令 关键优势:专为边缘AI设计的6T

FJN110的博客 931

最新Python爬虫实战(入门爬虫篇)——案例7:电影网站电影数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过Python爬虫技术,成功实现了对某电影网站Top250多页电影详细信息的批量爬取与Excel保存。代码采用模块化设计,包含分页请求构造、XPath+正则提取结构化信息、Excel数据持久化保存等完整流程。通过配置User-Agent等请求头信息,有效模拟浏览器行为以绕过豆瓣基础反爬策略。整个爬虫逻辑遵循"分页遍历 → 请求页面 → 解析HTML → 提取电影信息 → 保存到Excel"的标准流程,与主流静态网站爬取范式高度一致。

努力让自己发光,对的人才能迎着光而来 11万+

Java中的VO,BO,PO,DO,DTO

  随着现在后端编程标准化程度越来越高,各种编程模型层出不穷。作为Java开发人员,大部分人不免要接触VO,BO,PO,DO,DTO之类的,但很多人对这些概念一直以来都是云里雾里,团队开发过程中也总是处于混乱的状态,抓起来就用,本来是规范性的东西,却反而导致更加混乱了。   今天我们把这些概念掰开揉碎来讲解一下,力求有一个清晰的理解,在开发中能有所助益。文中又理解不到位的,也欢迎大家斧正。 概念 VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

Lifelong learning 7422

CST与MATLAB连接设置

打开MATLAB,点击"Set Path"按钮,然后点击"Add Folder"。在CST中,点击"Options"菜单,然后选择"Advanced"选项。在弹出的对话框中,点击"COMSOL"选项卡,并确保"Enable COMSOL"复选框被选中。通过上述步骤和示例代码,你可以开始使用MATLAB与CST进行集成,并根据你的具体需求进行进一步的开发和应用。通过这个简单的示例,你可以开始在MATLAB中与CST进行交互,并根据你的需求进行更复杂的操作,如参数化仿真、优化和数据处理等。

TechPulseZ的博客 1966

【Java】—一篇搞懂POJO和VO、BO、DTO、PO模型

POJO(Plain Old Java Object/Plain OrdinaryJava Object)是指普通的Java对象,它是一个简单的Java类,通常没有实现特定的接口或继承特定的类。POJO对象的设计原则是简单、普通、纯粹的Java对象,不依赖于特定的框架或技术。当然,如果有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

一棵灬大树的博客 2646

ISO 21434汽车网络安全标准深度解读系列(十):标准实施总结与展望

ISO21434标准深度解读系列总结篇系统回顾了汽车网络安全标准的核心内容与实施要点。文章梳理了10篇系列文章的结构体系,提炼出标准的三大核心价值:系统性方法(全生命周期覆盖、多层次管理)、风险导向理念(威胁驱动、动态管理)和供应链协同机制。总结了实施经验中的关键要素,包括高层承诺、专业团队建设,并提出了分阶段实施路径建议。同时分析了当前面临的技术挑战(系统复杂性、新兴技术)和管理挑战(文化转变、资源投入)。最后展望了AI应用、零信任架构等技术发展趋势,以及标准未来的演进方向,为企业实施提供战略与执行层面的

VehSwHwDeveloper的博客 559

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java中VO、DTO、BO、DO、PO傻傻分不清?一篇文章让你彻底搞懂!

Java分层对象区别与实战指南 本文系统讲解了Java项目中常见的分层对象(PO/DO/BO/DTO/VO)的核心区别与使用场景。通过餐厅后厨的生动类比,阐释了"职责分离"的设计思想。文章详细对比了各类对象的特点: PO:与数据库表直接映射的持久化对象 DO:包含业务逻辑的领域对象 BO:组合多个实体完成业务场景的复合对象 DTO:用于跨层/微服务间传输的扁平化对象 VO:为前端展示定制的数据对象 每个概念都配有典型代码示例,清晰展示了不同场景下的对象定义方式。掌握这些分层对象的区别,能

weixin_58375621的博客 2247

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VO、DTO、DO、BO、PO

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

时光里的博客 2990

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java 开发中 一篇文章讲清楚VO,BO,PO,DO,DTO的区别

⼀、概念定义 1、PO:Persistant Object(持久对象),基本上,PO对象中的属性就是对应着数据库中表的字段,加上⼀些get和set⽅法的组成。例:个⼈信息表中分别有:id,name,age,sex,birthday则PO对象中的属性有:id,name,age,sex,birthday{“id”: 1,“name”: “张三”,“age”: 20,“sex”: “男”,“birthday”: “2000-03-24”} 2、BO:Business Object(业务对象),相⽐于PO来说,BO

Bulldozer_GD的博客 6168

VO、BO、PO、DO、DTO的区别

随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这些编程模型,又有一大批新的概念蜂拥而至,什么VO,BO,PO,DO,DTO之类的,这些新的概念一直以来都是云里雾里,网上虽然也有不少文章来区分这些概念,但看下来基本都是几篇相同的文章转载来转载去,这些文章本身也说的不明,有些还互相矛盾,再加上有些文章在简化系统里面来使用这些概念,让人越看越迷糊。 面对这个图,让我们先从承上启下的DTO开始入手。 DTO(Data Transfer Object) 数据传输对象 这

m0_60252632的博客 6429

Java中PO BO VO DTO DO概念解析

对象层级核心职责典型场景PO数据访问层(DAO)数据库映射MyBatis/Hibernate操作数据库DO领域层(Domain)封装领域模型和业务规则DDD中的实体对象BO业务逻辑层(Service)复杂业务逻辑聚合跨多个PO/DO的业务操作DTO传输层跨层/跨服务数据传输Controller-Service交互VO展示层(View)适配前端展示需求返回给前端的JSON数据。

qq_34548728的博客 1618

搞懂 Java 中的 VO、BO、PO、DTO、DO:一个八年 Java 开发的踩坑与总结

摸爬滚打八年 Java 开发,从最初在老项目里对着一堆 “User”“UserInfo” 类一脸懵,到现在能在新项目里清晰定义各种 “O” 的边界,中间踩过的坑、排查过的诡异 Bug,多半都和这些 “数据载体类” 的混乱有关。

Minoz_wl的博客 2015

VO,BO,PO,DO,DTO的区别

这些概念全上 上哪些概念,省哪些,我给一些实际建议 1,PO这个没法省,不管叫PO还是Entity,怎么着都得有 2,一些工具类的系统和一些业务不是很复杂的系统DTO是可以和BO合并成一个,当业务扩展的时候注意拆分就行 3,VO是可以第一个优化掉的,展示业务不复杂的可以压根儿不要,直接用DTO 4,这也是最重要的一条,概念是给人用的,多人协作的时候一定要保证大家的概念一致,赶紧把这篇文章转发给跟你协作的人。因此让我们立足这些概念本身,达成对概念理解的一致性,就足够了,这也是这边文章的主要目的。

W52Hertz12的博客 1275

Java中VO,BO,PO,DO,DTO的详解

java

抽象的螺旋 3495

通俗易懂:VO、BO、PO、DO、DTO 的区别

PO:数据库表的映射,与数据库结构一一对应DO:包含业务逻辑的领域对象,是业务的核心BO:封装多个 DO 的业务对象,处理复杂的业务逻辑DTO:用于不同层之间传输数据,可以隐藏内部实现细节VO:用于页面展示,根据展示需求封装数据数据访问层关注 PO业务逻辑层关注 DO 和 BO接口层关注 DTO展示层关注 VO提高代码的可维护性降低系统各层之间的耦合更好地适应需求变化提高代码的复用性高内聚,低耦合。每一层都只关注自己需要的数据,通过对象转换来实现层与层之间的解耦。

m0_74109105的博客 2710

PO、VO、BO、DTO、DAO、POJO傻傻分不清楚

最近有小伙伴问我:O、VO、BO、DTO、DAO、POJO有什么区别?第一眼看到,你可能也会有点懵。这些对象的概念很多,确实容易搞混。今天这篇文章跟大家一起聊聊这6种对象的含义、职责、区别和常见的坑,希望对你会有所帮助。单一职责:PO只存数据,BO只管业务,VO只负责展示——绝不越界!安全隔离:PO永不出DAO层(防数据库泄露)VO永不出Controller(防前端逻辑污染服务)性能优先:大对象转换用MapStruct(编译期生成代码)嵌套集合用批量查询(杜绝N+1)适度设计必须严格分层。

sdgfafg_25的博客 1352
上一篇: Java后端详解-框架篇_precompilermapper,零基础入门到精通,收藏这篇就够了
下一篇: java中反射机制的应用场景,零基础入门到精通,收藏这篇就够了
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值