JAVA实体设计如何整合PO,IO,VO?

目前用了三种
PO:和数据库字段一一对应,直接存入数据库.

IO:继承自PO,用于接收前端传来的数据.

VO:继承自PO,返回给前端要显示的数据.

但是感觉写起来很麻烦.

有没有一种方式,我只写一个PO,然后通过给字段加注解的方式.

比如

@Data
class User{
    @PO
    @VO
    @IO
    private String name;

    @PO
    @IO
    private String id;
}

就类似这种,然后不论哪里用,都只传User就可以了.

id可以存到数据库,也会从前端接收.

但是不会出现在返回给前端的字段中.

就大概意思是这样.有类似框架么?

是个新手.知道的东西不多,来请教各位,还请不吝赐教.

我的建议是千万不要把不同用途的数据强行揉合在一起,虽然看起来代码少了一点,但是实际使用的时候非常麻烦(相同名字的字段在不同的各种对象中可能含义不同、类型不同),代码难以维护和修改。一般PO都是写工具自动生成出来的,数据表订好之后基本就不会改动。而IO、VO则需要根据前端需求经常变动

跟着阿里巴巴程序开发设计文档走呗

https://www.cnblogs.com/han-1034683568/p/7680354.html

1、可以考虑使用@JsonView这个注解 但是这个注解需要你在实体里定义视图(如果你有多个返回不同值的接口,就得定义多个视图),具体的用法你可以百度一下

2、可以直接封装一个转换工具类,核心思路就是:拿到实体以后,将实体转成JSONObject,然后在移除掉你不想返回的字段就行

下面这个封装逻辑你后续可以结合注解+AOP来弄,然后就直接在controller上定义返回的字段就行了,没必要到实体类里定义

 

import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.Arrays;
import java.util.Date;

@Data
public class People {

    private int id;
    private String name;
    private int age;
    private int sex;
    private Date date;

    /**
     *
     * @param entity 要转换的实体
     * @param ignoreColumnName 忽略实体中的字段名,多个字段名使用 , 逗号分隔
     */
    public static <T> String test(T entity,String ignoreColumnName) {
        //实体对象 转成 JSON格式
        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(entity));

        String[] split = ignoreColumnName.split(",");

        //移除 要忽略的字段名
        Arrays.asList(split).forEach(d -> {
            jsonObject.remove(d);
        });

        return jsonObject.toJSONString();
    }

    public static void main(String[] args) {
        People people = new People();
        people.setId(1);
        people.setAge(18);
        people.setDate(new Date());
        people.setName("测试");
        people.setSex(1);
        System.out.println("转换前:"+JSONObject.toJSONString(people));

        String ignoreColumnName = "date,age,sex";
        String test = test(people, ignoreColumnName);

        System.out.println("转换后:"+test);
    }

}