В дополнение к числам, строкам и датам, многие базы данных могут сохранять большие объекты(large object — LOB), к числу которых относятся изображения и другие данные. В языке SQL существует понятие больших двоичных объектов(binary large object — BLOB) и больших символьных объектов(character large object — CLOB).
Чтобы прочитать LOB, нужно сначала выполнить оператор SQL, а затем вызвать метод getBlob или getClob в ResultSet. В результате вы получите объект типа Blob или Clob. Чтобы получить двоичные данные из Blob, вызовите метод getBytes или getInputStream. Например, если у вас имеется таблица с изображениями на книжных обложках, то изображение можно получить следующим образом:
1 2 3 4 5 6 |
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, записать данные и сохранить объект в базе данных. Например, ниже показан пример того, как можно сохранить изображение:
1 2 3 4 5 6 7 8 |
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(); |