2013-12-13 3 views
0

У меня есть требование вставить строку JSON в базу данных (DB2). Я не думаю, что могу использовать тип данных VARCHAR здесь, потому что максимальный предел, который мне был указан для столбца в DB2, составляет 32 672. JSON, который я хочу вставить в этот столбец, может иметь намного больше символов. Итак, я думал о блобе как типе данных. Я могу успешно вставить. Но при извлечении я не могу отбросить объект blob в исходный JSON. Любая помощь будет оценена.JSON: Вставка и извлечение из базы данных (DB2)

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

ответ

1

DB2 имеет тип столбца, называемый "CLOB", который так же, как тип текста SQL (я думаю)

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

вы пробовали что ли?

+0

Пока нет. Благодарю. Я думаю, что это решит мою проблему. Будет ли размещен форум, если он этого не сделает. – Aspirant

0

Blob интерфейс не устанавливает какой-либо контракт на ToString() поэтому, скорее всего, возвращающее значения в соответствии с Object implementation. В конце концов, нет стандартного способа преобразования произвольной последовательности байтов в UTF-16 Строка.

Таким образом, эта линия не будет работать:

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

Вы с помощью JSON.simple и не Джексон, как помечено в этом вопросе (я не знаю, почему вы должны были бы оба.)

Предполагая, что файл кодируется как 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 некоторые другие Unico кодирования, способы обнаружения подробно описаны here.

Смежные вопросы