11 Desember 2017
Java & MySQL (4) - Menggunakan Data Access Object

Melanjutkan tulisan-tulisan sebelumnya tentang penggunaan database MySQL dalam aplikasi Java, kali ini kita akan belajar tentang Data Access Object (DAO).

Sederhananya, Data Access Object (DAO) adalah "objek" yang menjadi perantara antarmuka aplikasi dengan database. Karena sifatnya sebagai perantara, objek ini harus menyediakan metode-metode yang menunjang proses aplikasi yang berhubungan dengan database.

Proses paling dasar yang umumnya terjadi didalam aplikasi yang hubungannya dengan database antara lain : 1. Membuat/menambah data (create) 2. Mengambil/menampilkan data (retrieve) 3. Memperbaharui data (update) 4. Menghapus data (delete)

Keempat proses diatas biasa dikenal dengan istilah CRUD. DAO tidak terbatas hanya pada keempat proses tersebut, kita bisa saja menambah proses-proses lain sesuai dengan kasus yang dihadapi.

Contoh Kode Program

Perhatikan kode SQL berikut :

DROP DATABASE IF EXISTS sampledb;
CREATE DATABASE sampledb;
USE sampledb;

CREATE TABLE kontak (
  no INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  namaDepan VARCHAR(18) NOT NULL,
  namaBelakang VARCHAR(18) NOT NULL,
  alamat TEXT,
  noTelepon VARCHAR(18),
  email VARCHAR(32)
);

Struktur tabel diatas dapat dimodelkan menjadi class java seperti berikut :

public class Kontak {

  private int no;
  private String namaDepan;
  private String namaBelakang;
  private String alamat;
  private String noTelepon;
  private String email;

  // setter
  public void setNo(int no) { this.no = no; }
  public void setNamaDepan(String namaDepan) { this.namaDepan = namaDepan; }
  public void setNamaBelakang(String namaBelakang) { this.namaBelakang = namaBelakang; }
  public void setAlamat(String alamat) { this.alamat = alamat; }
  public void setNoTelepon(String noTelepon) { this.noTelepon = noTelepon; }
  public void setEmail(String email) { this.email = email; }

  // getter
  public int getNo() { return this.no; }
  public String getNamaDepan() { return this.namaDepan; }
  public String getNamaBelakang() { return this.namaBelakang; }
  public String getAlamat() { return this.alamat; }
  public String getNoTelepon() { return this.noTelepon; }
  public String getEmail() { return this.email; }

}

Sampai disini, kita bisa lanjutkan dengan membuat class DAO untuk mengakses tabel kontak.

Aplikasi yang kita buat bisa saja berurusan dengan lebih dari 1 tabel, dalam kondisi ini kita akan membutuhkan lebih dari 1 DAO. Jika dalam aplikasi terdapat lebih dari 1 DAO, maka tiap-tiap DAO harus mengikuti standard CRUD yang telah kita tentukan. Standard yang dimaksud disini dapat diterapkan dalam bentuk interface.

public interface DataDAO<T> {
  void doCreate(T t) throws java.sql.SQLException;
  java.util.List<T> doRetrieve() throws java.sql.SQLException;
  void doUpdate(T t) throws java.sql.SQLException;
  void doDelete(T t) throws java.sql.SQLException;
}

Class DAO yang mengimplementasikan interface diatas harus menyediakan setidaknya 4 buah metode yaitu : 1. doCreate() 2. doRetrieve() 3. doUpdate(), dan 4. doDelete().

Interface diatas dapat diimplementasikan seperti berikut :

import java.sql.*;
import java.util.*;

public class KontakDAO implements DataDAO<Kontak> {

  private Connection koneksi;

  public KontakDAO(Connection koneksi) {
    this.koneksi = koneksi;
  }

  @Override
  public void doCreate(Kontak t) throws SQLException {
    String sql = "INSERT INTO kontak(namaDepan, namaBelakang, alamat, noTelepon, email) VALUES (?, ?, ?, ?, ?)";
    PreparedStatement pstmt = koneksi.prepareStatement(sql);
    pstmt.setString(1, t.getNamaDepan());
    pstmt.setString(2, t.getNamaBelakang());
    pstmt.setString(3, t.getAlamat());
    pstmt.setString(4, t.getNoTelepon());
    pstmt.setString(5, t.getEmail());
    pstmt.executeUpdate();
    pstmt.close();
  }

  @Override
  public List<Kontak> doRetrieve() throws SQLException {
    List<Kontak> temp = new ArrayList<>();
    String sql = "SELECT * FROM kontak";
    Statement stmt = koneksi.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    while(rs.next()) {
      Kontak k = new Kontak();
      k.setNo(rs.getInt("no"));
      k.setNamaDepan(rs.getString("namaDepan"));
      k.setNamaBelakang(rs.getString("namaBelakang"));
      k.setAlamat(rs.getString("alamat"));
      k.setNoTelepon(rs.getString("noTelepon"));
      k.setEmail(rs.getString("email"));
      temp.add(k);
    }
    rs.close();
    stmt.close();
    return temp;
  }

  @Override
  public void doUpdate(Kontak t) throws SQLException {
    String sql = "UPDATE kontak SET namaDepan=?, namaBelakang=?, alamat=?, noTelepon=?, email=? WHERE no=?";
    PreparedStatement pstmt = koneksi.prepareStatement(sql);
    pstmt.setString(1, t.getNamaDepan());
    pstmt.setString(2, t.getNamaBelakang());
    pstmt.setString(3, t.getAlamat());
    pstmt.setString(4, t.getNoTelepon());
    pstmt.setString(5, t.getEmail());
    pstmt.setInt(6, t.getNo());
    pstmt.executeUpdate();
    pstmt.close();
  }

  @Override
  public void doDelete(Kontak t) throws SQLException {
    String sql = "DELETE FROM kontak WHERE no=?";
    PreparedStatement pstmt = koneksi.prepareStatement(sql);
    pstmt.setInt(1, t.getNo());
    pstmt.executeUpdate();
    pstmt.close();
  }

}

Sampai tahap ini kita sudah memiliki class java yang bertugas untuk menangani proses aplikasi terhadap database khususnya pada tabel kontak. Selebihnya kita dapat menggunakan class tersebut pada program seperti pada contoh berikut :

import java.sql.*;

public class Main {

  static String url = "jdbc:mysql://127.0.0.1:3306/sampledb";
  static String user = "root";
  static String password = "p455w0rd";

  public static void main(String[] args) {
    try {
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      Connection koneksi = DriverManager.getConnection(url, user, password);
      Kontak k = new Kontak();
      k.setNamaDepan("John");
      k.setNamaBelakang("Doe");
      k.setAlamat("Kendari");
      k.setNoTelepon("+624013123123");
      k.setEmail("john.doe@sample.com");
      KontakDAO ktkDao = new KontakDAO(koneksi);
      ktkDao.doCreate(k);
    }
    catch(SQLException exc) {
      System.err.println(exc.toString());
    }
  }

}