2010-08-18 3 views
1

У меня есть Java-программа, которая создает несколько xml-файлов, а затем зашифровывает их и сохраняет их в файловой системе. Позже в программе я хочу поместить тот же ZIP-файл в столбец blob моей базы данных оракула. Проблема в том, что я не уверен, как это сделать. Мне не нужно читать или делать что-либо с данными, просто переместите их в базу данных для постоянного центрального хранилища.Как перенести zip-файл в столбец blob в Java?

Спасибо!

ответ

0

Я думаю, что вы хотите использовать setBytes() метод:

Так пример для таблицы, представляющей электронную почту, где тело поток байтов будет выглядеть следующим образом:

 PreparedStatement ps = con.prepareStatement(
     "INSERT INTO Image (ID, Subject, Body) VALUES (2,?,?)"); 
     ps.setString(1, subject); 
     byte[] bodyIn = {(byte)0xC9, (byte)0xCB, (byte)0xBB, 
     (byte)0xCC, (byte)0xCE, (byte)0xB9, 
     (byte)0xC8, (byte)0xCA, (byte)0xBC, 
     (byte)0xCC, (byte)0xCE, (byte)0xB9, 
     (byte)0xC9, (byte)0xCB, (byte)0xBB}; 
     ps.setBytes(2, bodyIn); 
     int count = ps.executeUpdate(); 
     ps.close(); 

I Предполагая, что вы можете легко преобразовать вызов getBytes() для вашего объекта Zipped XML.

1

Существует несколько способов сделать это, но PreparedStatement.setBinaryStream, вероятно, лучший способ.

public void saveFileToDatabase(File file) { 
    InputStream inputStream = new FileInputStream(file); 

    Connection conn = ...; 
    PreparedStatement pS = conn.prepareStatement(...); 
    ... 
    pS.setBinaryStream(index, inputStream, (int) file.length()); 
    ... 
    pS.executeUpdate(); 
} 

(Обратите внимание, что для простоты я не включил какой-либо необходимой попробовать/поймать вещи для закрытия Connection, PreparedStatement и InputStream, но вы должны сделать это.)

сделано таким образом, , данные будут передаваться из файла в базу данных без необходимости загрузки в память сразу.

+0

Я попытался это (обработка ошибок удалены): общественного недействительными updateBlob (String идентификатор, File НФ) { InputStream является = новый FileInputStream (SF); Строка sql = "INSERT INTO tname ('bCol')" + "VALUES (?) WHERE tnameId =?"; PreparedStatement stmt = null; Connection conn = SqlUtil.getCurrentConnection(); stmt = conn.prepareStatement (sql); stmt.setBinaryStream (1, is, sf.length()); stmt.setString (2, id); stmt.executeUpdate(); получил ошибку: java.lang.AbstractMethodError: org.apache.commons.dbcp.DelegatingPreparedStatement.setBinaryStream (ILjava/IO/InputStream, J) V – Ironosity

+1

Попытка литья 'long' результат' sf.length() ', чтобы 'int' ... была версия' setBinaryStream', которая взяла длину 'int', а затем JDBC 4.0 добавила версию, которая занимает длину' long'. Метод 4.0 может быть вызван против библиотеки 3.0. Если это не сработает, убедитесь, что оба Commons DBCP и драйвер Oracle - это версии, поддерживающие хотя бы JDBC 3.0. – ColinD

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