Использование автоматически созданных ключей
Драйвер Microsoft JDBC Driver for SQL Server поддерживает дополнительный API-интерфейсы JDBC 3.0 для получения автоматически создаваемых идентификаторов строк. Главным преимуществом этой функции является доступность значений IDENTITY для приложения, которое обновляет таблицу базы данных, без необходимости отправлять запрос и вторично обращаться к серверу.
Так как SQL Server не поддерживает псевдостолбцы для идентификаторов, то обновления, использующие функцию автоматического создания ключей, должны работать с таблицей, содержащей столбец IDENTITY. SQL Server позволяет иметь только один столбец IDENTITY в каждой таблице. Результирующий набор, возвращаемый методом getGeneratedKeys класса SQLServerStatement, будет содержать только один столбец, а именем возвращаемого столбца будет GENERATED_KEYS. Если созданные ключи запрашиваются для таблицы без столбца IDENTITY, то драйвер JDBC возвращает результирующий набор со значением NULL.
Например, создайте следующую таблицу в примере базы данных AdventureWorks2022:
CREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);
В следующем примере открытое подключение к образцу базы данных AdventureWorks2022 передается в функцию, инструкция SQL создается, которая будет добавлять данные в таблицу, а затем выполняется инструкция и отображается значение столбца IDENTITY.
public static void executeInsertWithKeys(Connection con) {
try(Statement stmt = con.createStatement();) {
String SQL = "INSERT INTO TestTable (Col2, Col3) VALUES ('S', 50)";
int count = stmt.executeUpdate(SQL, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
do {
for (int i=1; i<=columnCount; i++) {
String key = rs.getString(i);
System.out.println("KEY " + i + " = " + key);
}
} while(rs.next());
}
else {
System.out.println("NO KEYS WERE GENERATED.");
}
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}