将 JSON 数据类型与 JDBC 驱动程序配合使用

下载 JDBC 驱动程序

从版本 13.2.0 开始,Microsoft JDBC Driver for SQL Server 支持 JSON 数据类型。 此功能允许 Java 应用程序读取和写入 json 类型的 SQL Server 列,从而实现与半结构化数据的无缝交互。

下面是使用 JDBC 驱动程序与 JSON 数据类型交互的方法示例。

从表中填充和检索 JSON 数据

若要在 SQL Server 中使用 JSON 数据,请首先创建一个包含 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);
}

JSON格式的表值参数(TVP)

此示例使用 TVP 插入 JSON 数据。

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

使用 CSV 对含有 JSON 列的数据进行批量复制

将以下文本复制并粘贴到名为 json.csv 的 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 数据类型限制