Microsoft SQL Server JDBC Driver 使用 JDBC 基本数据类型将 SQL Server 数据类型转换为 Java 编程语言能够理解的格式,或者反过来。从 Microsoft SQL Server JDBC Driver 2.0 开始,JDBC 驱动程序提供对 JDBC 4.0 API 的支持,后者包括 SQLXML 数据类型和 National (Unicode) 数据类型,例如 NCHAR、NVARCHAR、LONGNVARCHAR 和 NCLOB。
数据类型映射
下表列出了基本 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();
按数据类型更新数据
如果必须更新数据源中字段的值,应使用 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();
通过参数化查询来更新数据
如果必须通过使用参数化查询来更新数据源中的数据,可以使用 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 驱动程序的详细信息,请参阅使用带有输出参数的存储过程。