Использование базовых типов данных
Драйвер 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();
}
Дополнительные сведения о параметризованных запросах см. в инструкции SQL с параметрами.
Передача параметров хранимой процедуре
Если вам нужно передать параметры типа хранимой процедуре, вы можете задать параметры по имени или индексу с помощью методов 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 с хранимыми процедурами и выходными параметрами см. в этой статье.