Pemrograman Java dengan Apache Ant

Tulisan kali ini akan membahas tentang penggunaan Apache Ant dalam pemrograman java. Apache Ant merupakan tool yang fungsi utamanya adalah untuk mengotomatiskan proses dalam pembuatan program java. Tool ini akan bermanfaat jika kita terpaksa harus membuat program dalam sistem operasi yang tidak memiliki antarmuka grafis (GUI) atau tidak ingin menggunakan aplikasi IDE (NetBeans, Eclipse, dan sejenisnya).

Instalasi dan Konfigurasi

Apache Ant bisa di-download dari alamat url http://ant.apache.org/bindownload.cgi, dan disediakan dalam format berkas .zip dan .tar.gz. Download format berkas yang bisa anda gunakan kemudian ekstrak di direktori yang anda inginkan.

Untuk bisa menggunakan Apache Ant, kita perlu membuat variabel sistem dengan nama %ANT_HOME% dan menambahkan folder bin dari direktori Apache Ant kedalam variabel %PATH%. Perhatikan langkah-langkah berikut :

Diasumsikan kita mengestrak berkas yang sudah didownload sebelumnya pada direktori C:\Program Files\, maka nilai variabel %ANT_HOME% adalah C:\Program Files\apache-ant-1.10.1 (versi yang saya gunakan adalah 1.10.1).

Dalam direktori Apache Ant terdapat folder dengan nama bin yang berisi file-file yang bisa dieksekusi. Nilai yang akan kita tambahkan ke dalam variabel %PATH% adalah C:\Program Files\apache-ant-1.10.1\bin.

Direktori Apache Ant

Variabel sistem dapat disetting melalui Control PanelSystem and SecuritySystemAdvanced System Settings ⇒ Pada jendela System Properties klik tombol Environment Variables. Untuk menambah variabel baru klik tombol New dan untuk memodifikasi variabel yang sudah ada klik tombol Edit. Hasil akhir dari konfigurasi adalah sebagai berikut :

Variabel ANT_HOME

Variabel PATH

Kita bisa menguji hasil konfigurasi melalui aplikasi Command Prompt dengan mengetikkan perintah ant, seperti berikut :

Command Prompt

Menggunakan Apache Ant

Apache Ant menggunakan sebuah file XML dengan nama build.xml. File build.xml berisi sebuah project dan sebuah project menampung paling sedikit satu buah target. Target akan menampung satu atau lebih elemen perintah yang harus dikerjakan.

Contoh sederhana dari file build.xml adalah sebagai berikut :

<?xml version="1.0"?>
<project name="HelloWorldGUI" basedir="." default="init">   <!-- project  -->
  <target name="init">                                      <!-- target   -->
    <mkdir dir="classes"/>                                  <!-- task 1   -->
    <mkdir dir="dist"/>                                     <!-- task 2   -->
  </target>
</project>

Penjelasan :

  • Elemen project terdiri atas beberapa atribut, yaitu :
    • name merupakan nama dari project
    • basedir mengindikasikan direktori dari project. simbol titik ( . ) mengindikasikan project berada di direktori saat ini (current directory)
    • default berisi nama dari target yang akan dieksekusi secara default.
  • Elemen target menggunakan satu buah atribut name yaitu nama dari target tersebut.
  • Elemen target terdiri atas 2 buah perintah (task) mkdir yang digunakan untuk membuat folder. Daftar lengkap dari task dapat dilihat pada halaman manual yang disediakan.

Eksekusi dua atau lebih target secara berurutan dapat dilakukan dengan memanfaatkan atribut depends. Perhatikan contoh berikut :

<target name="A"></target>
<target name="B" depends="A"></target>

Pada contoh diatas, target B bergantung (depends) kepada target A. Tiap kali kita memanggil target B, Apache Ant akan mengerjakan task pada target A baru kemudian mengerjakan task pada target B.

Contoh Program

Dalam contoh ini kita akan membuat sebuah program java menggunakan Apache Ant. Kita tentukan direktori project yaitu C:\HelloWorldGUI. Dalam direktori tersebut, kita membuat sebuah folder baru dengan nama src yang nantinya akan menampung kode program java. Selain itu kita juga membuat file build.xml seperti berikut :

<?xml version="1.0"?>
<project name="HelloWorldGUI" basedir="." default="build">

  <target name="clean">
    <delete dir="classes"/>
    <delete dir="dist"/>
  </target>

  <target name="init">
    <mkdir dir="classes"/>
    <mkdir dir="dist"/>
  </target>

  <target name="build" depends="clean,init">
    <javac includeAntRuntime="false" srcdir="src" destdir="classes"/>
  </target>

  <target name="test" depends="build">
    <java classpath="classes" classname="com.sad301.Main" fork="true" spawn="true"/>
  </target>

  <target name="dist" depends="build">
    <jar destfile="dist/HelloWorldGUI.jar" basedir="classes"/>
  </target>

</project>

Sampai disini kita bisa lanjutkan ke penulisan kode program. Ketikkan kode berikut kemudian simpan pada folder src dengan nama Main.java.

package com.sad301;

import javax.swing.*;

public class Main extends JFrame {

  public Main() {
    setTitle("Hello World GUI");
    setSize(400, 400);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
      (new Main()).setVisible(true);
    });
  }

}

Berdasarkan file build.xml diatas, kita memiliki 5 pilihan target yaitu :

  1. clean ⇒ target ini akan menghapus folder classes dan dist
  2. init ⇒ target ini akan membuat folder dengan nama classes dan dist
  3. build ⇒ target ini akan meng-compile kode program yang tersimpan di folder src dan menyimpan file .class hasil kompilasi di folder classes. Target ini juga akan mengerjakan clean dan init
  4. test ⇒ target ini menjalankan program java yang tersimpan di folder classes. Target ini juga akan mengerjakan build
  5. dist ⇒ target ini mengepak file-file .class menjadi file .jar didalam folder dist. Target ini juga akan mengerjakan build

Jalankan kembali aplikasi command prompt, kemudian pindah ke direktori C:\HelloWorldGUI. Pada direktori tersebut kita bisa eksekusi Apache Ant dengan menyebutkan salah satu dari 5 target diatas, sebagai contoh :

ant dist

Output dari perintah diatas adalah sebagai berikut :

Command Prompt 2

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());
    }
  }

}

Java & MySQL (3) – Menggunakan Stored Procedure MySQL dan CallableStatement

Tutorial kali ini akan membahas tentang stored procedure MySQL dan pemanggilannya dalam aplikasi java dengan menggunakan objek CallableStatement.

MySQL Stored Procedure

Stored procedure pada intinya merupakan prosedur yang tersimpan di dalam database. Prosedur tersebut dapat menampung 1 atau lebih pernyataan SQL yang saling berhubungan.

Syntax pembuatan stored procedure adalah sebagai berikut :

CREATE PROCEDURE [nama_prosedur]
(
  IN|OUT param_1 [tipe_data],
  ...
  IN|OUT param_n [tipe_data],
)
BEGIN
  [pernyataan sql 1];
  [pernyataan sql 2];
  [pernyataan sql n];
END

Sebagai contoh, perhatikan script SQL berikut :

DROP DATABASE IF EXISTS sample;
CREATE DATABASE sample;
USE sample;

CREATE TABLE barang (
	kode VARCHAR(18) NOT NULL,
	nama TEXT NOT NULL,
	kategori VARCHAR(32) NOT NULL,
	harga INT NOT NULL,
	jumlah INT NOT NULL DEFAULT 1,
	primary key (kode)
);

CREATE TABLE penjualan (
	no INT NOT NULL AUTO_INCREMENT,
	tanggal TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	kode_barang VARCHAR(18) NOT NULL,
	jumlah INT NOT NULL DEFAULT 1,
	PRIMARY KEY (no),
	FOREIGN KEY (kode_barang) REFERENCES barang (kode)
);

-- Pembuatan Stored Procedure
DELIMITER &
CREATE PROCEDURE tambah_penjualan (IN _kdBarang VARCHAR(18), IN _jmlBarang INT)
BEGIN
	SET @stok := (SELECT jumlah FROM barang WHERE kode = _kdBarang);
	INSERT INTO penjualan (kode_barang, jumlah) VALUES (_kdBarang, _jmlBarang);
	UPDATE barang SET jumlah = (@stok - _jmlBarang) WHERE kode = _kdBarang;
END &
DELIMITER ;

-- Tambah stok barang
INSERT INTO barang VALUES ("MB001", "Asus X370-F Gaming", "Motherboard", 4500000, 8);

Pada script diatas, pembuatan prosedur dilakukan pada baris 24 sampai 31. Dalam prosedur tersebut kita menggunakan tahapan yang umumnya terjadi dalam transaksi penjualan yaitu, menambah record penjualan kedalam tabel penjualan yang dilanjutkan dengan pengurangan jumlah stok dalam tabel barang.

Prosedur tersebut menggunakan 2 buah parameter yaitu, _kdBarang merupakan kode dari barang yang terjual, dan _jmlBarang yaitu berapa banyak barang yang terjual.

Proses yang terjadi dalam prosedur adalah sebagai berikut :

  1. Mengambil jumlah stok saat ini dari barang yang memiliki kode _kdBarang
  2. Menambah record penjualan kedalam tabel penjualan
  3. Memperbaharui jumlah barang dengan kode _kdBarang yaitu jumlah stok saat ini dikurangi jumlah terjual

Pemanggilan Prosedur

Prosedur diatas dapat dipanggil dengan menggunakan perintah :

CALL tambah_penjualan("MB001", 2);

Prosedur tersebut akan menambah record penjualan barang dengan kode MB001 dan memperbaharui jumlah stok barang MB001 menjadi 6 yaitu hasil pengurangan dari stok saat ini (8) dan jumlah terjual (2)

Pemanggilan Prosedur Melalui Aplikasi Java

Untuk memanggil prosedur MySQL dari aplikasi java, kita dapat menggunakan objek CallableStatement.

Objek CallableStatement terbentuk melalui metode prepareCall() dari objek Connection. Metode prepareCall() menggunakan 1 parameter String yaitu perintah pemanggilan prosedur.

Perhatikan contoh berikut :

import java.sql.*;

public class CallableStatementSample {

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

  public static void main(String[] args) {
    try {
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      Connection koneksi = DriverManager.getConnection(url, user, password);
      CallableStatement cstmt = koneksi.prepareCall("{CALL tambah_penjualan(?, ?)}");
      cstmt.setString(1, "MB001");
      cstmt.setInt(2, 2);
      cstmt.executeUpdate();
      cstmt.close();
      koneksi.close();
    }
    catch(SQLException exc) {
      System.err.println(exc.toString());
    }
  }

}