
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.
