Menyimpan Gambar ke dalam Database Sqlite Java
Sqlite selain kuat untuk menyimpaan jutaan record (pernah saya gunakan untuk menyimpan generate password ukuran 8 gb) sekitar 136 juta record tanpa ada masalah sedikit pun. Sqlite menyediakan type data berupa blob seperti gambar, text. Menyimpan Gambar ke dalam Database Sqlite Java harus dilakukan dalam mode byte. Apa itu BLOB? merupakan singkatan dari Binary Large Object.
BLOB Ini didefinisikan sebagai potongan data biner yang disimpan sebagai satu kesatuan dalam sistem database. BLOB digunakan terutama untuk menyimpan objek multimedia seperti gambar, video, dan suara, meskipun mereka juga dapat digunakan untuk menyimpan program. Tidak semua DBMS mendukung BLOB.
- Keuntungan menyimpan data dalam tipe BLOB
- BLOB adalah alternatif yang baik untuk menambahkan file biner besar ke DB.
- Cadangan basis data berisi semua data.
- Salah satu cara terbaik yang hemat biaya.
- Ukuran basis data berkurang, karena penyimpanan BLOB menggunakan DB ringkas.
- Kekurangan
- BLOB tidak universal dalam hal Database (DB), yaitu tidak semua DB mendukungnya.
- Tidak efisien karena lebih banyak ruang disk dan waktu respons diperlukan.
- Penyimpanan BLOB tidak mengizinkan pemantauan DB.
- Overhead tambahan diperlukan untuk mengamankan penyimpanan BLOB yang digunakan.
File Byte dan Hex
Untuk memahami cara kerja tersebut, akan saya mulai dari file itu sendiri. Setiap file yang disimpan dalam komputer sebenarnya akan disimpan dalam bentuk binary yaitu 0 dan 1. Namun itu agak rumit bila kita baca, oleh sebab itu biasanya kita bisa nampilan file tersebut kedalam bentuk hex (hexa decimal). Misalkan kita buat sebuah file dengan nama D:/test.txt yang isinya sebagai berikut
test suka
maka bila file tersebut dibuka menggunakan aplikasi hexa editor akan tampil sebuah karakter hexa
artinya hurus ASCII yang kita simpan dalam file txt akan dibaca 74 65 73 74 20 73 75 6B 61.
Kita bisa koq menggunakan Java untuk melihat isi file tersebut dalam mode hex
String file = "D:/test.txt"; byte[] fileContent = Files.readAllBytes(Paths.get(file)); for (byte b : fileContent) { String st = String.format("%02X", b); System.out.println(st); }
hasilnya
65 65 73 74 20 73 75 6B 61
perhatikan variabel byte [] fileContent itulah yang akan kita simpan dalam blob di Sqlite. Tidak hanya file *.txt semua file pun bisa kita baca dalam mode byte seperti gambar ataupun file aplikasi. Byte tersebut bisa kita simpan kembali kedalam sebuah file, caranya cukup mudah. (jangan lupa create folder terlebih dahulu, pada contoh dibawah ini menggunakan lokasi D:/hasil/)
Files.write(Paths.get("D:/hasil/"+new File(file).getName()),fileContent);
Menyimpan Gambar ke dalam Database Sqlite Java
Pertama-tama kita buat terlebih dahulu sebuah database dan table Sqlite seperti berikut
Connection conn = null; try { // db parameters String url = "jdbc:sqlite:D:/contoh blob.db"; // create a connection to the database conn = DriverManager.getConnection(url); System.out.println("Koneksi telah terbangun"); //membuat tabel baru String sql = "CREATE TABLE IF NOT EXISTS biodata (\n" + " id_biodata integer PRIMARY KEY,\n" + " nama text NOT NULL,\n" + " gambar blob NOT NULL \n" + ");"; Statement stmt = conn.createStatement(); stmt.execute(sql); } catch (SQLException e) { System.out.println(e.getMessage()); }
Perhatikan jenis kolom gambar yang betipe blob. Langkah selanjutnya kita insert record
String insert = "INSERT INTO biodata(nama,gambar) VALUES(?,?)"; PreparedStatement pstmt = conn.prepareStatement(insert); pstmt.setString(1,file); pstmt.setBytes(2,fileContent); pstmt.executeUpdate();
maka dengan Sql diatas menyimpan gambar ke dalam database sqlite dapat selesai dengan baik. Nanti ukuran file database akan mengikuti ukuran file yang disimpan.
Membuka Gambar di Sqlite
Untuk membuka kembali database dan menyimpan hasil dalam bentuk aslinya, kita coba saja kode berikut
String select = "SELECT * FROM biodata"; ResultSet rs = stmt.executeQuery(select); while(rs.next()){ String f = rs.getString("nama"); byte [] b = rs.getBytes("gambar"); Files.write(Paths.get("D:/hasil/"+new File(f).getName()),b); System.out.println(f); }
perintah new File(f).getName() digunakan untuk mendapatkan nama filenya saja.
ref:
https://www.programiz.com/java-programming/examples/convert-byte-array-hexadecimal
https://howtodoinjava.com/java/io/read-file-content-into-byte-array/
https://mkyong.com/java/how-to-convert-array-of-bytes-into-file/