Apache Derby: typ danych BLOB
Opis
Łańcuch znaków o długości do 2 147 483 647 znaków, czyli 2684 obrazków o wymiarach 1000×800 pikseli.
Składnia
BLOB
(liczba znaków Unicode)
albo
BINARY LARGE OBJECT
(liczba znaków Unicode)
Liczba znaków może być podana jako:
- 12235 – liczba znaków
- 12K – 12*1024 znaków
- 2M – 2*1024*1024 znaków
- 1G – 1*1024*1024*1024 znaków
- bez podanej wartości – domyślnie 2G = 2 147 483 647 znaków
Odpowiadający typ Java
java.sql.Blob
Odpowiadający typ JDBC
java.sql.Types.BLOB
Klasa R052.java
package aderby.types; import aderby.DerbyUtil; import java.io.*; import java.sql.*; import java.util.Objects; public class R052_BLOB { private static final String baza = "C:/Przyklady/R052"; public static final String createTableObrazki = "CREATE TABLE obrazki(" + "id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1), " + "nazwa VARCHAR(256), obrazek BLOB)"; public static void main(String[] args) { DerbyUtil.startDerbyEngine(DerbyUtil.embdriver); Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true"); Statement stat = null; ResultSet rs; try { stat = con.createStatement(); stat.execute(createTableObrazki); } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.imagesToDerby(con, "aderby/src/resources/karty", ".jpg"); String nazwa; Blob bl = null; File file; InputStream is = null; FileOutputStream fos = null; try { rs = Objects.requireNonNull(stat).executeQuery("SELECT * FROM obrazki WHERE nazwa='AW2.jpg'"); while (rs.next()) { nazwa = rs.getString("nazwa"); bl = rs.getBlob("obrazek"); file = new File("C:/Przyklady/" + nazwa); is = bl.getBinaryStream(); try { fos = new FileOutputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } DerbyUtil.copyStream2(is, fos); } } catch (SQLException e) { e.printStackTrace(); } finally { if (bl != null) { try { bl.free(); } catch (SQLException e) { e.printStackTrace(); } } } DerbyUtil.close(is); DerbyUtil.close(fos); DerbyUtil.close(stat); DerbyUtil.close(con); DerbyUtil.shutdownEmbeddedDB(baza); DerbyUtil.shutdownDerbyEngine(); } }
Klasa Multifilter.java
package aderby; import java.io.*; import java.util.*; @SuppressWarnings("MismatchedReadAndWriteOfArray") public class MultiFilter implements FilenameFilter { private final String[] exts; private final String[] lowerExts; public MultiFilter(File dir, String... exts) { if (exts == null || exts.length == 0) throw new IllegalArgumentException( "musisz poda\u0107 przynajmniej jedno nie-puste rozszerzenie"); String[] as; int k = (as = exts).length; for (int j = 0; j < k; j++) { String i = as[j]; if (i == null || i.length() == 0) throw new IllegalArgumentException( "argument nie mo\u017Ce by\u0107 ani 'null' ani 'pusty' "); } this.exts = new String[exts.length]; lowerExts = new String[exts.length]; for (int i = 0; i < exts.length; i++) { this.exts[i] = exts[i]; lowerExts[i] = exts[i].toLowerCase(Locale.ENGLISH); } } @Override public boolean accept(File dir, String s) { for (int i = 0; i < lowerExts.length; i++) if (s.endsWith(exts[i])) return true; return false; } }
Po uruchomieniu klasy w folderze C:/Przyklady pojawi się baza danych zawierająca 10 obrazków w postaci obiektów BLOB oraz plik obrazka AW2.jpg, który został z bazy pobrany jako obiekt BLOB, a następnie zapisany do pliku.
Pliki do ściągnięcia
Aktualny (tworzony narastająco) plik module-info.java
Aktualny (tworzony narastająco) plik DerbyUtil.java
Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java
może być potrzebne skreślenie niepotrzebnych wpisów.