![](/img/trans.png)
[英]Insert data a into DB2 database from Oracle ResultSet without iterations
[英]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類型相同(我認為)
你嘗試過嗎?
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.