Spring开发实践(四)

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的信息则是在PO信息的基础上进⾏扩充,也可以理解为多个PO对象的信息按照业务流程必要的拼凑在⼀起形成的对象。例:个⼈信息表中分别有:id,name,age,sex,birthday,个⼈学历表中分别有:id,school,educational_background,按照个⼈信息表与学历表进⾏关联,将⽤户的个⼈信息集合在⼀起。则BO对象中可以是两个表信息的组合:id,name,age,sex,birthday,school,educational_background {“id”: 1,“name”: “张三”,“age”: 20,“sex”: “男”,“birthday”: “2000-03-24”,“school”:“XXX⼤学”,“educational_background”:“本科”}

3、DTO:Data Transfer Object(数据传输对象),顾名思义,dto的作⽤是传递数据。但是我们按照业务流程处理得到的数据,并不是全部都要进⾏显⽰,或者并不能完全都按照当前形势进⾏展⽰,按照业务要求,还要在已有数据的基础上进⾏过滤删减。例:个⼈信息表中分别有:id,name,age,sex,birthday,我们可能只需要⽤户的名字、年龄和性别来显⽰,像⽣⽇这样的信息就没有必要进⾏传输了,所以对已有的数据进⾏删减,只传输需要的信息。则DTO对象中的信息为:id,name,age,sex {“id”: 1,“name”:“张三”,“age”: 20,“sex”: “男”}

4、VO:Value Object(值对象),可以理解为展⽰要⽤的数据,传递到前端页⾯上,直接进⾏展⽰。为了保证数据可以直接展⽰使⽤,就要对数据进⾏处理。例:个⼈信息表中分别有:id,name,age,sex,birthday,我们需要展⽰的是⽤户的当前状态,像年龄和性别则没有必要分开显⽰,可以进⾏合并。则vo对象中的信息为:id,name,type,birthday {“id”: 1,“name”: “张三”,“type”:“少年”,“birthday”: “2000-03-24”}

5、DAO:Data Access Object(数据访问对象),存储访问数据库完成数据处理操作的⽅法的对象。

在这里插入图片描述

1. VO(Value Object)

值对象,通常用于表示一个不可变的对象,其主要目的是传递数据。值对象通常没有唯一标识,两个值对象如果其属性相同,则认为它们是相等的。

  • 用途:用于数据传递,通常在视图层和服务层之间。
  • 特点:不可变、无唯一标识。
  • 示例
public class AddressVO {
    private final String street;
    private final String city;
    private final String zipcode;

    public AddressVO(String street, String city, String zipcode) {
        this.street = street;
        this.city = city;
        this.zipcode = zipcode;
    }

    // Getters and other methods
}

2. BO(Business Object)

业务对象,用于封装业务逻辑。BO通常包含业务方法和业务规则,是业务层的核心对象。

  • 用途:封装业务逻辑,通常在服务层和业务层之间。
  • 特点:包含业务逻辑和业务规则。
  • 示例
public class OrderBO {
    private Long orderId;
    private List<OrderItem> items;

    public void addItem(OrderItem item) {
        // 业务逻辑
        items.add(item);
    }

    // Other business methods
}

3. PO(Persistent Object)

持久化对象,用于表示数据库中的一条记录。PO通常与数据库表结构一一对应,用于持久化数据。

  • 用途:表示数据库中的一条记录,通常在数据访问层(DAO层)使用。
  • 特点:与数据库表结构对应,有唯一标识(主键)。
  • 示例
public class UserPO {
    private Long id;
    private String username;
    private String password;

    // Getters and setters
}

4. DO(Data Object)

数据对象,用于表示数据源中的数据。DO和PO有时可以互换使用,但DO更广泛,可以表示任何数据源中的数据,而不仅仅是数据库。

  • 用途:表示数据源中的数据,通常在数据访问层使用。
  • 特点:与数据源结构对应,有唯一标识。
  • 示例
public class ProductDO {
    private Long productId;
    private String productName;
    private Double price;

    // Getters and setters
}

5. DTO(Data Transfer Object)

数据传输对象,用于在不同层之间传输数据。DTO通常用于远程调用或跨进程通信,以减少网络开销。

  • 用途:在不同层之间传输数据,通常在服务层和控制层之间,或者在远程调用时使用。
  • 特点:用于传输数据,通常是可序列化的。
  • 示例
public class UserDTO {
    private Long id;
    private String username;
    private String email;

    // Getters and setters
}

总结

  • VO(Value Object):用于数据传递,不可变、无唯一标识。
  • BO(Business Object):封装业务逻辑,包含业务方法和业务规则。
  • PO(Persistent Object):表示数据库中的一条记录,与数据库表结构对应,有唯一标识。
  • DO(Data Object):表示数据源中的数据,与数据源结构对应,有唯一标识。
  • DTO(Data Transfer Object):用于在不同层之间传输数据,通常是可序列化的。

DEV、SIT、UAT、PET、SIM、PRD/PROD

  • DEV(Development)是开发环境,用于软件的开发和编码阶段。在DEV环境中,开发人员可以进行代码编写、功能实现和单元测试

  • SIT(System Integration Testing)是系统集成测试环境,用于集成不同模块和组件的测试。在SIT环境中,测试人员会测试系统的各个部分之间的集成,验证系统的整体功能和性能。

  • UAT(User Acceptance Testing)是用户验收测试环境,用于用户对系统进行测试和确认。在UAT环境中,真实用户或代表用户的人员会执行测试用例,验证系统是否满足业务需求。

  • PET(Pre-production Environment Testing)是预生产环境测试,用于在系统上线之前进行最后的测试和确认。在PET环境中,模拟生产环境的配置和数据,确保系统能够正常运行。

  • SIM(System Integration and Maintenance)是系统集成和维护环境,用于系统的集成、部署和维护。在SIM环境中,会进行系统的集成测试、部署和运维操作。

  • PRD/PROD(Production)是生产环境,也称为正式环境,用于系统的正式运行和提供服务。在PRD环境中,系统已经上线,供用户使用。

在这里插入图片描述

Redis为什么比MySQL高效?

Redis 和 MySQL 都是常用的数据库系统,但它们的设计目标和使用场景不同,这导致了它们在性能上的差异。以下是 Redis 比 MySQL 快的几个主要原因:

  1. 内存存储

    • Redis:Redis 是一个内存数据库,所有的数据都存储在内存中,读写速度非常快。
    • MySQL:MySQL 是一个磁盘数据库,数据主要存储在磁盘上,虽然有缓存机制,但读写速度相对较慢。
  2. 数据结构

    • Redis:Redis 提供了丰富的数据结构,如字符串、哈希、列表、集合、有序集合等,这些数据结构在内存中操作非常高效。
    • MySQL:MySQL 主要使用关系型数据结构,操作复杂查询时需要进行磁盘 I/O 操作,速度较慢。
  3. 单线程模型

    • Redis:Redis 使用单线程模型,避免了多线程上下文切换的开销,充分利用了现代 CPU 的单线程性能。
    • MySQL:MySQL 使用多线程模型,虽然可以并行处理多个请求,但也带来了线程切换和锁竞争的开销。
  4. 无磁盘 I/O

    • Redis:由于数据全部在内存中,Redis 避免了磁盘 I/O 的开销。
    • MySQL:MySQL 需要频繁进行磁盘 I/O 操作,特别是在数据量较大时,性能会受到影响。
  5. 简化的持久化机制

    • Redis:Redis 提供了 RDB 和 AOF 两种持久化机制,可以根据需要选择合适的持久化策略,持久化操作可以异步进行,不影响主线程的性能。
    • MySQL:MySQL 的持久化机制较为复杂,需要保证数据的一致性和完整性,写操作的性能相对较低。
  6. 高效的网络协议

    • Redis:Redis 使用了高效的二进制协议,减少了网络传输的开销。
    • MySQL:MySQL 使用了文本协议,虽然通用性强,但网络传输的开销较大。

总结来说,Redis 通过内存存储、单线程模型、高效的数据结构和网络协议等设计,使得它在读写性能上远远超过了 MySQL。然而,Redis 适用于需要快速读写和缓存的场景,而 MySQL 适用于需要复杂查询和事务处理的场景。选择使用哪种数据库,取决于具体的应用需求。

MongoDBMySQL的区别和联系

MongoDB 和 MySQL 是两种不同类型的数据库系统,各自有其独特的特点和适用场景。以下是它们的主要区别和联系:

区别

  1. 数据模型

    • MongoDB:MongoDB 是一个文档型数据库,使用 BSON(类似 JSON)格式存储数据。数据以文档的形式存储在集合中,文档之间没有固定的模式(Schema-less)。
    • MySQL:MySQL 是一个关系型数据库,使用表格形式存储数据。数据存储在行和列中,表之间有固定的模式(Schema)。
  2. 查询语言

    • MongoDB:MongoDB 使用 MongoDB 查询语言(MQL),支持丰富的查询和聚合操作。
    • MySQL:MySQL 使用结构化查询语言(SQL),是一种标准化的查询语言,广泛应用于关系型数据库。
  3. 事务支持

    • MongoDB:MongoDB 在 4.0 版本之后开始支持多文档事务,但其事务支持相对较新,适用于需要事务的场景。
    • MySQL:MySQL 原生支持 ACID 事务,适用于需要强一致性和复杂事务处理的场景。
  4. 扩展性

    • MongoDB:MongoDB 天生支持水平扩展(Sharding),可以轻松扩展到多个节点,适合大规模数据和高并发场景。
    • MySQL:MySQL 主要通过主从复制和分区来实现扩展,水平扩展相对复杂。
  5. 数据一致性

    • MongoDB:MongoDB 默认提供最终一致性,适用于对一致性要求不高的场景。可以通过配置实现强一致性。
    • MySQL:MySQL 默认提供强一致性,适用于对数据一致性要求高的场景。
  6. 性能

    • MongoDB:MongoDB 在处理大规模数据和高并发读写操作时表现优异,适合实时分析和大数据处理。
    • MySQL:MySQL 在复杂查询和事务处理方面表现优异,适合传统的业务系统和数据分析。

联系

  1. 数据存储

    • MongoDBMySQL 都是用于存储和管理数据的数据库系统,提供了数据的持久化存储。
  2. 索引

    • MongoDBMySQL 都支持索引,可以通过创建索引来提高查询性能。
  3. 备份和恢复

    • MongoDBMySQL 都提供了备份和恢复机制,确保数据的安全性和可靠性。
  4. 复制和高可用性

    • MongoDBMySQL 都支持复制机制,可以通过主从复制或集群来实现高可用性。
  5. 社区和生态系统

    • MongoDBMySQL 都有庞大的社区和丰富的生态系统,提供了大量的工具和资源支持。

总结

MongoDBMySQL 各有优势,选择使用哪种数据库,取决于具体的应用需求。MongoDB 适用于需要灵活数据模型、高并发读写和大规模数据处理的场景,而 MySQL 适用于需要复杂查询、事务处理和强一致性的场景。两者可以结合使用,在不同的业务场景中发挥各自的优势。

事务中开启子线程,会导致@Transactional注解的事务失效吗?

在使用 @Transactional 注解管理事务时,事务的范围通常是当前线程。

Spring中,事务管理是通过 @Transactional 注解和事务传播机制来实现的。事务传播机制定义了事务在不同方法调用之间的传播行为。然而,事务上下文是与当前线程绑定的,因此在事务中开启子线程会导致子线程无法继承主线程的事务上下文。这意味着子线程中的数据库操作不会参与主线程的事务管理。

详细解释

  1. 事务上下文与线程绑定

    • Spring 的事务管理器(如 DataSourceTransactionManager)通过 ThreadLocal 变量来管理事务上下文。ThreadLocal 变量是线程私有的,因此事务上下文只能在当前线程中访问和管理。
  2. 子线程无法继承事务上下文

    • 当你在事务中开启子线程时,子线程无法继承主线程的事务上下文。子线程中的数据库操作将不会受到主线程事务的控制,可能会在主线程事务提交或回滚之前独立提交。

示例

假设你有一个带有 @Transactional 注解的方法,在该方法中开启了一个子线程:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional
    public void performTransactionalOperation() {
        // 主线程中的数据库操作
        // ...

        // 开启子线程
        new Thread(() -> {
            // 子线程中的数据库操作
            // 这些操作不会参与主线程的事务管理
            // ...
        }).start();
    }
}

在这个示例中,子线程中的数据库操作不会参与主线程的事务管理,因此可能导致数据不一致。

解决方案

如果你需要在事务中执行并发操作,可以考虑以下几种解决方案:

  1. 使用同步操作

    • 尽量避免在事务中开启子线程,改为使用同步操作,确保所有数据库操作都在同一个事务上下文中执行。
  2. 手动管理事务

    • 在子线程中手动管理事务,确保子线程中的数据库操作在独立的事务中执行。

总结

  • 事务上下文与线程绑定Spring 的事务管理器通过 ThreadLocal 变量管理事务上下文,事务上下文只能在当前线程中访问。
  • 子线程无法继承事务上下文:在事务中开启子线程会导致子线程无法继承主线程的事务上下文,子线程中的数据库操作不会参与主线程的事务管理。
  • 解决方案:尽量避免在事务中开启子线程,或者在子线程中手动管理事务。

@Transactional注解中连接到多个数据库,会导致事务失效吗?

Spring中,@Transactional 注解用于声明事务管理。默认情况下,Spring的事务管理器(如 DataSourceTransactionManager)只能管理单个数据源的事务。如果你在一个事务中操作多个数据源,而没有正确配置分布式事务管理器,可能会导致事务失效或无法正确回滚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

德国哥廷根大学《Nature Geoscience》最新成果!揭示热带森林对季节性干旱的响应机制!

本文首发于“生态学者”微信公众号&#xff01; 越来越多的研究称热带森林的生产力受到养分限制&#xff0c;这可能影响其对季节性干旱的反应&#xff08;Nature正刊&#xff01;亚利桑那大学 博士生陈舒立一作兼通讯 最新重磅成果&#xff01;&#xff1b;《Nature Geoscience…

简洁易用,快速制作高品质产品册的工具

在数字化时代&#xff0c;高效制作高品质产品册的需求日益增长。市场上涌现出众多声称能够帮助快速制作产品册的工具&#xff0c;但真正能兼顾简洁易用和品质的却寥寥无几。 ​这款工具名为“FLBOOK”&#xff0c;它凭借其强大的功能和简单易用的操作界面&#xff0c;赢得了众多…

RK3568笔记三十三: helloworld 驱动测试

若该文为原创文章&#xff0c;转载请注明原文出处。 报着学习态度&#xff0c;接下来学习驱动是如何使用的&#xff0c;从简单的helloworld驱动学习起。 开始编写第一个驱动程序—helloworld 驱动。 一、环境 1、开发板&#xff1a;正点原子的ATK-DLRK3568 2、系统&#xf…

谷粒商城学习笔记-23-分布式组件-SpringCloud Alibaba-Nacos配置中心-简单示例

之前已经学习了使用Nacos作为注册中心&#xff0c;这一节学习Nacos另外一个核心功能&#xff1a;配置中心。 一&#xff0c;Nacos配置中心简介 Nacos是一个易于使用的平台&#xff0c;用于动态服务发现和配置管理。作为配置中心&#xff0c;Nacos提供了以下核心功能和优势&am…

适合初学者的嵌入式项目有哪些?

适合初学者的嵌入式项目有哪些? 嵌入式学习是一个实践性很强的领域&#xff0c;通过实际项目可以帮助你巩固理论知识并提升技能。以下是几个适合初学者练手的嵌入式项目&#xff0c;每个项目都涵盖了从硬件到软件的不同层面&#xff1a; 1.LED灯控制 详细描述&#xff1a;在…

Parallels Desktop 19 for Mac 让你的 Mac 变得无比强大

简单来说&#xff0c;Parallels Desktop 19 for Mac 可以让你在苹果 Mac 电脑 (包括 M1、M2 或 Intel) 的电脑上「同时运行」一个或多个 Windows 或 Linux 系统&#xff0c;并能随意在不同平台软件之间切换。它能让你的 Mac 变得无比强大&#xff0c;因为 PD 能让你直接在 macO…

centos下编译安装redis最新稳定版

一、目标 编译安装最新版的redis 二、安装步骤 1、redis官方下载页面 Downloads - Redis 2、下载最新版的redis源码包 注&#xff1a;此时的最新稳定版是 redis 7.2.5 wget https://download.redis.io/redis-stable.tar.gz 3、安装编译环境 yum install -y gcc gcc-c …

debian 12 Install

debian 前言 Debian是一个基于Linux内核的自由和开放源代码操作系统&#xff0c;由全球志愿者组成的Debian项目维护和开发。该项目始于1993年&#xff0c;由Ian Murdock发起&#xff0c;旨在创建一个完整的、基于Linux的自由软件操作系统。 debian download debian 百度网盘…

地理信息安全与隐私保护:守护你我位置的隐形盾牌

在数字时代&#xff0c;地理信息技术如地理信息系统&#xff08;GIS&#xff09;和全球定位系统&#xff08;GPS&#xff09;已成为日常生活不可或缺的一部分&#xff0c;它们为我们带来便利的同时&#xff0c;也悄然触及个人隐私的敏感地带。今天&#xff0c;我们就来聊聊地理…

ARMxy微电网控制新星:赋能智能电网监控

能源转型和智能电网建设高效、可靠的电力输配系统成为了行业关注的焦点。随着物联网、大数据、人工智能技术的融合应用&#xff0c;电网监控与变电站自动化系统亟需更为智能、灵活的解决方案来提升其性能与稳定性。正是在这样的背景下&#xff0c;ARM电力控制微电网主机BL340以…

前端预览图片的两种方式:转Base64预览或转本地blob的URL预览,并再重新转回去

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 预览图片 一般情况下&#xff0c;预览图片功能&#xff0c;是后端返回一个图片地址资源&#xff08;字符串&#xff09;给前端&#xff0c;如&#xff1a;ashuai.work/static…

PMP考试必须要报培训班,不能自学!

绝对不是危言耸听。有网友分享了可以自学不报培训班&#xff0c;只是比较幸运&#xff0c;没有赶上这个时期而已。你可以不相信我&#xff0c;但是官方发布的信息你还是要认真考虑。那一期有很多因为自学而没有顺利抢到考位的考生&#xff0c;白白浪费了好几个月的时间。 大家千…

Android adb启动任意app的几种方式

使用adb启动应用程序主要有两种方式&#xff1a;一种是已知应用程序的包名和主Activity&#xff0c;另一种是不知道应用程序的包名和主Activity。 已知应用程序的包名和主Activity 在这种情况下&#xff0c;我们可以通过输入特定的adb命令来启动应用程序。具体步骤如下&#x…

Swin Transformer重磅升级!开源新SOTA准确率高达99.92%,更省计算资源

今天我们来聊一个超强的算法模型&#xff0c;Swin Transformer。 Swin Transformer是一种创新的视觉模型&#xff0c;它通过层次化多尺度架构、移位窗口策略和局部自注意力机制等创新设计&#xff0c;成功解决了传统Transformer从NLP到CV任务时面临的问题&#xff0c;实现了高…

Java中的LinkedList(链表)(如果想知道Java中有关LinkedList的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在Java编程语言中&#xff0c;Java集合框架提供了一组丰富的数据结构&#xff0c;以满足各种应用需求。其中&#xff0c;LinkedList作为一种常用的数据结构&#xff0c;具有独特的优势和广泛的应用场景。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内…

【全面介绍语言模型的原理,实战和评估】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🥂语言模型的原理 🥂语言模型基于统计和机器学习的原理,目标…

LDR6282-显示器:从技术革新到视觉盛宴

显示器&#xff0c;作为我们日常工作和娱乐生活中不可或缺的一部分&#xff0c;承载着将虚拟世界呈现为现实图像的重要使命。它不仅是我们与电子设备交互的桥梁&#xff0c;更是我们感知信息、享受视觉盛宴的重要窗口。显示器在各个领域的应用也越来越广泛。在办公领域&#xf…

【Linux】进程间通信之System V共享内存

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

User parameters 用户参数与Web监控

目录 一. 自定义键介绍 二. 制作步骤 1. 添加无可变部分参数 2. 添加有可变参数 3. 使用用户参数监控php-fpm 服务的状态 三. Web页面导入应用监控 四. Web监控 主要功能和操作&#xff1a; 开启方式 官方预定义监控项文档https://www.zabbix.com/documentation/6…

聚合分销推广系统CPS和CPA聚合分销系统小程序搭建开发

目录 前言&#xff1a; 一、聚合cps和cpa是什么&#xff1f; 1.CPS&#xff08;Cost Per Sale&#xff09;&#xff0c; 2.CPA&#xff08;Cost Per Action&#xff09;&#xff0c; 二、聚合CPS与CPA推广系统的特色 三、实际应用场景示例 四、总结 前言&#xff1a; 聚合…