数据库字段为null时jdbc获取的值

本文探讨了在使用JDBC时如何处理数据库字段中的NULL值,特别是对于INT、FLOAT等类型的数据。文中详细介绍了不同数据类型在Java中的映射方式,并提供了一种使用getObject或getString方法来区分NULL值的有效方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当数据库字段的值为NULL时,我们使用jdbc获取到的值为什么呢?对于varchar、char等类型当使用getString时,根据常识轻松地知道值应该是NULL。但是,对于intfloat等类型,当我们使用getIntgetFloat方法时应该返回的值也是NULL么。答案是否定的,我们根据这几个的方法的注释可以知道,当数据库字段的值为NULL,通过jdbc获取到的值为0
float java.sql.ResultSet.getFloat(String columnLabel) throws SQLException方法的注释如下。

Retrieves the value of the designated column in the current row of this ResultSet object as a float in the Java programming language.
Parameters:
    columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
Returns:
    the column value; if the value is SQL NULL, the value returned is 0
Throws:
    SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set

但是当某一些字段的类型为INTFLOAT时,比如表示价格的字段,我们想要用NULL值表示该字段未填写值,那该怎么办呢?这时我们可以使用getObject或者getString方法,当结果为null时表示未填写值,当结果不为null时再将其转换为相应的基本类型。
java中的类型和sql的类型的映射关系定义在JDBC规范中。接下来需要研究一下这个文档。

jdbc类型映射到java类型

JDBC TypeJava Type
CHARString
VARCHARString
LONGVARCHARString
NUMERICjava.math.BigDecimal
DECIMALjava.math.BigDecimal
BITboolean
BOOLEANboolean
TINYINTbyte
SMALLINTshort
INTEGERint
BIGINTlong
REALfloat
FLOATdouble
DOUBLEdouble
BINARYbyte[]
VARBINARYbyte[]
LONGVARBINARYbyte[]
DATEjava.sql.Date
TIMEjava.sql.Time
TIMESTAMPjava.sql.Timestamp
CLOBjava.sql.Clob
BLOBjava.sql.Blob
ARRAYjava.sql.array
DISTINCTMapping of underlying type
STRUCTjava.sql.Struct
REFjava.sql.Ref
DATALINKjava.net.URL
JAVA_OBJECTUnderlying Java class
ROWIDjava.sql.RowId
NCHARString
NVARCHARString
LONGNVARCHARString
NCLOBjava.sql.NClob
SQLXMLjava.sql.SQLXML

jdbc类型映射到java对象

JDBC TypeJava Object Type
CHARString
VARCHARString
LONGVARCHARString
NUMERICjava.math.BigDecimal
DECIMALjava.math.BigDecimal
BITBoolean
BOOLEANBoolean
TINYINTInteger
SMALLINTInteger
INTEGERInteger
BIGINTLong
REALFloat
FLOATDouble
DOUBLEDouble
BINARYbyte[]
VARBINARYbyte[]
LONGVARBINARYbyte[]
DATEjava.sql.Date
TIMEjava.sql.Time
TIMESTAMPjava.sql.Timestamp
DISTINCTObject type of underlying type
CLOBjava.sql.Clob
BLOBjava.sql.Blob
ARRAYjava.sql.Array
STRUCTjava.sql.Struct or java.sql.SQLData
REFjava.sql.Ref
DATALINKjava.net.URL
JAVA_OBJECTUnderlying Java class
ROWIDjava.sql.RowId
NCHARString
NVARCHARString
LONGNVARCHARString
NCLOBjava.sql.NClob
SQLXMLjava.sql.SQLXML

测试

创建测试用表,环境是mysql。

create table test(id int,price float,name varchar(2000));

插入数据

insert into test(id,price,name) values(12,12.3456,'阿里巴巴');
insert into test(id,price,name) values(1,312.3456,'阿里巴巴');
insert into test(id,price,name) values(null,142.3456,'阿里巴巴');
insert into test(id,price,name) values(3,null,'阿里巴巴');

数据表

idpricename
1212.3456阿里巴巴
1312.346阿里巴巴
NULL142.346阿里巴巴
3NULL阿里巴巴

java使用jdbc连接

Statement st = conn.createStatement();
String sql = "select * from test where id = 3";
java.sql.ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
    String name = rs.getString("name");
    String idStr = rs.getString("id");
    Object idObj = rs.getObject("id");
    int id = rs.getInt("id");
    float price = rs.getFloat("price");
    System.out.println("---------------------------");
    System.out.println(idObj instanceof Integer);
    System.out.println("id = " + id);
    System.out.println("idStr = " + idStr);
    System.out.println("idObj = " + idObj);
}

结果

---------------------------
true
id = 3
idStr = 3
idObj = 3

参考

  • java.sql.ResultSet相应方法的注释
  • JSR 221 JDBC™ 4.2 Specification下载地址

转载于:https://www.cnblogs.com/ZiYangZhou/p/8372059.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值