java中jdbc处理null需用setnull()插入和wasnull()查询:setnull(int, int)显式声明sql null并指定类型;resultset获取后须立即调用wasnull()判断是否为数据库null,不可依赖getxxx()返回值是否为null。

Java 中用 JDBC 处理 NULL,核心是别直接用 setObject() 或 getObject() 硬塞 null,得用专门的 API 显式声明“这里要插/取的是 SQL NULL”。
插入 NULL:用 setNull() 而不是 setObject(null)
PreparedStatement 的 setObject(int, null) 行为不统一——有些驱动会抛异常,有些转成 0 或空字符串,不可靠。正确做法是调用 setNull(int parameterIndex, int sqlType),明确告诉数据库:“这个位置是 SQL NULL”,并指定对应字段的 SQL 类型。
- 例如插入用户表中可为空的邮箱字段:
ps.setNull(3, Types.VARCHAR);(假设邮箱是第 3 个参数) - 类型常量来自
java.sql.Types,常见值:Types.INTEGER、Types.VARCHAR、Types.DATE、Types.BOOLEAN等 - 如果不确定字段类型,可用
Types.OTHER,但建议查元数据或明确写对,避免兼容性问题
查询 NULL:用 wasNull() 判断是否取到的是 SQL NULL
ResultSet 的 getXXX() 方法(如 getString()、getInt())在遇到数据库 NULL 时,多数返回 Java null 或默认值(比如 getInt() 返回 0),但你无法区分“真是 null”还是“值就是 0”。所以必须在调用后立刻检查 wasNull()。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正确写法:
String email = rs.getString("email");
if (rs.wasNull()) { email = null; } -
wasNull()只对上一次getXXX()调用有效,且只适用于基本类型包装类或对象类型的 get 方法(如getString、getDate),不适用于getBoolean这类可能混淆的类型(推荐改用getObject()+ 类型判断) - 对
getObject(),它本身可返回 Java null,但依然建议配合wasNull()使用,因为某些驱动对 NULL 的处理不一致
安全读取可空字段的通用模式
为避免漏判,建议封装工具方法或统一处理逻辑:
- 对字符串:
String s = rs.getString(col); if (rs.wasNull()) s = null; - 对整数:
Integer i = rs.getObject(col, Integer.class);(JDBC 4.1+ 推荐,自动处理 NULL) - 对日期:
LocalDateTime dt = rs.getObject(col, LocalDateTime.class);(需数据库支持且驱动适配) - 老版本 JDK 或需兼容旧驱动时,坚持用
getXXX()+wasNull()组合
注意事项与避坑点
几个容易出错的地方要特别注意:
- 不要用
== null直接判断getXXX()结果来代替wasNull(),尤其对getInt()、getDouble()等,它们从不返回 null - 批量插入含 NULL 时,每个参数都要单独调用
setNull(),不能跳过 - 使用
getObject(int, Class)时,确保驱动版本 ≥ 4.1 且数据库类型映射正确,否则可能抛SQLFeatureNotSupportedException - ORM 框架(如 MyBatis、Hibernate)底层也遵循这套规则,了解 JDBC 原理有助于排查映射 NULL 失败的问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










