应使用包装类而非基本类型映射数据库字段,因其支持null值,能准确表达“缺失”语义,避免空指针、默认值误判及校验失效等问题。

因为基本类型无法表示 NULL,而包装类天然支持 null 值,能准确映射数据库字段的“缺失”语义,避免数据错乱、空指针异常和业务逻辑误判。
真实反映数据库 NULL 状态
数据库中某字段未赋值时,默认就是 NULL。JDBC 查询返回 ResultSet.getObject("age") 时,若该列为 NULL,结果是 null;若实体类用 int age,框架尝试自动拆箱就会抛 NullPointerException。而 Integer age 可直接接收这个 null,不报错,且语义清晰——“年龄未知”,不是“年龄为 0”。
兼容主流 ORM 和 Web 框架行为
MyBatis、Hibernate、Spring Data JPA 等默认将数据库 NULL 映射为包装类的 null,而不是给基本类型塞默认值。例如:
- MyBatis 执行
SELECT name, age FROM user,age 列为 NULL →user.getAge()返回 null(Integer)或直接崩溃(int) - Spring MVC 解析 JSON
{"name":"李四"}(无 age 字段)→Integer age保持 null;int age被强制设为 0,造成“用户年龄为 0”的错误认知
避免默认值掩盖业务意图
基本类型有强制默认值:int 是 0,boolean 是 false,long 是 0L。这些值本身可能有明确业务含义:
- 订单状态字段
int status = 0可能被误认为“已创建”,但实际应是“未初始化” - 用户积分
int points = 0无法区分“从未获得积分”和“积分被清零” - 用
Integer status和Integer points,null 就代表“尚未赋值”,语义唯一、无歧义
支撑空值校验与统一处理逻辑
业务上常需明确约束哪些字段“必须提供”。包装类配合校验注解才能真正生效:
-
@NotNull private Integer price;—— 接口没传 price 或数据库为 NULL,校验失败,提示“价格不能为空” -
@NotNull private int price;—— price 总是 0,校验永远通过,失去意义 - 统一判空逻辑如
if (user.getAge() == null)可集中处理“信息不全”场景,比如跳过年龄相关计算或触发补录流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











