В дополнение к числам, строкам и датам, многие базы данных могут сохранять большие объекты(large object - LOB), к числу которых относятся изображения и другие данные. В языке SQL существует понятие больших двоичных объектов(binary large object - BLOB) и больших символьных объектов(character large object - CLOB).
Чтобы прочитать LOB, нужно сначала выполнить оператор SQL, а затем вызвать метод getBlob или getClob в ResultSet. В результате вы получите объект типа Blob или Clob. Чтобы получить двоичные данные из Blob, вызовите метод getBytes или getInputStream. Например, если у вас имеется таблица с изображениями на книжных обложках, то изображение можно получить следующим образом:
PreparedStatement stat = conn.prepareStatement("SELECT Cover FROM BookCovers WHERE ISBN=?"); |
|
stat.set(1, isbn); |
|
ResultSet result = stat.executeQuery(); |
|
if(result.next()) { |
|
Blob coverBlob = result getBlob(1); |
|
Image coverImage = ImageIO.read(coverBlob.getInputStream()); } |
Подобным образом, если вы извлечете объект Clob, вы можете получить символьные данные посредством вызова метода String или getCharacterStream.
Чтобы поместить LOB в базу данных, нужно вызвать метод createLOB или createCLOB на нашем объекте Connection, получить выходной поток или писатель для LOB, записать данные и сохранить объект в базе данных. Например, ниже показан пример того, как можно сохранить изображение:
Blob coverBlob = connection.createBlob(); |
|
int offset = 0; |
|
OutputStream out = coverBlob.setBinaryStream(offset); |
|
ImageIO.write(coverImage, "PNG", out); |
|
PreparedStatement stat = conn.prepareStatement("INSERT INTO Cover VALUES (?, ?)"); |
|
stat.set(1, isbn); |
|
stat.set(2, coverBlob); |
|
stat.executeUpdate(); |