Skip to content

表实体

实体使用 @Table 标注

基本使用

以下是个实体示例

java

@Getter
@Setter
@Index(name = "dep_user_idx", columns = {"dep_id", "user_id"}, unique = true)
@Table(value = "sys_dep_user", comment = "部门用户")
public class DepUser {
    @Id(idType = IdType.SNOWFLAKE)
    private Long id;

    @ForeignKey(references = Dept.class, onDelete = ForeignKeyAction.CASCADE)
    @TableField(value = "dep_id", notNull = true, comment = "部门id")
    private Long depId;

    @ForeignKey(references = User.class, onDelete = ForeignKeyAction.CASCADE)
    @TableField(value = "user_id", notNull = true, comment = "用户id")
    private Long userId;

    @TableField(value = "manager", notNull = true, defaultValue = "0", comment = "是否负责人")
    private Boolean manager;

    @TableField(value = "create_time", notNull = true, comment = "创建时间", onInsertValue = "now()")
    private LocalDateTime createTime;

    public static DepUser def() {
        DepUser depUser = new DepUser();
        depUser.setManager(false);
        return depUser;
    }
}

@Table

@Table注解用于标注实体类,包含以下属性:

java
/**
 * 数据库表
 * @author ic
 * @since 2023/5/18
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Table {
    /**
     * 表名称
     */
    String value();
    /**
     * 数据库的 schema
     */
    String schema() default "";
    /**
     * 默认为 驼峰属性 转换为 下划线字段
     */
    boolean camelToUnderline() default true;
    /**
     * 默认使用哪个数据源,若系统找不到该指定的数据源时,默认使用第一个数据源
     */
    String dataSource() default "";
    /**
     * 注释
     */
    String comment() default "";

    /**
     * 开启自动建表默认true
     */
    boolean autoDDL() default true;

    /**
     * 表索引
     */
    Index[] index() default {};
}

@TableField

@TableField注解用于标注实体类的字段,包含以下属性:

java
/**
 * 数据库表字段
 * @author ic
 * @since 2023/5/18
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface TableField {
    /**
     * 字段名称
     */
    String value() default "";

    /**
     * insert 的时候默认值,这个值会直接被拼接到 sql 而不通过参数设置
     */
    String onInsertValue() default "";

    /**
     * update 的时候自动赋值,这个值会直接被拼接到 sql 而不通过参数设置
     */
    String onUpdateValue() default "";

    /**
     * 配置的 type如:DECIMAL(10,2)
     */
    String type() default "";

    /**
     * 注释
     */
    String comment() default "";

    /**
     * 是否是逻辑删除字段
     */
    boolean isLogicDelete() default false;

    /**
     * 是否禁止为空
     */
    boolean notNull() default false;

    /**
     * 长度 -1采用默认值
     */
    int length() default -1;

    /**
     * 小数长度 -1采用默认值
     */
    int fraction() default -1;

    /**
     * 默认值,仅用于生成sql,并不会在插入时生效
     */
    String defaultValue() default "";
}

@Id

@Id注解用于标注实体类的主键字段,包含以下属性:

目前只支持单主键

java
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Id {

    /**
     * ID 生成策略,默认为 INPUT 外部控制输入
     *
     * @return 生成策略
     */
    IdType idType() default IdType.INPUT;
}

@Version

@Version注解用于标注实体类的乐观锁字段:

java
/**
 * 版本注解,用于标识实体类中的版本字段。
 * 该注解通常用于乐观锁实现,标识版本号字段。
 * 在更新操作时,MyBatis 会自动处理版本号的递增和校验。
 * 使用了@Version 注解的字段,可以不用@TableField 注解。
 * PS: 只能用于long类型的字段。
 * @since 1.0
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Version {
}

@ForeignKey

@ForeignKey 注解用于标注实体类的外键关系,包含以下属性: 主要用于dber初始化数据库结构

java

/**
 * 外键注解。
 *
 * @author ic-framework
 * @since 2024/06/09
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ForeignKey {

    /**
     * 外键名称。
     *
     * @return 外键名称
     */
    String name() default "";

    /**
     * 关联表。
     *
     * @return 关联表类型
     */
    Class<?> references();

    /**
     * 关联字段。
     *
     * @return 关联字段名
     */
    String referencesColumn() default "";

    /**
     * 删除时的操作。
     *
     * @return 删除操作类型
     */
    String onDelete() default ForeignKeyAction.NONE;

    /**
     * 更新时的操作。
     *
     * @return 更新操作类型
     */
    String onUpdate() default ForeignKeyAction.NONE;
}