BAB VI AKSES KE DATABASE
KETERANGAN TAMBAHAN
1. At End of Table
10.2 Pengolahan Data Gambar
10.2 Pengolahan Data Gambar
Kadangkala dalam membangun sebuah aplikasi dibutuhkan pengolahan data gambar. Berikut ini akan ditunjukkan aplikasi sederhana pengolahan database yang juga menyertakan data gambar. Ada 2 cara menyimpan data gambar ke dalam database:
1. Menyimpan file gambar langsung dalam database, dan tipe field pada database MySQL adalah BLOB dengan variannya (TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB, dan semisalnya).
Cara ini menyebabkan file gambar akan terintegrasi langsung dalam database dan tidak tersimpan dalam folder-folder di harddisk. Kelebihan: data gambar lebih aman tersimpan, namun kerugiannya, jika data banyak, akan memberatkan kinerja database.
2. Menyimpan alamat (path) penyimpanan gambar dalam harddisk.
Kelebihan : tidak memberatkan database. Kekurangan: jika folder tempat file gambar terhapus, maka data gambar hilang.
Penulis pernah mengerjakan pembuatan sistem informasi perpustakaan daerah. Awalnya, penulis menggunakan cara pertama, namun ternyata setelah koleksi buku ribuan, performa database terasa melambat. Akhirnya penulis berpindah menggunakan cara ke-dua, namun harus terlebih dahulu membuat aplikasi kecil perantara untuk mengekstrak isi gambar dari database menjadi file-file yang nantinya akan disimpan dalam folder tertentu.
Contoh aplikasi pengolahan data gambar yang akan kita buat berikut ini menggunakan cara ke-dua.
Gambar 7.18 Aplikasi Data Buku dengan Gambar
User memasukkan kode buku, judul, penulis, dan penerbit, kemudian menekan tombol Browse untuk mencari alamat file gambar di komputer. Setelah file dipilih, otomatis gambar file tersebut akan ditampilkan di sebelah kanan. Alamat file gambar tersebut ditampilkan pada JTextField txt_gambar. Contoh alamat gambar:
C:\Gambar\dive_into_python.jpg.
Komponen yang digunakan untuk menampilkan gambar adalah Canvas yang harus diletakkan di dalam Panel. Pada saat ditekan tombol Browse, akan muncul jendela pencarian file. Jendela pencarian File tersebut menggunakan komponen JFileChooser. Komponen JFileChooser pada kasus kita tidak ditampakkan, hanya muncul saat pengkodean.
Selain menggunakan Canvas, bisa saja kita menampilkan gambar dengan JLabel. Namun, ukuran gambar yang akan ditampilkan adalah fixed (tetap). Jika dimensi gambar lebih besar dari ukuran JLabel yang dipersiapkan, maka tampilan gambar akan membesar sesuai ukuran sebenarnya. Hal itu tentunya akan merusak layout pada JFrame secara keseluruhan. Kelebihannya jika menggunakan JLabel, kodenya lebih sederhana.
Jika menggunakan Canvas, ada banyak kode yang ditambahkan untuk mengatur agar tampilan gambar sesuai dengan ukuran Canvas pada JFrame. Meski dimensi file gambar sangat besar, namun ia akan tetap cukup ditampilkan pada Canvas. Kekurangannya adalah: jika ukuran file gambar lebih kecil dari ukuran Canvas maka ia akan ditampilkan apa adanya, sehingga akan terlihat ada ruang kosong pada Canvas yang tidak terpenuhi.
Gambar 7.19 Desain JFrame Aplikasi dgn gambar
Canvas (canvas1) diletakkan di dalam Panel (panel1) dengan ukuran yang sama. Caranya, letakkan terlebih dahulu Panel, dan atur ukurannya, selanjutnya letakkanlah Canvas, dan atur ukurannya seluas ukuran Panel.
Komponen Panel dan Canvas berada pada kelompok AWT pada Palette
Gambar 7.20 Komponen Panel dan Canvas pada AWT Desain Database dan Tabel
Nama Database : akses_database Nama Tabel : buku_gambar
Field Type Collation
kd_buku Varchar(3) latin1_swedish_ci judul Varchar(25) latin1_general_ci penulis Varchar(25) latin1_general_ci
penerbit Varchar(25) latin1_general_ci gambar Varchar(60) latin1_swedish_ci
Catatan : field gambar Collation-nya harus disetting menjadi latin1_swedish_ci untuk menyimpan alamat folder.
Kode Import
Pada aplikasi ini diperlukan import beberapa package yang digunakan pada kode. Kode untuk import : import java.awt.Canvas; // Komponen Canvas import java.awt.Graphics; // Pengolahan grafik import java.awt.Image; // Komponen Image import java.awt.event.KeyEvent;
// KeyPress Event pada txtkd_buku
import java.io.File;
// Pengolahan file tombol Browse
import java.net.URL;
// Di Class Painter method setImage
import java.sql.* ;
// akses ke database
import javax.swing.JFileChooser;
// pemilihan file tombol Browse
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
// Filter file
import javax.swing.filechooser.FileNameExtensionFilter;
// Filter ekstensi file
Kode-kode yang Ditambahkan
Ada beberapa kode yang ditambahkan selain Event-event pada tombol dan KeyPress pada txtkd_buku. Kode-kode tambahan tersebut terbagi menjadi 2 :
1. Kode di bawah initComponents()
2. Kode pembuatan Class Painter dan method cetak() Kode di bawah initComponents()
Kode yang terletak di bawah initComponents() adalah kode yang akan dieksekusi pada saat pertama kali di jalankan. Kode itu terletak pada Constructor. Constructor adalah pendefinisian parameter awal pada suatu class. Sebagai contoh, JFrame yang kita buat adalah sebuah class dengan nama buku_gambar.java. Constructor asalnya adalah sebagai berikut:
public buku_gambar() {
initComponents();
}
Kode constructor biasanya ada di bagian atas setelah kode-kode tentang import.
Secara asal, tidak ada kode di bawah initComponents. Namun, pada aplikasi ini ada kode-kode tambahan, sehingga kode Constructornya menjadi seperti berikut :
public buku_gambar() {
initComponents();
folder = System.getProperty("user.dir") + File.separator + "images";
//folder = getClass().getResource("").getFile().toString() + "images"; cetak(folder);
new File(folder).mkdir(); }
CATATAN
Ada 2 tempat meletakkan kode yang akan dieksekusi pada saat form pertama kali dijalankan : 1. Diletakkan di bawah initComponents().
2. Buat Event componentShown pada JFrame : Klik kanan pada JFrame > Events >Components > componentShown
Pada bahasa pemrograman lain, eventnya sama dengan LoadEvent atau ActivateEvent Kode pembuatan Class Painter dan method cetak()
Kode untuk pembuatan Class Painter dan method cetak diletakkan di bagian bawah kode berikut:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new buku_gambar().setVisible(true);
}
});
}
Kode yang ditambahkan adalah :
private void cetak(String str) {
System.out.println(str);
}
public class Painter extends Canvas {
Image image;
public void setImage(String file) {
URL url = null;
try {
} catch (Exception ex) { cetak(ex.toString()); } image = getToolkit().getImage(url); repaint(); }
public void paint(Graphics g) {
try {
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);
} catch (Exception e) {
String n = e.toString() ;
}
}
}
private String folder ;
Setting Custom Creation Code pada Properties canvas1 Aturlah properties canvas1 (tab Code) dan isikan kode :
new Painter() ;
Gambar 7.21 Custom Creation Code pada canvas1
Method ‘Bersih’
Berfungsi untuk membersihkan tulisan pada JTextField dan mengosongkan gambar pada canvas1
Kodenya adalah :
private void Bersih(){
txtkd_buku.setText(""); txt_judul.setText(""); txt_penulis.setText(""); txt_penerbit.setText(""); txt_gambar.setText(""); ((Painter) canvas1).setImage(""); txtkd_buku.requestFocus(); }
Kode tombol Simpan
try {
// Setting Driver MySQL
Class.forName("com.mysql.jdbc.Driver") ;
Connection cn = DriverManager.getConnection("jdbc:mysql:" + "///akses_database","root",""); Statement smt = cn.createStatement(); String g = txt_gambar.getText().replace("\\","\\\\"); txt_gambar.setText(g); String sql =
"insert into buku_gambar (kd_buku,judul,penulis, penerbit,gambar) values ('" + txtkd_buku.getText()+"','" + txt_judul.getText() +"','"+txt_penulis.getText()+"',
'"+txt_penerbit.getText()+"','"+txt_gambar.getText()+"') " ; smt.executeUpdate(sql); Bersih(); } catch (Exception e) { e.printStackTrace(); }
Penjelasan Kode Program
Untuk menyimpan alamat folder ke dalam database MySQL, formatnya harus disesuaikan terlebih dahulu. Sebagai contoh, alamat:
C:\Gambar\dive_into_python.jpg
jika tidak disesuaikan formatnya, di database akan tersimpan sebagai: C:Gambardive_into_python.jpg (tanda „\‟ akan hilang).
Karena itu dilakukan penyesuaian format pada txt_gambar dengan kode:
String g = txt_gambar.getText().replace("\\","\\\\");
txt_gambar.setText(g);
txt_gambar nantinya adalah sebagai data penyimpan ke field gambar di database MySQL. Dengan penyesuaian itu, maka di database akan tersimpan dalam format:
C:\Gambar\dive_into_python.jpg Kode pada tombol Edit
try {
// Setting Driver MySQL
Class.forName("com.mysql.jdbc.Driver") ; // Buat Connection cn Connection cn = DriverManager.getConnection("jdbc:mysql:" + "///akses_database","root",""); Statement smt = cn.createStatement(); String g = txt_gambar.getText().replace("\\","\\\\"); txt_gambar.setText(g); String sql =
"update buku_gambar set judul = '" + txt_judul.getText() +"', " +
"penulis = '"+txt_penulis.getText()+"', penerbit = " +
"'"+txt_penerbit.getText()+"', gambar ='"+txt_gambar.getText()+"' " +
"where kd_buku='"+txtkd_buku.getText()+"' " ; smt.executeUpdate(sql); Bersih(); } catch (Exception e) { e.printStackTrace(); }
Kode pada tombol Hapus
try {
// Setting Driver MySQL
Class.forName("com.mysql.jdbc.Driver") ;
// Buat Connection cn
"///akses_database","root","");
Statement smt = cn.createStatement();
String sql =
"delete from buku_gambar where kd_buku ='"+txtkd_buku.getText()+"'";
smt.executeUpdate(sql);
Bersih();
} catch (Exception e) {
e.printStackTrace();
}
Kode pada tombol Browse
javax.swing.JFileChooser jfc = new JFileChooser();
// pembuatan komponen file chooser (pemilih file)
FileFilter jpgFilter, gifFilter, bothFilter;
jpgFilter = new FileNameExtensionFilter("Gambar JPEG", "jpg");
// memfilter untuk ekstensi jpg
gifFilter = new FileNameExtensionFilter("Gambar GIF", "gif");
// memfilter untuk ekstensi gif
bothFilter = new FileNameExtensionFilter("Gambar JPEG dan GIF", "jpg", "gif");
jfc.setAcceptAllFileFilterUsed(false);
jfc.addChoosableFileFilter(jpgFilter);
jfc.addChoosableFileFilter(gifFilter);
jfc.addChoosableFileFilter(bothFilter);
if (jfc.showOpenDialog(this) == jfc.APPROVE_OPTION)
// Jika tombol Open di-klik
String f = jfc.getSelectedFile().toString();
txt_gambar.setText(f);
// tampilkan alamat file di variabel f ke txt_gambar
((Painter) canvas1).setImage(f);
// tampilkan gambar sesuai alamat pada variabel f
}
Kode pada KeyPress Event txtkd_buku
Jika setelah kode buku diisikan dan ditekan tombol Enter, maka akan dilakukan pencarian data sesuai kode buku itu. Jika ada, data ditampilkan pada JTextField dan gambarnya ditampilkan ke canvas1
Kodenya adalah :
if (evt.getKeyCode()==KeyEvent.VK_ENTER) {
try {
// Setting Driver MySQL
Class.forName("com.mysql.jdbc.Driver") ; // Buat Connection cn Connection cn = DriverManager.getConnection("jdbc:mysql:" + "///akses_database","root",""); Statement smt = cn.createStatement(); String sql =
"select * from buku_gambar where kd_buku ='" + txtkd_buku.getText()+"' " ;
ResultSet rs = smt.executeQuery(sql) ;
if (rs.next()) {
txt_judul.setText(rs.getString("judul"));
txt_penulis.setText(rs.getString("penulis")) ;
txt_gambar.setText(rs.getString("gambar"));
((Painter) canvas1).setImage(txt_gambar.getText());
} else {
JOptionPane.showMessageDialog(this,"Data Tidak Ada","Informasi",
JOptionPane.INFORMATION_MESSAGE); } } catch (Exception e) { e.printStackTrace(); } }