JDBC 基本数据类型是 JDBC 1.0 核心 API 中引入的数据类型。Microsoft SQL Server 2005 JDBC Driver 使用 JDBC 基本数据类型将 SQL Server 数据类型转换为 Java 编程语言能够理解的格式,反之亦然。

下表列出了基本 SQL Server、JDBC 和 Java 编程语言数据类型之间的默认映射:

SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型

bigint

BIGINT

long

timestamp

binary

BINARY

byte[]

bit

BIT

boolean

char

nchar

CHAR

String

decimal

money

smallmoney

DECIMAL

java.math.BigDecimal

float

DOUBLE

double

int

INTEGER

int

image

LONGVARBINARY

byte[]

text

ntext

LONGVARCHAR

String

numeric

NUMERIC

java.math.BigDecimal

real

REAL

float

smallint

SMALLINT

short

datetime

smalldatetime

TIMESTAMP

java.sql.Timestamp

varbinary

VARBINARY

byte[]

varchar

nvarchar

VARCHAR

String

tinyint

TINYINT

short

uniqueidentifier

CHAR

String

注意: JDBC 驱动程序目前不支持 SQL Server sqlvariant 数据类型。如果使用查询从包含 sqlvariant 数据类型列的表中检索数据,则会发生异常。

以下几部分提供了如何使用 JDBC 驱动程序和基本数据类型的实例。有关如何在 Java 应用程序中使用基本数据类型的更多详细实例,请参阅基本数据类型示例

以字符串的格式检索数据

如果必须从映射到任意 JDBC 基本数据类型的数据源检索数据,并以字符串的格式查看这些数据,或者如果不需要强类型的数据,则可以使用 SQLServerResultSet 类的 getString 方法,如下所示:

String SQL = "SELECT TOP 10 * FROM Person.Contact";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(SQL);

while (rs.next()) {
   System.out.println(rs.getString(4) + " " + rs.getString(6));
}
rs.close();
stmt.close();

按数据类型检索数据

如果必须从数据源检索数据,并且已知检索的数据类型,则应该使用 SQLServerResultSet 类的 get<Type> 方法(也称为 getter 方法)之一。通过 get<Type> 方法可以使用列名或列索引,如下所示:

ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee
   WHERE (lname = 'Brown')");
rs.next();
short empJobID = rs.getShort("job_id");
rs.close();
stmt.close();
注意: JDBC 驱动程序不支持 getUnicodeStream 方法和带有小数位的 getBigDecimal 方法,它们已过时。

按数据类型更新数据

如果必须更新数据源中字段的值,应使用 SQLServerResultSet 类的 update<Type> 方法之一。在下面的实例中,updateInt 方法与 updateRow 方法结合起来用于更新数据源中的数据:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee
   WHERE (lname = 'Brown')");
rs.next();
short empJobID = rs.getInt(2);
empJobID++;
rs.first();
rs.updateInt(2, empJobID);
rs.updateRow();
rs.close();
stmt.close();
注意: JDBC 驱动程序无法更新列名超过 127 个字符的 SQL Server 列。如果尝试更新其名称超过 127 个字符的列,将引发异常。

通过参数化查询来更新数据

如果必须通过使用参数化查询来更新数据源中的数据,可以使用 SQLServerPreparedStatement 类的 set<Type> 方法(也称为 setter 方法)之一来设置参数的数据类型。在下面的实例中,prepareStatement 方法用于预编译参数化查询,然后在调用 executeUpdate 方法前,使用 setString 方法设置参数的字符串值。

PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET
   fname = ? WHERE (lname = 'Brown')");
String first = "Bob";
pstmt.setString(1, first);
int rowCount = pstmt.executeUpdate();
pstmt.close();

有关参数化查询的详细信息,请参阅使用带参数的 SQL 语句

向存储过程传递参数

如果必须向存储过程传递带类型的参数,则可使用 SQLServerCallableStatement 类的一个 set<Type> 方法通过索引或名称来设置此参数。在下面的实例中,prepareCall 方法用于设置对存储过程的调用,然后在调用 executeQuery 方法之前,使用 setString 方法设置调用的参数。

CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");
String lname = "Brown";
cstmt.setString(1, lname);
Resultset rs = cstmt.executeQuery();
rs.close();
cstmt.close();
注意: 在此实例中,将返回一个结果集,包含此存储过程的运行结果。

有关通过存储过程和输入参数来使用 JDBC 驱动程序的详细信息,请参阅使用带有输入参数的存储过程

从存储过程检索参数

如果必须从存储过程检索参数,则必须首先使用 SQLServerCallableStatement 类的 registerOutParameter 方法通过名称或索引注册一个输出参数,然后在调用存储过程后,将返回的输出参数分配给合适的变量。在下面的实例中,使用 prepareCall 方法设置对存储过程的调用,使用 registerOutParameter 方法设置输出参数,然后在调用 executeQuery 方法前,使用 setString 方法设置调用的参数。使用 getShort 方法来检索此存储过程的输出参数返回的值。

CallableStatement cstmt = con.prepareCall("{call employee_jobid (?, ?)}");
Cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
String lname = "Brown";
cstmt.setString(1, lname);
Resultset rs = cstmt.executeQuery();
short empJobID = cstmt.getShort(2);
rs.close();
cstmt.close();
注意: 除返回的输出参数外,还可能返回一个结果集,包含此存储过程的运行结果。

有关如何通过存储过程和输出参数来使用 JDBC 驱动程序的详细信息,请参阅使用带有输出参数的存储过程

另请参见

了解 JDBC 驱动程序数据类型