Использование типа данных JSON с драйвером JDBC

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

Начиная с версии 13.2.0 драйвер Microsoft JDBC для SQL Server поддерживает тип данных JSON. Эта функция позволяет приложениям Java считывать и записывать данные в столбцы типа JSON SQL Server, обеспечивая простое взаимодействие с полуструктурированных данных.

Ниже приведены примеры способов взаимодействия с типами данных JSON с помощью драйвера JDBC.

Заполнение и извлечение данных JSON из таблицы

Чтобы работать с данными JSON в SQL Server, сначала создайте таблицу со столбцом типа json:

CREATE TABLE sampleTable (data JSON);

Вставьте JSON с инструкцией:

try (Statement stmt = connection.createStatement()) {
    stmt.execute("INSERT INTO sampleTable (data) VALUES ('{\"name\":\"John\",\"skills\":[\"Java\",\"SQL\"]}')");
}

Вставьте JSON с подготовленной инструкцией и параметрами:

String json = "{\"name\":\"John\",\"skills\":[\"Java\",\"SQL\"]}";
String insertSql = "INSERT INTO sampleTable (data) VALUES (?)";

try (PreparedStatement pstmt = connection.prepareStatement(insertSql)) {
    pstmt.setString(1, json);
    pstmt.executeUpdate();
}

Чтение данных JSON из таблицы:

String query = "SELECT data FROM sampleTable";

try (PreparedStatement stmt = connection.prepareStatement(query);
     ResultSet rs = stmt.executeQuery()) {
    while (rs.next()) {
        String json = rs.getString("data");
        System.out.println("JSON: " + json);
    }
}

Выходные данные JSON из хранимой процедуры

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

String sql = "CREATE PROCEDURE sampleProc @p0 JSON OUTPUT AS " +
             " SELECT TOP 1 @p0 = data FROM sampleTable";

Получите выходные данные JSON, зарегистрируя параметр и выполнив процедуру.

try (CallableStatement callableStatement = connection.prepareCall("{call sampleProc (?) }")) {
    callableStatement.registerOutParameter(1, microsoft.sql.Types.JSON);
    callableStatement.execute();
    String outputJson = callableStatement.getString(1);
    System.out.println("Output JSON: " + outputJson);
}

Параметры с табличным значением (TVPs) с JSON

В этом примере данные JSON вставляются с помощью TVP.

String value = "{\"severity\":\"TRACE\",\"duration\":200,\"date\":\"2024-12-17T15:45:56\"}";

SQLServerDataTable tvp = new SQLServerDataTable();
tvp.addColumnMetadata("c1", microsoft.sql.Types.JSON);
tvp.addRow(value);

try (SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) connection.prepareStatement(
        "INSERT INTO sampleTable SELECT * FROM ?")) {
    pstmt.setStructured(1, "JsonTVP", tvp);
    pstmt.execute();
}

Использование SQLServerBulkCopy из исходной таблицы в целевую таблицу с JSON

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

try (Statement stmt = con.createStatement()) {
    stmt.executeUpdate("CREATE TABLE destinationTable (data JSON)");

    SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(con);

    bulkCopy.setDestinationTableName("destinationTable");
    bulkCopy.writeToServer(stmt.executeQuery("SELECT * FROM sourceTable"));
}

Использование массового копирования с столбцом JSON из CSV

Скопируйте и вставьте следующий текст в CSV-файл с именем json.csv:

c1,c2,c3
true,sample,"{""field"":""value""}"

Используйте массовую копию для вставки данных CSV в таблицу:

try (Statement stmt = con.createStatement();
     SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(con);
     SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord("json.csv", null, ",", true)) {

    stmt.executeUpdate("CREATE TABLE sampleTable (c1 JSON)");

    fileRecord.addColumnMetadata(3, "c3", microsoft.sql.Types.JSON);

    fileRecord.setEscapeColumnDelimitersCSV(true);
    bulkCopy.setDestinationTableName("sampleTable");
    bulkCopy.writeToServer(fileRecord);
}

Ограничения JSON

Подробные ограничения см. в разделе об ограничениях типа данных JSON.