跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 实体类为何不建议使用 is 前缀命名?以 is_deleted 为例

Java 实体类中逻辑删除字段命名的最佳实践。指出数据库字段 is_deleted 对应 Java 属性应为 deleted 而非 isDeleted,以避免 JavaBeans 规范与 JSON 序列化框架(如 Jackson)的冲突。文章对比了两种命名方式对 API 和序列化的影响,解释了反序列化失败的风险。推荐结合 MyBatis-Plus 注解进行字段映射,并建议优先使用 Integer 类型而非 Boolean 以增强扩展性,防止默认值误判。遵循行业规范可确保微服务架构下的数据交互稳定。

RedisGeek发布于 2026/3/30更新于 2026/9/983 浏览
Java 实体类为何不建议使用 is 前缀命名?以 is_deleted 为例

Java 实体类为何不建议使用 is 前缀命名?

你可能会发现一个有趣的现象:数据库中的逻辑删除字段明明叫 is_deleted,但自动生成的 POJO (Plain Old Java Object) 里的属性名却是 deleted。

这并不是 IDE 或者 ORM 框架抽风,而是一个经过深思熟虑的行业标准。

字段命名映射对比表

我们对比一下两种不同的 Java 命名方式对 API 和序列化的影响:

数据库字段Java 属性名框架生成的 Getter 方法名JSON 结果风险等级
is_deleteddeletedgetDeleted() / isDeleted(){"deleted": 0}🟢 安全
is_deletedisDeletedisDeleted(){"deleted": 0} (前缀丢失)🔴 高危

逻辑流程说明

当 JSON 框架(如 Jackson)尝试将对象转为字符串时,它的探测逻辑如下:

  1. 开始对象序列化
  2. 扫描类中的所有方法
  3. 判断方法名是否以 is 或 get 开头
  4. 去掉 get/is 前缀,将剩余首字母转为小写作为 Key
  5. 检查 Key 与属性名是否一致
  6. 若不一致,产生反序列化失败风险;若一致,输出最终 JSON 数据
graph TD
    A[开始对象序列化] --> B{扫描所有方法}
    B --> C{方法名以 is/get 开头?}
    C -- 是 --> D[去掉前缀并转小写]
    C -- 否 --> E[忽略该方法]
    D --> F{Key 与属性名一致?}
    F -- 是 --> G[输出 JSON]
    F -- 否 --> H[反序列化失败风险]

交互时序分析

如果强行在 Java 属性中使用 is 前缀,前端与后端之间的通信可能会发生严重的冲突:

  1. 后端:属性名为 isDeleted (Integer 类型),调用 isDeleted() 获取值。
  2. 序列化:发送 JSON {"deleted": 1} (前缀被自动去掉了)。
  3. 前端:修改后传回数据报错:找不到该方法!或者由于 Key 不匹配导致赋值为 null。
  4. 反序列化:寻找 setIsDeleted() 方法失败。
sequenceDiagram
    participant Client as 前端页面
    participant Server as 后端服务
    participant Engine as 序列化引擎
    
    Client->>Server: 提交 JSON {"isDeleted": 0}
    Server->>Engine: 尝试反序列化
    Engine-->>Server: 寻找 setIsDeleted() 方法
    Server-->>Client: 报错:找不到该方法
    
    Note over Client,Server: 跨服聊天问题

逻辑删除状态演进

在 MyBatis-Plus 的作用下,deleted 字段控制着数据的生命周期:

  • 正常状态 (deleted = 0):执行 SQL Delete 实际上是 Update 语句,将值改为 1。
  • 已删除状态 (deleted = 1):执行恢复操作或物理清理 (定时任务)。

实体类结构设计

以 MemberUser 为例,标准的 POJO 结构如下,利用注解解决 Database 映射问题:

public class MemberUser {
    private Long id;
    private String username;
    private Integer deleted; // 推荐使用 Integer 而非 Boolean

    public Integer getDeleted() {
        return deleted;
    }

    public void setDeleted(Integer val) {
        this.deleted = val;
    }
}

配合 MyBatis-Plus 注解:

@TableField("is_deleted")
private Integer deleted;

核心知识要点

  • 为什么不加 is 前缀?
    • JavaBeans 规范限制:isDeleted 属性生成的 getter 依然是 isDeleted(),导致 RPC 或序列化框架混淆。
    • 阿里代码手册强制规定:禁止在 POJO 中布尔类型变量加 is。
  • 如何处理映射?
    • 使用注解:在 Java 属性上加 @TableField("is_deleted")。
    • 逻辑删除注解:使用 @TableLogic 标记该字段。
  • 数据类型建议
    • 推荐使用 Integer:比 Boolean 更具扩展性(例如未来可能支持多种删除状态)。
    • 包装类型:永远使用 Integer 而不是 int,防止默认值 0 产生的业务误判。
  • 框架表现
    • Jackson (JSON 处理框架):默认根据 getter/setter 推断字段名。
    • Lombok (代码生成库):自动生成的 getter 名遵循规范,进一步暴露 is 前缀的问题。

目录

  1. Java 实体类为何不建议使用 is 前缀命名?
  2. 字段命名映射对比表
  3. 逻辑流程说明
  4. 交互时序分析
  5. 逻辑删除状态演进
  6. 实体类结构设计
  7. 核心知识要点

更多推荐文章

查看全部
  • Claude Code 与 Skills 实战:AI Coding 如何从辅助走向主力
  • AI 风口下的冷思考:普通人如何理性入局与避坑
  • 计算机图形学 Visual C++ MFC 基础绘图开发
  • 从零训练大语言模型:环境与代码实战指南
  • Android 中大厂秋招常见面试题及答案解析
  • 开箱即用的 React K 线图组件与股票数据 SDK
  • 基于 ESP32 的无人机飞控日志 SD NAND 存储方案
  • OpenClaw Mac 安装指南
  • 基于 STM32 的智能家居环境监测系统设计
  • 漏洞扫描工具整合使用教程
  • VS Code 集成 Overleaf 实现本地 AI 辅助 LaTeX 写作
  • Android 开发者进阶:性能优化核心领域与实战方向
  • GitHub 热门项目日榜 (2026-02-24)
  • 基于 SpringBoot2+Vue3 的旅游出行指南系统设计与实现
  • 基于 Kiro 与 AIClient-2-API 实现 Claude 模型免费调用方案
  • Python 核心语法实战:变量、流程控制与函数详解
  • Linux 进程间通信进阶:管道与共享内存实战
  • 大模型定义、发展历程及应用场景全解析
  • 使用 Copilot 制定 60 天 AI 学习计划并同步至 Outlook 日程
  • 前端缓存策略实战:从 localStorage 到 Service Worker

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online