簡體   English   中英

JSON:從數據庫插入和檢索(DB2)

[英]JSON: Insert and retrieve from database(DB2)

我需要將JSON字符串插入數據庫(DB2)。 我不認為我可以在這里使用VARCHAR數據類型,因為在DB2中我被告知列的最大限制為32,672。 我希望插入此列的JSON可能包含更多字符。 因此,我認為Blob是一種數據類型。 我能夠成功插入。 但是在檢索時,我無法將blob對象轉換為原始JSON。 任何幫助將不勝感激。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class DerbyBlobDemo
{
private static String url      = "jdbc:derby://localhost:1527/test";
private static String username = "APP";
private static String password = "APP";

public static void main(String[] args) throws Exception
{
    insert();

    read();
}

static void insert() throws Exception
{
    Connection conn = null;
    FileInputStream fis = null;
    try
    {
        Class.forName("org.apache.derby.jdbc.ClientDriver");
        conn = DriverManager.getConnection(url, username, password);
        conn.setAutoCommit(false);


        String jsonSql = "INSERT INTO SCHEMA.TABLE "
            + "(ID, JSON) " + "VALUES (?, ?)";

        PreparedStatement stmt = conn.prepareStatement(jsonSql);

        stmt.setString(1, "014");

        File jsonFile = new File("path to my json");
        fis = new FileInputStream(jsonFile);
        stmt.setBinaryStream(2, fis);

        stmt.execute();

        conn.commit();
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }
    catch (FileNotFoundException fex)
    {
        fex.printStackTrace();
    }
    finally
    {
        if (fis != null)
        {
            fis.close();
        }
        if (conn != null
            && !conn.isClosed())
        {
            conn.close();
        }
    }
}

static void read() throws Exception
{
    Connection conn = null;
    try
    {
        Class.forName("org.apache.derby.jdbc.ClientDriver");
        conn = DriverManager.getConnection(url, username, password);
        conn.setAutoCommit(false);

        Statement select = conn.createStatement();
        ResultSet result = select.executeQuery("Select * from SCHEMA.TABLE");
        while (result.next())
        {
            String identifier = result.getString("ID");

            String json = result.getBlob("JSON").toString();

            JSONObject jsonresult = (JSONObject) new JSONParser().parse(json);

            // JSONArray arrayObj = JSONArray.fromObject(result.getBlob("JSON"));

            // JSONArray arrayObj = new JSONArray();
            System.out.println(jsonresult);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}

DB2具有稱為“ CLOB”的列類型,它與SQL Text類型相同(我認為)

http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.intro%2Fsrc%2Ftpc%2Fdb2z_largeobjectdatatypes.htm

你嘗試過嗎?

Blob接口沒有聲明toString()的任何協定,因此很可能按照Object實現返回值。 畢竟,沒有標准的方法可以將任意字節序列轉換為UTF-16 String

因此,此行不起作用:

String json = result.getBlob("JSON").toString();

您使用的是JSON.simple而不是問題中標記的Jackson(我不知道為什么同時需要兩者。)

假設文件編碼為UTF-8,則可以使用以下方法解析數據:

static Object parseJson(Blob blob) throws SQLException, IOException,
    ParseException {
  try (InputStream in = blob.getBinaryStream();
      Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
    return new JSONParser().parse(reader);
  }
}

如果您需要避免JSON文件是其他Unicode編碼的可能性,請在此處詳細介紹檢測方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM