Использование базовых типов данных

Скачать драйвер JDBC

Драйвер Microsoft JDBC для SQL Server использует базовые типы данных JDBC для преобразования типов данных SQL Server в формат, понятный языком программирования Java, и наоборот. Драйвер JDBC обеспечивает поддержку API JDBC 4.0, в том числе типа данных SQLXML и типов данных Юникода для национальных символов: NCHAR, NVARCHAR, LONGNVARCHAR и NCLOB.

Сопоставление типов данных

В следующей таблице перечислены сопоставления по умолчанию между базовыми типами данных языка SQL Server, JDBC и Java.

Типы SQL Server Типы JDBC (java.sql.Types) Типы языка Java
bigint BIGINT длинный
binary BINARY byte[]
bit BIT boolean
char CHAR Строка
Дата DATE java.sql.Date
datetime3 TIMESTAMP java.sql.Timestamp
datetime2 TIMESTAMP java.sql.Timestamp
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
десятичное DECIMAL java.math.BigDecimal
с плавающей запятой DOUBLE двойной точности
Изображение LONGVARBINARY byte[]
INT INTEGER INT
money DECIMAL java.math.BigDecimal
nchar CHAR

NCHAR (Java SE 6.0)
Строка
ntext LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
Строка
numeric NUMERIC java.math.BigDecimal
nvarchar VARCHAR

NVARCHAR (Java SE 6.0)
Строка
nvarchar(max) VARCHAR

NVARCHAR (Java SE 6.0)
Строка
real real с плавающей запятой
smalldatetime TIMESTAMP java.sql.Timestamp
smallint SMALLINT short
smallmoney DECIMAL java.math.BigDecimal
text LONGVARCHAR Строка
Время TIME1 java.sql.Time1
TIMESTAMP BINARY byte[]
tinyint TINYINT short
udt VARBINARY byte[]
uniqueidentifier CHAR Строка
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
varchar VARCHAR Строка
varchar(max) VARCHAR Строка
xml LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
Строка

SQLXML
sqlvariant microsoft.sql.Types.SQL_VARIANT Object
geometry VARBINARY byte[]
география VARBINARY byte[]

1 Для использования java.sql.Time с типом SQL Server необходимо задать для свойства подключения sendTimeAsDatetime значение false.

2 Значения datetimeoffset можно получить программным образом с помощью класса DateTimeOffset.

3 значения java.sql.Timestamp больше не могут использоваться для сравнения значений из столбца datetime начиная с SQL Server 2016. Это ограничение связано с изменением на стороне сервера, которое преобразует datetime в datetime2 иначе, что приводит к не равным значениям. Решение этой проблемы заключается в изменении столбцов даты и времени на datetime2(3), использовать string вместо java.sql.Timestamp или изменить уровень совместимости базы данных на 120 или ниже.

В следующих разделах приводятся примеры использования драйвера JDBC и базовых типов данных. Более подробный пример использования базовых типов данных в приложении Java см. в разделе Образец базовых типов данных.

Извлечение данных в виде строки

Если необходимо получить данные из источника данных, который сопоставляется с любым из базовых типов данных JDBC для просмотра в виде строки или если строго типизированные данные не требуются, используйте метод getString класса SQLServerResultSet. В следующем примере показано использование:

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");
}

Извлечение данных по типу данных

Если вам нужно получить из источника данные известного типа, воспользуйтесь одним из методов get<Тип> класса SQLServerResultSet, также известных как методы получения. Можно использовать имя столбца или индекс столбца с методами 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.

Обновление данных по типу данных

Если вам нужно обновить значение поля в источнике данных, воспользуйтесь одним из методов update<тип> класса SQLServerResultSet. В следующем примере метод 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 не может обновить столбец SQL Server, если имя столбца длиннее, чем 127 символов. При попытке обновить столбец, имя которого длиннее 127 символов, возникнет исключение.

Обновление по параметризированному запросу

При обновлении данных в источнике данных с помощью параметризованного запроса можно задать тип данных параметров с помощью одного из методов набора<Type> класса SQLServerPreparedStatement. Эти методы также называются методами задания. В следующем примере метод prepareStatement используется для предварительной компиляции параметризованного запроса, а затем метод setString используется для задания строкового значения параметра перед вызовом метода executeUpdate.

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

Дополнительные сведения о параметризованных запросах см. в этой статье.

Передача параметров хранимой процедуре

Если вам нужно передать параметры типа хранимой процедуре, вы можете задать параметры по имени или индексу с помощью методов set<Тип> класса SQLServerCallableStatement. В следующем примере метод prepareCall используется для вызова хранимой процедуры, затем с помощью метода setString задается параметр для вызова, после чего вызывается метод executeQuery.

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

Примечание.

В данном примере возвращается результирующий набор с результатами запуска хранимой процедуры.

BigDecimal

При использовании значений параметра BigDecimal точность и масштаб может передаваться вместе со значением.setBigDecimal Это setBigDecimal позволяет избежать усечения потенциального значения. Кроме того, если для параметра calcBigDecimalPrecision строка подключения задано trueзначение, драйвер вычисляет точность входных данных BigDecimal от имени пользователя по стоимости производительности. Если значение передается в одиночку без calcBigDecimalPrecision задания или параметра false, драйвер принимает максимально допустимое значение (38) для точности для этого значения BigDecimal.

Дополнительные сведения об использовании драйвера JDBC с хранимыми процедурами и входными параметрами см. в этой статье.

Извлечение параметров из хранимой процедуры

Если необходимо получить параметры обратно из хранимой процедуры, необходимо сначала зарегистрировать параметр по имени или индексу с помощью метода registerOutParameter out класса SQLServerCallableStatement. Затем назначьте возвращенный параметр соответствующей переменной после запуска вызова хранимой процедуры. В следующем примере метод prepareCall используется для настройки вызова хранимой процедуры, метод registerOutParameter используется для настройки out параметра, а затем метод setString используется для задания параметра перед вызовом метода ExecuteQuery. Значение out параметра хранимой процедуры извлекается с помощью метода 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);
}

Примечание.

В дополнение к возвращаемому параметру OUT также можно вернуть результирующий набор с результатами запуска хранимой процедуры.

Дополнительные сведения об использовании драйвера JDBC с хранимыми процедурами и выходными параметрами см. в этой статье.

См. также

Основные сведения о типах данных JDBC Driver