Использование автоматически созданных ключей

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

Драйвер Microsoft JDBC для SQL Server поддерживает необязательные интерфейсы API JDBC 3.0 для получения автоматически создаваемых идентификаторов строк. Основное преимущество этой функции заключается в том, что она позволяет сделать значения IDENTITY доступными приложению, которое обновляет таблицу базы данных, без необходимости выполнять запрос и второе обращение к серверу.

Поскольку SQL Server не поддерживает псевдостолбцы для идентификаторов, обновления с функцией автогенерации ключа должны работать с таблицей, содержащей столбцIDENTITY. SQL Server допускает только один IDENTITY столбец для каждой таблицы. Набор результатов, возвращаемый методом getGeneratedKeys класса SQLServerStatement , имеет только один столбец с именем GENERATED_KEYSстолбца . Начиная с JDBC Driver 13.6, если для инструкции запрашиваются сгенерированные ключи, но значение IDENTITY не создаётся, драйвер возвращает пустой набор результатов, не равный null, а ResultSet.next() возвращает false.

Например, создайте следующую таблицу в примере базы данных AdventureWorks2025:

CREATE TABLE TestTable
   (Col1 int IDENTITY,
    Col2 varchar(50),
    Col3 int);  

В следующем примере в функцию передается открытое подключение к образцу базы данных AdventureWorks2025, создается 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();
    }
}