Microsoft SQL Server JDBC Driver 使用 JDBC 基本数据类型将 SQL Server 数据类型转换为 Java 编程语言能够理解的格式,或者反过来。从 Microsoft SQL Server JDBC Driver 2.0 开始,JDBC 驱动程序提供对 JDBC 4.0 API 的支持,后者包括 SQLXML 数据类型和 National (Unicode) 数据类型,例如 NCHARNVARCHARLONGNVARCHARNCLOB

数据类型映射

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

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

bigint

BIGINT

long

timestamp

binary

BINARY

byte[]

bit

BIT

boolean

char

CHAR

String

decimal

money

smallmoney

DECIMAL

java.math.BigDecimal

float

DOUBLE

double

int

INTEGER

int

image

varbinary(max)

LONGVARBINARY

byte[]

varchar(max)

text

LONGVARCHAR

String

nchar

CHAR

NCHAR (Java SE 6.0)

String

nvarchar

VARCHAR

NVARCHAR (Java SE 6.0)

String

nvarchar(max)

ntext

LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)

String

numeric

NUMERIC

java.math.BigDecimal

real

REAL

float

smallint

SMALLINT

short

datetime

smalldatetime

TIMESTAMP

java.sql.Timestamp

varbinary

udt

VARBINARY

byte[]

varchar

VARCHAR

String

tinyint

TINYINT

short

uniqueidentifier

CHAR

String

xml

LONGVARCHAR

SQLXML (Java SE 6.0)

String

SQLXML

time

TIME (1)

java.sql.Time (1)

date

DATE

java.sql.Date

datetime2

TIMESTAMP

java.sql.Timestamp

datetimeoffset (2)

microsoft.sql.Types.DATETIMEOFFSET

microsoft.sql.DateTimeOffset

(1) 若要将 java.sql.Time 与时间 SQL Server 类型一起使用,您必须将 sendTimeAsDatetime 连接属性设置为 false。

(2) 您可以通过编程方式使用 DateTimeOffset 类访问 datetimeoffset 的值。

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 Driver 无法更新列名长度超过 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 驱动程序数据类型