一篇文章带你搞懂POJO、JavaBean、VO、DTO和BO的区别及作用

目录

POJO(Plain Old Java Object)

JavaBean

VO(Value Object)

DTO(Data Transfer Object)

BO(Business Object)

如何进行对象拷贝

1. Apache Commons BeanUtils

2. Spring BeanUtils

3. ModelMapper

总结


在Java的世界里,我们经常听到POJO、JavaBean、VO、DTO和BO这些术语,它们都是用来描述不同类型的Java对象。今天,我们就来聊聊这些对象的区别和作用,以及它们是如何在代码中被拷贝的。

POJO(Plain Old Java Object)

POJO是最简单、最纯粹的Java对象,没有任何特殊的接口或基类继承。它通常用来表示一个简单的数据结构,不包含任何业务逻辑。

作用:

  • 作为数据的载体,不涉及业务逻辑。
  • 可以轻松地序列化和反序列化,方便网络传输。

Java代码示例:

 

java

public class UserPOJO {
    private String name;
    private int age;

    // 省略getter和setter方法
}

JavaBean

JavaBean是遵循特定约定的Java类,通常包括一个无参构造函数、属性的getter和setter方法,以及可选的事件处理和持久性存储代码。

作用:

  • 作为组件模型,可以被各种框架使用,如Spring。
  • 支持属性的绑定和事件的监听。

Java代码示例:

 

java

public class UserBean {
    private String name;
    private int age;

    public UserBean() {
        // 无参构造函数
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

VO(Value Object)

VO是用于展示层的对象,它包含了用户界面需要展示的所有数据。

作用:

  • 用于数据展示,可能包含一些计算后的数据或格式化的数据。

Java代码示例:

 

java

public class UserVO {
    private String fullName;
    private String formattedAge;

    public UserVO(String fullName, String formattedAge) {
        this.fullName = fullName;
        this.formattedAge = formattedAge;
    }

    // 省略getter方法
}

DTO(Data Transfer Object)

DTO用于系统间的数据传输,它可能包含来自不同实体的数据字段。

作用:

  • 简化系统间的通信,确保数据传输的完整性和一致性。

Java代码示例:

 

java

public class UserDTO {
    private String username;
    private String email;
    private int age;

    // 省略getter和setter方法
}

BO(Business Object)

BO封装了业务逻辑和业务规则。

作用:

  • 处理业务逻辑,如计算、验证等。

Java代码示例:

 

java

public class UserBO {
    private String username;
    private String password;

    public boolean checkPassword(String inputPassword) {
        // 业务逻辑:检查密码是否正确
        return password.equals(inputPassword);
    }

    // 省略getter和setter方法
}

如何进行对象拷贝

对象拷贝通常发生在DTO和BO之间,或者VO和BO之间。拷贝的环节通常是在数据从数据库(通过BO)转移到前端(通过VO或DTO)的过程中。

拷贝环节:

  • BO到VO/DTO:当从数据库获取数据后,需要将BO中的数据拷贝到VO或DTO中,以便传输到前端。
  • VO/DTO到BO:在接收到前端的数据后,需要将VO或DTO中的数据拷贝到BO中,以便进行业务逻辑处理。

Java代码示例:

 

java

public class ObjectCopier {
    public static UserVO copyBOToVO(UserBO bo) {
        UserVO vo = new UserVO(bo.getFullName(), bo.getFormattedAge());
        return vo;
    }

    public static UserDTO copyBOToDTO(UserBO bo) {
        UserDTO dto = new UserDTO();
        dto.setUsername(bo.getUsername());
        dto.setEmail(bo.getEmail());
        dto.setAge(bo.getAge());
        return dto;
    }
}

在这个例子中,我们使用了简单的手动拷贝方法。

使用库进行拷贝

1. Apache Commons BeanUtils

Apache Commons BeanUtils 提供了一个简单的方式来操纵JavaBean属性,包括拷贝属性。使用BeanUtils进行对象拷贝非常简单,只需要一行代码即可完成:

 

java

UserDTO dto = new UserDTO();
BeanUtils.copyProperties(dto, userBo); // userBo是BO对象,dto是DTO对象

这段代码会将userBo对象中的属性值复制到dto对象中。需要注意的是,BeanUtils进行的是浅拷贝,如果属性中包含对象引用,拷贝的是引用而不是对象本身。

2. Spring BeanUtils

Spring框架也提供了一个BeanUtils类,它的作用与Apache Commons BeanUtils类似,但是它是Spring框架的一部分,不需要额外的依赖:

 

java

UserDTO dto = new UserDTO();
BeanUtils.copyProperties(sourceBo, dto); // sourceBo是BO对象,dto是DTO对象

Spring的BeanUtils.copyProperties同样进行的是浅拷贝,并且它会忽略null值的属性。

3. ModelMapper

ModelMapper是一个强大的映射库,它可以在运行时通过反射将一个对象的属性映射到另一个对象。使用ModelMapper进行对象拷贝的代码如下:

 

java

ModelMapper modelMapper = new ModelMapper();
UserDTO dto = modelMapper.map(userBo, UserDTO.class); // userBo是BO对象,dto是DTO对象

ModelMapper默认情况下会处理名称相同的属性映射,也可以通过配置来处理名称不同的属性或者进行复杂的映射。

总结

不同的库有不同的特点和适用场景。Apache Commons BeanUtils和Spring BeanUtils适合简单的对象属性拷贝,而ModelMapper提供了更复杂的映射功能。在选择库时,需要考虑项目的具体需求和性能要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值