ResultSet 接口提供用于从当前行获取列值的获取 方法(getBoolean、getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为 高效。列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读 取每行中的结果集列,每列只能读取一次。 对于获取方法, JDBC 驱动程序尝试将底层数据转换为在获取方法中指定的 Java 类型,并返回适当的 Java 值。JDBC 规范有一个表,显示允许的从 SQL 类型到 ResultSet 获取方法所使用的 Java 类型的映射关系。 (java.sql.类型 类型) SQL Server 类型 JDBC 类型 (java.sql.类型)
Java 语言类型 bigint BIGINT long timestamp BINARY byte[] binary bit BIT Boolean charnchar CHAR String decimal money smallmoney float int image text ntext numeric real smallint tinyint datetime TIMESTAMP smalldatetime varbinary varchar nvarchar VARBINARY java.sql.Timestamp byte[] DECIMAL java.math.BigDecimal
DOUBLE INTEGER LONGVARBINARY LONGVARCHAR NUMERIC REAL SMALLINT
double int byte[] String java.math.BigDecimal float short
VARCHAR
String
uniqueidentifier 注意: 注意: JDBC 驱动程序目前不支持 SQL Server
sqlvariant 数据类型。如果使 用
查询从包含 sqlvariant 数据类型列的表中检索数据,则会发生异常。 Getter 方法转换
基于 SQL Server 2005 的数据类型,以下图表包含 SQLServerResultSet 类的 get
方法的 JDBC 驱动程序转换图,以及 SQLServerCallableStatement 类的 get 方法支持的转换。
JDBC 驱动程序的 getter 方法支持三种基本的转换类别:
? Non-Lossy Non-
(x) :在 getter 类型等于或小于基础服务器类型的情况下 执行转换。 例如, 对基础服务器的十进制数列调用 getBigDecimal 时, 无需进行转换。 (y) :从数字服务器类型到 Java 语言类型的转换,此时的 转换为常规转换,并遵循 Java 语言转换规则。对于这些转换,总是 直接截取有效位数(从不四舍五入),而溢出则按目标类型取模处理, 以较小者为准。例如,对包含“1.9999”的基础十进制数列调用
? Converted
如果基础十进制数值为“3000000000”, int 则 getInt 将返回“1”; 值将溢出为“-1294967296”。
? Data
Dependent (z) :从基础字符类型转换到数字类型时,要求字符类 型所包含的值可转换成数字类型。不执行其他转换。如果值对于 getter 类型过大,则该值无效。例如,如果对包含“53”的 varchar(50) 列调用 getInt , 则该值作为 int 返回; 但如果基础值 为“xyz”或“3000000000”,则发生错误。
(摘自微软的 sqljdbc 帮助文档) 1. ResultSet 中对于 getDouble,getFloat,getInt 方法由于返回的是基本类型 数据,所以 null 变为了 0(如果值为 SQL NULL ,则返回值为 0 )。这给我们 带来了不少麻烦。为了避免这
个问题需要借助 ResultSet#wasNull()方法 2. ResultSet#getDate。以前没注意过这个家伙返回的类型是 java.sql.Date, 发现数据库字段类型为 datetime 时返回来的数据只有年月日,用 ResultSet#getTimestamp 就没问题,郁闷,到现在还不知道为什么。 3. 相关资源: java.sun/products/jdbc/overview.html msdn.microsoft/zh-cn/data/aa937724(en-us).aspx