下载 JDBC 驱动程序

Microsoft JDBC Driver for SQL Server 使用 JDBC 基本数据类型将 SQL Server 数据类型转换为 Java 编程语言能够理解的格式,反之亦然。 JDBC 驱动程序支持 JDBC 4.0 API,其中包括 SQLXML 数据类型和区域 (Unicode) 数据类型,如 NCHAR 、NVARCHAR 、LONGNVARCHAR 和 NCLOB 。

数据类型映射

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

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

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

2 可以编程方式使用 DateTimeOffset 类 访问 datetimeoffset 的值。

3 请注意,从 SQL Server 2016 开始,java.sql.Timestamp 值不能再用于比较 datetime 列中的值。 此限制是由于以不同方式将 datetime 转换为 datetime2 的服务器端更改,从而导致不可相等的值。 此问题的解决方法是将 datetime 列更改为 datetime2(3),使用 String 而不是 java.sql.Timestamp,或将数据库兼容级别更改为 120 或更低。

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

以字符串格式检索数据

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

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getString("job_id");

按数据类型检索数据

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

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getShort("job_id");

使用确定位数的 getUnicodeStream 和 getBigDecimal 方法已遭弃用,不受 JDBC 驱动程序支持。

按数据类型更新数据

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

try (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();
    int empJobID = rs.getInt(2);
    empJobID++;
    rs.first();
    rs.updateInt(2, empJobID);
    rs.updateRow();

JDBC Driver 无法更新列名长度超过 127 个字符的 SQL Server 列。 如果尝试更新名称长度超过 127 个字符的列,将引发异常。

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

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

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

若要详细了解参数化查询,请参阅使用包含参数的 SQL 语句

向存储过程传递参数

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

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();

在此实例中,将返回一个结果集,包含此存储过程的运行结果。

若要详细了解结合使用 JDBC 驱动程序与存储过程和输入参数,请参阅使用包含输入参数的存储过程

从存储过程检索参数

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

try(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);

除返回的输出参数外,还可能返回一个结果集,包含此存储过程的运行结果。

若要详细了解结合使用 JDBC 驱动程序与存储过程和输出参数,请参阅使用包含输出参数的存储过程

了解 JDBC 驱动程序数据类型