Kamis, 08 Desember 2011

Menyimpan dan Menampilkan gambar dalam tabel dengan Java

Kita dapat menyimpan berkas gambar kedalam tabel dengan kolom bertipe BLOB begitupun sebaliknya. Yaitu menampilkan data BLOB menjadi gambar. Hal ini dibutuhkan dalam pembuatan kartu identitas yang datanya diambil dari data pegawai misalnya. Sebagai percobaan, pertama-tama kita sediakan sebuah database (MySQL) yang kita berinama “testdb” dan berisi sebuah tabel yang bernama “datapegawai”.
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

mysql> use testdb;
Database changed

mysql> create table datapegawai (id int primary key auto_increment, nama varchar(200) not null, pasphoto blob);
Query OK, 0 rows affected (0.07 sec)

mysql> desc datapegawai;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| nama     | varchar(200) | NO   |     | NULL    |                |
| pasphoto | blob         | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
Setelah database dan tabelnya sudah siap, saatnya mengetikan kode program. Inilah contoh sederhananya…
$ vim Main.java
public class Main {
  public static void main(String[] args) {
    Jendela j=new Jendela();
    j.setVisible(true);
  }
}
$ vim Jendela.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
import com.mysql.jdbc.Blob;
import com.mysql.jdbc.PreparedStatement;
import java.util.logging.*;
import java.io.*;

public class Jendela extends JFrame {
  private JButton btnSimpan;
  private JButton btnTampilkan;
  private JLabel photo;

  private Connection con = null;
  private Statement st = null;
  private String url = "jdbc:mysql://localhost:3306/testdb";
  private String user = "usermysqlanda";
  private String pass = "passwordanda";

  int iLength;
  ImageIcon ii;
  Blob pic;

  public Jendela() {
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      try{
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        con = DriverManager.getConnection(url,user,pass);
        st= con.createStatement();
      } catch(Exception ex) {
        ex.printStackTrace();
      }

      btnSimpan=new JButton("Simpan");
      btnTampilkan=new JButton("Tampilkan");
      photo=new JLabel();

      btnSimpan.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          onSimpan(evt);
        }
      });

      btnTampilkan.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          onTampilkan(evt);
        }
      });

      JPanel panel=new JPanel();
      panel.add(btnSimpan);
      panel.add(btnTampilkan);

      getContentPane().setLayout (new GridLayout ());
      getContentPane().add(panel);
      getContentPane().add(photo);

      pack();
  }

   private void onSimpan(ActionEvent evt) {
     File file = new File("/home/wirasto/images.jpg");
      FileInputStream fileInputStream = null;
      try {
        fileInputStream = new FileInputStream(file);
      } catch (FileNotFoundException ex) {
        Logger.getLogger(Jendela.class.getName()).log(Level.SEVERE, null, ex);
      }
      PreparedStatement ps=null;
      try {
        ps = (PreparedStatement) con.prepareStatement("insert into datapegawai(nama, pasphoto) values (?, ?)");
        ps.setString(1, "luna");
        ps.setBinaryStream(2, fileInputStream, (int) file.length());
        ps.executeUpdate();
      } catch (SQLException ex) {
        Logger.getLogger(Jendela.class.getName()).log(Level.SEVERE, null, ex);
      }
   }

   private void onTampilkan(ActionEvent evt) {
     PreparedStatement ps=null;
    try {
      ps = (PreparedStatement) con.prepareStatement("select pasphoto from datapegawai where nama=?");
      ps.setString(1, "luna");
      ResultSet rs =  ps.executeQuery();
      rs.next();

      pic=(Blob) rs.getBlob(1);
      iLength = (int)(pic.length());
      ii = new ImageIcon(pic.getBytes( 1, iLength ));
      photo.setIcon(ii);
    } catch (SQLException ex) {
      Logger.getLogger(Jendela.class.getName()).log(Level.SEVERE, null, ex);
    }
   }
}
Setelah itu compile dan jalankan. Untuk lokasi mysql connector, silahkan disesuaikan saja.
$ javac -classpath "mysql-connector-java-5.1.6-bin.jar" Main.java Jendela.java
$ java -classpath "mysql-connector-java-5.1.6-bin.jar:" Main
Hasilnya

Tampilan yang indah memang bukan sasaran dari kode diatas. Silahkan kembangkan dan sesuaikan dengan kebutuhan Anda. Misalnya gambar yang namanya didapat lewat JFileChooser, bukan ditentukan langsung seperti contoh yang saya berikan.
Selamat mencoba

1 komentar:

  1. Tolong upload lagi projectnya, ga bisa di download di zidunya...

    BalasHapus