Java Oracle: хранить TreeMap как BLOB? - PullRequest
1 голос
/ 06 декабря 2011

У меня следующий код:

  public void StoreMapInDB(TreeMap<DateTime, Integer> map) throws
        IOException, FileNotFoundException{
    try {
  PreparedStatement insertMap = null;
  String insertString = "INSERT INTO TESTMAP(ID, NAME) VALUES (1, ?)";
  Connection con=null;
  con.setAutoCommit(false);
  Class.forName("oracle.jdbc.driver.OracleDriver");
  con=DriverManager.getConnection(
    "jdbc:oracle:thin:@XXXXX",
    "XXX",
    "XXX");
    //This line is incorrect for sure 
    //insertMap.setBlob(1, map.);
    } catch(Exception e){e.printStackTrace();}
}

Соединение работает и все с базой данных.На этот раз я пытаюсь вставить карту, т.е. созданную мной древовидную карту, в столбец таблицы с типом BLOB.Как я могу это сделать?Есть ли другие лучшие типы данных, на которые я должен обратить внимание?

Спасибо,

Ответы [ 2 ]

5 голосов
/ 06 декабря 2011

Если вы хотите поместить свой объект в тип данных BLOB, вы можете сделать что-то вроде этого:

// Serialize to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
out = new ObjectOutputStream(bos) ;
out.writeObject(object);
out.close();

// Get the bytes of the serialized object
byte[] buf = bos.toByteArray();
PreparedStatement prepareStatement = connection.prepareStatement("insert into tableName values(?,?)");
prepareStatement.setLong(1, id);
prepareStatement.setBinaryStream(2, new ByteArrayInputStream(buf), buf.length);
1 голос
/ 06 декабря 2011

Есть два способа сделать это ...

  • Вы можете воспользоваться тем, что коллекции сериализуются и выводить их в байтовый массив, как показано наответ на этот вопрос .

  • Вы можете изменить тип своей таблицы так, чтобы вместо использования двоичного поля для хранения конкретной реализации TreeMap выхраните ключи и значения в виде отдельных строк, которые затем можно извлечь и использовать для последующей перестройки карты.Эта опция более перспективна на будущее, потому что вы не будете полагаться на TreeMap и его формат сериализации навсегда.Вместо использования столбцов (id, data) вы должны использовать (id, key, value).Чтобы сохранить в БД, вы перебираете карту entrySet() и вставляете каждую пару ключ / значение, используя один и тот же идентификатор строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...