UJCMS后端二次开发教程07-实体类(Domain)

2023-08-29 23:48 阅读

实体类的主要作用是与数据库的表、字段相对应。一般来说,一个表对应一个实体类(Domain),一个字段对应一个属性。

数据库表结构改变,实体类就要做相应的改变。这部分工作是重复性的,一般由代码生成器代劳。修改表结构后,只要再次执行代码生成器,即可完成实体类(Domain)的改动。

实际开发中经常需要修改实体类,而代码生成器每次都会重新生成整个实体类,会把程序员修改的代码覆盖。为此,将实体类分成两部分,一部分是由代码生成器维护的实体基类ExampleBase,另一部分则是真正使用的实体类ExampleExample继承ExampleBase。需要增加额外代码时,加到Example中即可。

ExampleBase

com.ujcms.cms.ext.domain.base.ExampleBase

public class ExampleBase implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 数据库表名
     */
    public static final String TABLE_NAME = "example";

    /**
     * ID
     */
    @NotNull
    @Schema(description="ID")
    private Integer id = 0;

    /**
     * 名称
     */
    @Length(max = 30)
    @Nullable
    @Schema(description="名称")
    private String name;

    /**
     * 描述
     */
    @Length(max = 150)
    @Nullable
    @Schema(description="描述")
    private String description;

    /**
     * 身高
     */
    @Nullable
    @Schema(description="身高")
    private Integer height;

    /**
     * 出生日期
     */
    @Nullable
    @Schema(description="出生日期")
    private OffsetDateTime birthday;

    /**
     * 是否启用
     */
    @NotNull
    @Schema(description="是否启用")
    private Boolean enabled = true;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Nullable
    public String getName() {
        return name;
    }

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

    @Nullable
    public String getDescription() {
        return description;
    }

    public void setDescription(@Nullable String description) {
        this.description = description;
    }

    @Nullable
    public Integer getHeight() {
        return height;
    }

    public void setHeight(@Nullable Integer height) {
        this.height = height;
    }

    @Nullable
    public OffsetDateTime getBirthday() {
        return birthday;
    }

    public void setBirthday(@Nullable OffsetDateTime birthday) {
        this.birthday = birthday;
    }

    public Boolean getEnabled() {
        return enabled;
    }

    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }
}

不要改动ExampleBase,该类由代码生成器维护,每次运行代码生成器,这个类都会重新生成,所做的修改会被覆盖。

Example类

com.ujcms.cms.ext.domain.Example

public class Example extends ExampleBase implements Serializable {
    private static final long serialVersionUID = 1L;
}

需要增加额外代码时,在Example中增加,不要修改ExampleBase

关于日期类型

日期类型一律映射成Java8的OffsetDateTime,不使用传统的Date类型。

SpringDoc(swagger)

代码生成时,会根据数据库字段的注释,生成swagger的注解。如:

@Schema(description="名称")

Validation校验

生成器会根据数据库字段是否允许为NULL,以及字符串长度,生成相应的Validation注解。如:

@Length(max = 30)
@Nullable

需注意,如果字符串长度能够同时被3和10整除,会认为用于存储中文。考虑到有些数据库字符长度以字节单位,一个中文最多需要3个字节存储,因此映射时会将最大长度限制除以3。如:

varchar(450) -> @Length(max = 150)
varchar(90) -> @Length(max = 30)
varchar(30) -> @Length(max = 10)
varchar(10) -> @Length(max = 10)
varchar(15) -> @Length(max = 15)
varchar(3) -> @Length(max = 3)
varchar(12) -> @Length(max = 12)
varchar(255) -> @Length(max = 255)
QQ咨询
电话
微信
微信扫码咨询