本规范基于项目现有代码实现,规定了数据库设计、表结构、字段命名、数据类型映射等相关规范。所有规范必须与现有代码保持一致,不得引入未实现的设想。
map-underscore-to-camel-case 配置,实现数据库下划线字段与 Java 驼峰属性自动映射。t_ 开头,后跟模块名和实体名,使用下划线分隔单词。t_user_info、t_user_token。user_id、create_time、wx_openid。id 作为主键字段,类型为 BIGINT。ASSIGN_ID 策略(雪花算法生成 ID)。@TableId(value = "id", type = IdType.ASSIGN_ID) 注解。BaseEntity,包含以下公共字段:
id:主键,BIGINT。version:乐观锁版本号,INT,默认值为 0。create_user:创建者 ID,BIGINT。create_time:创建时间,DATETIME。update_user:更新者 ID,BIGINT。update_time:更新时间,DATETIME。@TableField 注解指定字段名和填充策略。注:在代码中 BaseEntity 的字段命名与注解如下(与上面对应):
@TableId(value = "id", type = IdType.ASSIGN_ID) 标记 id 字段,并使用雪花算法生成ID;返回给前端时对 Long 类型使用 ToStringSerializer 序列化。@TableField(value = "version") @Version 用于乐观锁。@TableField(value = "create_user", fill = FieldFill.INSERT) 表示插入时自动填充 createUser。@TableField(value = "create_time", fill = FieldFill.INSERT) 对应 createTime 字段,类型为 LocalDateTime。@TableField(value = "update_user", fill = FieldFill.INSERT) 与 updateUser,插入时默认填充;更新时 update_time 标注为 FieldFill.INSERT_UPDATE。CustomMetaObjectHandler 实现自动填充。create_time、update_time、create_user、update_user。update_time、update_user。实现说明:CustomMetaObjectHandler 在 insertFill/updateFill 方法中使用 strictInsertFill / strictUpdateFill 来填充时间和用户字段;当 createUser / updateUser 为空时,默认写入常量 currentUserInfoId = 1L。
version 字段实现乐观锁。@Version 注解。OptimisticLockerInnerInterceptor 插件。实现说明:MybatisPlusConfig 注册了 OptimisticLockerInnerInterceptor 到 MybatisPlusInterceptor 中以启用乐观锁支持。
@EnumValue 注解标记存储值。TypeHandler 处理枚举与数据库的映射。INT 类型,使用 code 值存储。Gender 枚举存储为 1(男)、2(女)。VARCHAR。INT 或 BIGINT。DATETIME,使用 LocalDateTime。TINYINT 或 BIT。BaseMapper<T>。@Mapper 注解标记。示例:
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
V{version}__{description}.sql。说明:数据库中 id 及其它业务 ID 字段保持 BIGINT(或 Long)类型以保证唯一性与性能。但在对外 JSON 响应中,建议将此类长整型 ID 以字符串形式返回,以避免 JavaScript 的 Number 类型在表示超过 2^53-1 的整数时发生精度丢失。
实施建议:
Long/BigInt 类型。record.getId().toString()),或在 Jackson 中通过 ToStringSerializer 对 Long 类型字段做统一序列化(但注意这会影响所有 Long 字段的序列化表现)。示例(使用 Jackson 注解局部控制):
public class PhysicalDataResponse {
@Schema(description = "记录ID,返回为字符串以避免前端精度丢失")
@JsonSerialize(using = ToStringSerializer.class)
private String id;
}
注意:统一序列化所有 Long 为字符串会影响日志/调试输出和部分客户端契约,如需细粒度控制建议在 VO 层显式转换并在 API 文档中说明。