appGambar 2.0, Prototipe Java untuk Simpan Gambar di Database
- April 28th, 2010
- Posted in Programming
- Write comment

Dengan begitu banyaknya permintaan untuk membuat satu lagi metode untuk simpan data gambar di database, appGambar di blog lama, baru sekarang ini bisa terpenuhi untuk update. Kalau sebelumnya data gambar disimpan diluar dalam bentuk file dan hanya disimpan nama filenya saja, ini menggunakan metode berbeda. Dengan appGambar versi 2.0 ini, kita bisa menyimpan gambar langsung di database dengan untuk field dengan tipe data long blob, kemudian mengambil data untuk ditampilkan.

Seperti dijelaskan sebelumnya, masing-masing metode mempunyai tujuan dan keuntungan yang berbeda. File yang disimpan diluar akan menghemat ukuran data dan kecepatan koneksi database, sedangkan data yang disimpan di dalam database akan menjamin integritas data, untuk mencegah terjadinya kehilangan data.
Aplikasi ini dibuat dengan Netbeans 6.8 berbasis project menggunakan jdk1.6.0_17.
Sebelum mencoba, import file database terlebih dahulu, baru menjalankan aplikasi .exe atau .jar. Program dites dengan menggunakan username default root tanpa password, bagi yang berbeda harus dicompile ulang terlebih dahulu.
Klik Simpan untuk menyimpan setelah mengisikan semua field dan memilih gambar yang disimpan. Klik Cari untuk menampilkan ID yang sudah disimpan.
Struktur Database MySql
1 2 3 4 5 6 7 8 9 10 11 12 | DROP DATABASE `data`; CREATE DATABASE `data` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; USE `data`; CREATE TABLE IF NOT EXISTS `data_pegawai` ( `id` varchar(10) NOT NULL, `nama` varchar(50) NOT NULL, `jenis_kelamin` char(1) NOT NULL, `alamat` varchar(150) NOT NULL, `gambar` longblob, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; |
Source untuk Simpan Gambar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | private void bSimpanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bSimpanActionPerformed String jk = (eL.isSelected() ? "L" : "P"); String perintah = "insert into data_pegawai (id, nama, jenis_kelamin, alamat, gambar) values (" + "'" + eID.getText() + "'," + "'" + eNama.getText() + "'," + "'" + jk + "'," + "'" + eAlamat.getText() + "'," + " ?)"; try { //new NIOCopier(eGambar.getText(), gambar(eID.getText())); //if (stmt.executeUpdate(perintah) > 0) { PreparedStatement ps = con.prepareStatement(perintah); //"update data_pegawai set gambar = ? where id = '" + eID.getText() + "'"); ps.setBinaryStream(1, new FileInputStream(eGambar.getText()), new File(eGambar.getText()).length()); int s = ps.executeUpdate(); if (s > 0) { JOptionPane.showMessageDialog(this, "Penyimpanan berhasil"); } } catch (Exception ex) { cetak(ex.toString()); JOptionPane.showMessageDialog(this, "Penyimpanan gagal, \n" + ex.toString()); } kosongkan(); }//GEN-LAST:event_bSimpanActionPerformed |
Source untuk Ambil Gambar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //Pencarian ID yang sudah disimpan private void bCariActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bCariActionPerformed String id = eID.getText(); String perintah = "select * from data_pegawai where id = '" + id + "'"; kosongkan(); try { ResultSet hasil = stmt.executeQuery(perintah); for (int I = 0; hasil.next(); I++) { eID.setText(hasil.getString(1)); eNama.setText(hasil.getString(2)); if (hasil.getString(3).equals("L")) { eL.setSelected(true); } if (hasil.getString(3).equals("P")) { eP.setSelected(true); } eAlamat.setText(hasil.getString(4)); ((Painter) cGambar).setImage(gambar(id)); Blob blob = hasil.getBlob(5); ((Painter) cGambar).setImageIcon(new javax.swing.ImageIcon( blob.getBytes(1, (int) (blob.length())))); } } catch (Exception ex) { cetak(ex.toString()); } }//GEN-LAST:event_bCariActionPerformed |
Source untuk Tampilkan Gambar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class Painter extends Canvas { Image image; public void setImage(String file) { URL url = null; try { url = new File(file).toURI().toURL(); } catch (Exception ex) { cetak(ex.toString()); } image = getToolkit().getImage(url); repaint(); } public void setImageIcon(ImageIcon file) { image = file.getImage(); repaint(); } @Override public void paint(Graphics g) { double d = image.getHeight(this) / this.getHeight(); double w = image.getWidth(this) / d; double x = this.getWidth() / 2 - w / 2; g.drawImage(image, (int) x, 0, (int) (w), this.getHeight(), this); } } |
Download Link:
appGambar_2.0_database.zip
appGambar_2.0_database-kucing.zip
appGambar_2.0.exe
appGambar_2.0.jar
appGambar_2.0-sourcecode.zip
Aplikasi exe dari java dibuat dengan j2eWizard
Note:
Tolong kasih tahu kalau ada link yang bermasalah.
Ps:
Kucingnya suka difoto…

@craz
share om
@pager
ubah di bagian simpan gambar:
ps.setBinaryStream(1, new FileInputStream(eGambar.getText()), new File(eGambar.getText()).length());menjadi:
if(eGambar.getText().equals(""))ps.setNull(1, Types.BLOB);
else
ps.setBinaryStream(1, new FileInputStream(eGambar.getText()), new File(eGambar.getText()).length());
catatan: saya membuat kode ini tanpa dicoba. Tolong kasih tahu kalo dalam implementasi tidak berjalan.
wow tanpa nyoba pun bisa “Penyimpanan berhasil” tengkyu om agus yang baik hati
om kalo input gambarnya ada dua gimana?
@pager
- Tinggal buat dua parameter ?, ?
- Tambah setBinaryStream
udah nyoba yang itu dari semalam ga bisa dibilanganya com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ’21′ for key 1:
if(tAfot.getText().equals(“”)) ps.setNull(1, Types.BLOB);
if(tAgam.getText().equals(“”)) ps.setNull(2, Types.BLOB);
else
ps.setBinaryStream(1, new FileInputStream(tAgam.getText()), new File(tAgam.getText()).length());
ps.setBinaryStream(2, new FileInputStream(tAfot.getText()), new File(tAfot.getText()).length()); ps.executeUpdate();
@pager
Perintah ps.executeUpdate(); cuma boleh satu kali. Selain itu coba nomor id lain, karena id 21 sudah ada.
@pager
Perintah ps.executeUpdate(); cuma boleh satu kali. Selain itu coba nomor id lain, karena id 21 sudah ada.
ps.executeUpdate();
sudah cuma satu kali
dimasukin id berapapun juga tetep dibilangnya id yang baru dimasukin sudah ada
ralat ternyata ada kesalahan yang bener begini dan berhasil:
[sourcecode language="java"]
if(tAfot.getText().equals(“”)) ps.setNull(1, Types.BLOB);
else
ps.setBinaryStream(1, new FileInputStream(tAfot.getText()), new File(tAfot.getText()).length());
if
(tAgam.getText().equals(“”))ps.setNull(2, Types.BLOB);
else
ps.setBinaryStream(2, new FileInputStream(tAgam.getText()), new File(tAgam.getText()).length());
int s = ps.executeUpdate();
if (s > 0)
{JOptionPane.showMessageDialog(this, “Penyimpananberhasil”);
[/sourcecode]
cuma bingung nampilan ketika tombol cari ditekan dibilangnya gini:
java.sql.SQLException: “pos” + “length” arguments can not be larger than the BLOB’s length.
@pager
Lihat bagian ambil gambar,
- Apakah karena data gambar kosong/null
- Apakah karena
blob.getBytes(1, (int)
(blob.length()))));
Ingat, ada dua gambar. Jadi harus diambil satu persatu dan tidak boleh tertukar
hmmm…salahnya dimana ya:
((Painter) canvas1).setImage(gambar(no));
Blob blob = hasil.getBlob(5);
((Painter) canvas1).setImageIcon(new javax.swing.ImageIcon
(blob.getBytes(1, (int) (blob.length()))));
((Painter) canvas2).setImage(gambar(no));
Blob blib = hasil.getBlob(6);
((Painter) canvas2).setImageIcon(new javax.swing.ImageIcon
(blib.getBytes(2, (int) (blib.length()))));
yang tampil cuma gambar canvas1, yang canvas2 ga muncul
@pager
Harusnya tidak ada masalah. Coba tambahkan setelah itu:
canvas2.repaint();
maaf lagi-lagi kesalahan ane yang sok ide
di bagian terakhir ane ganti angka 1 jadi dua dikira no urut
(blib.getBytes(2, (int) (blib.length()))));
harusnya:
(blib.getBytes(1, (int) (blib.length()))));
berhasil! hohohow senangnya hati
om kalo buat update gimana supaya pas update gambarnya ga harus diambil lagi jadi gambar yang sudah ada di dalam database tidak diganggu gugat karena metode pengosongan yang ini:
if(tAfot.getText().equals(“”)) ps.setNull(1, Types.BLOB)
terima kasih
@pager
Hapus parameter di perintah SQL-nya.
String perintah;
if(tAfot.getText().equals(“”)){
perintah = "insert into data_pegawai (id, nama, jenis_kelamin, alamat, gambar) values ("
+ "'" + eID.getText() + "',"
+ "'" + eNama.getText() + "',"
+ "'" + jk + "',"
+ "'" + eAlamat.getText() + "'"
+ " )";
}else{
perintah = "insert into data_pegawai (id, nama, jenis_kelamin, alamat, gambar) values ("
+ "'" + eID.getText() + "',"
+ "'" + eNama.getText() + "',"
+ "'" + jk + "',"
+ "'" + eAlamat.getText() + "',"
+ " ?)";
}
pak saya mau tanya, saya lebih suka source code yg app pertama bapak, tapi ada masalah pak, ketika saya tambah tombol update, filex sebenarnya sudah terupdate tapi aplikasinya harus ditutup dulu baru di run lagi, kira” masalahnya apa ya pak??
@perdana
Kode update-nya seperti apa? karena di contoh cuma saya buat insert saja.
pak mo tanya nie…., saya coba tapi muncul pesan error gini
Exception in thread “AWT-EventQueue-0″ java.lang.NullPointerException
kira2 apa yang salah yo….., saya pake jinternalframe
@din2
Saya tidak tahu kalau belum lihat sourcenya, tapi bisa juga karena malasah dengan jre.
Coba install ulang java SDK dan JRE terbaru http://www.oracle.com/technetwork/java/javase/downloads/index.html,
kemudian, lakukan clean dan rebuild/recompile dari IDE.
om4gus…saya mau nanya ne…agak sedikit OOT sich…tapi masih hubungannya klop banget sama java..
gini sayakan buat aplikasi kepegawaian juga…nah insert tanggal pake JDateChooser…klo buat save ke db udah OK..tapi pas mau update data, nampilin tanggal kita tadi yang dari DB ke JDatechooser itu gimana caranya????udah 2 bulan ana stack disitu aja…trims.
aslm. boleh minta tolong tutor step by stepnya dari awal gak.. ? dulu pernah buat aplikasi java cuma lupa lagi.. saya ingin belajar lagi.. mohon bantuannya.. wslm..