数据库字段是否允许NULL决定Java类型选择:NOT NULL可用基本类型,允许NULL必须用包装类,否则null会被转为0或false导致业务逻辑错误。

Java基本类型与包装类和数据库字段的映射,关键不在“能不能用”,而在“该不该用”——错选一个,轻则数据被悄悄转成0或false,重则查出null却当成有效值,业务逻辑直接跑偏。
数据库字段是否允许NULL,决定Java用基本类型还是包装类
这是最常踩坑的一条。如果数据库字段定义为 NOT NULL,Java端可用基本类型(如 int、boolean);一旦字段允许 NULL,就必须用对应包装类(Integer、Boolean)。
-
int age接收允许为空的年龄字段:查出NULL时自动变成0,系统可能误判用户“刚出生” -
Integer age接收同一字段:查出NULL时保持为null,业务层可明确判断“未填写” - 同理,
boolean is_active遇到NULL会变false,而Boolean is_active能保留三态语义(true/false/null)
数值范围与精度必须严格匹配数据库字段
数据库字段类型不是只看“是不是数字”,还要看它能存多大、多准。Java基本类型一旦越界,要么截断,要么抛异常。
- MySQL的
TINYINT(-128~127)→ 对应Byte,别用Integer(浪费内存且掩盖设计意图) - PostgreSQL的
BIGINT→ 必须用Long,用int会丢失高位数据 - Oracle的
NUMBER(5,2)(最多3位整数+2位小数)→ 建议用BigDecimal,不用float或double(浮点精度不可控)
JDBC取值要用类型专用方法,别靠getString()兜底
用 rs.getString("col") 再手动解析,看似灵活,实则埋雷:格式依赖数据库驱动实现、时区/小数点符号易出错、无法处理NULL安全转换。
立即学习“Java免费学习笔记(深入)”;
- 时间字段优先用
rs.getObject("col", LocalDateTime.class)(JDBC 4.2+),避开java.util.Date和java.sql.Timestamp的时区陷阱 - 数值字段用
rs.getInt("col")或rs.getLong("col"),但前提是字段非空;若可能为空,改用rs.getObject("col", Integer.class) - 布尔字段用
rs.getBoolean("col")仅适用于非空;允许NULL时,用rs.getObject("col", Boolean.class)
包装类不是“多此一举”,而是面向对象落地的刚需
基本类型不能进集合、不能做泛型参数、没有null语义、也不带工具方法。包装类补全了这些能力,是ORM框架(如MyBatis、Hibernate)底层映射的基础。
-
List<integer></integer>可以存,List<int></int>编译不通过 - MyBatis的
<resultmap></resultmap>映射中,property="age" 的type必须是包装类才能正确处理NULL -
Integer.valueOf("123")、Boolean.parseBoolean("true")等静态方法,比手写字符串解析更安全可靠


















