Generic Types

Di tulisan sekarang, kita bakal bahas dikit tentang Generic Types. Apa itu generic types?! Inti dari generic types itu… sebuah tipe data yang dapat dimasukin nilai apapun. Bingung?! Baiklah… kita mulai dari konsep variabel.

Bayangkan sekarang kamu punya variabel di kode kamu masing-masing. Gambaran dari variabel adalah sebuah kotak yang memiliki kesepatakan terhadap “apa yang disimpan” dalam kotak tersebut, dan juga “jenis yang disimpan”. Contohnya, kamu punya kotak untuk menyimpan jenis-jenis sepatu, maka hal yang harus kamu simpan adalah sepatu. Hal yang kamu simpan bisa sepatu olahraga, sepatu high heel buat ke pesta, atau bahkan sepatu barbie kamu… yang penting, isinya sepatu. Akan salah besar kalau kamu simpan koleksi tas kamu dalam kotak yang dimaksudkan untuk menyimpan sepatu.

Itu konsep variabel… sekarang, bayangkan, ketika ada seseorang yang bakal menggunakan kotak tersebut. Pastinya, orang itu mau menyimpan sesuatu. Tapi… bukan sepatu lah yang mau ia simpan. Dia butuh kotak untuk menyimpan bundle-an revisi TA dari dosen pembimbing-nya. Efeknya, kotak sepatu yang tersedia, udah ga berguna lagi. Dia harus membuat kotak baru untuk menyimpan revisian2 itu. Ga efektif kan?! Harus bikin dari awal, padahal kotak sepatu masih bisa nutup lhah buat nyimpen dokumen semacam revisian TA dengan segala coretan di dalamnya.

Dan di sinilah Generic Types bekerja dengan caranya… memastikan bahwa sebuah variabel dapat menampung nilai dengan fleksibel.

Implementasi generic types yang paling gampang dilihat yaitu di penggunaan Collections dari bahasa pemrograman Java. Contoh paling gampang, di Array List. Pada saat menggunakan array list, kamu bisa menambahkan berbagai elemen dengan tipe data yang berbeda.

import java.util.ArrayList;

public class TipeUmum {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("hai, ini blog");
al.add("arby");
al.add(3);
System.out.println(al);
}
}
//hasil eksekusi: [hai, ini blog, arby, 3]

Lihat contoh di atas kan… Di array list bernama al, kita menambahkan 2 data dengan 2 objek yang berbeda. Tipe berupa string, dan tipe berupa angka (integer). Artinya, untuk implementasi kode array list, programmer-nya pakai tipe generic untuk mengkodekan sifat-sifat dari si list. Dan tipe ini fleksibel banget. Karena selain memberikan kemudahan, tipe ini juga bisa dibuat strict. Contohnya:

import java.util.ArrayList;

public class TipeUmum {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList();
al.add("hai, ini blog");
al.add(" arby");
al.add(3);
System.out.println(al);
}
}

//kode di atas error, tidak dapat dikompilasi
//baris yang dicoret: baris penyebab error

Kode di atas, itu ga jauh beda dari sebelumnya. Perbedaannya, ada pada penulisan ArrayList<Integer>. Hal ini ga dipunya oleh kode yang sebelumnya. Dan begitulah cara untuk membuat array list strict dalam penggunaannya. Tentang hal ini, ada terkait dengan type erasure yang dilakukan oleh java compiler.. tapi ga usah kita bahas lhah yang itu ya.

Balik lagi ke inti tulisan kita, ArrayList di atas adalah contoh penggunaan tipe umum atau Generic Types. Dan sekarang, seandainya kita akan membuat sebuah implementasi dari generic types, gimana caranya?! Anggap kita mau membuat sebuah struktur data “circular linked list” dengan sifatnya sendiri, tapi data yang diberikan bisa beda-beda… untuk hal ini, kita butuh generic.

Implementasi generic itu dasarnya gampang banget, kamu cuma perlu mengganti setiap tipe data dari variabel yang kamu tuliskan menjadi sebuah huruf kapital. Contoh, kamu punya variabel “int data”, tinggal ganti jadi “T data” atau “D data”. Setelahnya, tambahkan huruf capital tersebut di dekat nama class, diapit dengan diamond. Contohnya, kalau tadi kamu ganti tipenya jadi T, dan ini ada di kelas bernama Box, maka tuliskan “Box<T>“. Hurufnya bisa apapun, yang penting kapital. Iya, itu aja cukup. Cuma, ada kesepakatan dalam konvensi developer, untuk penggunaan huruf kapital, harus mewakili hal-hal berikut:

  1. Untuk mewakili elemen, tuliskan E;
  2. Untuk mewakili kunci elemen (key), tuliskan K;
  3. Untuk mewakili nomor (number), tuliskan N;
  4. Untuk mewakili tipe tertentu (type), tuliskan T;
  5. Untuk mewakili nilai tertentu (value), tuliskan V;
  6. Untuk mewakili parameter 2, 3, 4, dst, tuliskan S, U, V, dst.

Tapi lagi-lagi… hal di atas cuma kesepakatan yah… enggak wajib. Sekarang, kodenya gimana?! Untuk mencoba belajar melihat sifat generic, kita butuh perbandingan antara kode non-generic-types dengan yang generic-types. Dan ini kode yang non-generic-types:

public class Kotak {
    private int barang;

    public void set(int barang) { 
        this.barang = barang; 
    }
    public int get() { 
        return barang; 
    }
}

Untuk menggunakan class di atas, kode main yang mungkin dibuat adalah

public static void main(String[] args) {
Kotak k1 = new Kotak();
k1.set(5);

Kotak k2 = new Kotak();
k2.set(10);
}

Bandingkan dengan penulisan kode dari generic types dari kotak di atas:

public class KotakG<T> {
    private T barang;

    public void set(T barang) {
        this.barang = barang;
    }
    public T get() {
        return barang;
    }
}

Untuk menggunakan class KotakG di atas, kode main yang mungkin dituliskan adalah:

public static void main(String[] args) {
KotakG k1 = new KotakG();
k1.set(5);

KotakG k2 = new KotakG();
k2.set("Revisi TA");
}

Lihat kan yah… di sini, kamu dapat memasukkan 2 tipe data yang berbeda dalam objek yang dibentuk dari class yang sama. Hal ini ga akan kamu bisa lakukan di class Kotak (yang tidak menggunakan konsep generic).

Kode lengkapnya untuk yang KotakG gini:

public class KotakG<T> {
    private T barang;

    public void set(T barang) {
        this.barang = barang;
    }
    public T get() {
        return barang;
    }

    public static void main(String[] args) {
        KotakG k1 = new KotakG();
        k1.set(5);
        System.out.println("Isi kotak k1: "+k1.get());

        KotakG k2 = new KotakG();
        k2.set("Revisi TA");
        System.out.println("Isi kotak k2: "+k2.get());
    }
}

Hasil akhirnya:

Isi kotak k1: 5
Isi kotak k2: Revisi TA

Daaaan.. begitulah. Generic Types ini banyak dibahas kalau udah ngebahas mata kuliah struktur data pakai bahasa Java. Karena, di mata kuliah itu, kita bakal bikin linked list, doubly linked list, circular linked list, tree, graph, dll, dsb dengan data yang disimpan bersifat fleksibel. Bahkan bisa bertipe objek.

FYI, generic types yang kita bahas ini sebenarnya cetek yah… yaaaa, khas nya tulisan blog balita lhah.. kamu bisa lihat berbagai hal lain di sumber-sumber yang saya cantumkan di bawah ini. Dan sekarang, sekian tulisan tentang generic types.. happy learning.

Sumber:

https://docs.oracle.com/javase/tutorial/java/generics/index.htm

https://www.tutorialspoint.com/java/java_generics.htm

https://docs.oracle.com/javase/tutorial/extra/generics/index.html

Advertisements

Mengubah Format Currency dan Format Rupiah ke dalam Number pada Bahasa Java

Berawal dari lebih dari 1 orang yang nanyain di kotak komentar postingan ini, gw akhirnya bikin dah post ini. Mayan… buat nambah2in isi blog yang agak guna biar ga curcolan mulu isinya…

Singkat cerita, ada yang nanyain gimana cara ngubah format dalam bentuk duit balik lagi ke sifat aslinya (number) biar bisa dioperasiin. Well… buat gw, itu pertanyaan yang bikin gw bingung. Banget! Karena… faktanya, kalau kamu udah punya suatu “a” yang kamu ubah jadi “b”, buat apa kamu ngubah “b” jadi “a”. Toh nilai “a” dari awal udah kamu punya dan nilainya sama sekali ga ketimpa. Beda tipe data gitu… gimana cara isinya bisa ditimpa jadi nilai lain kan yah… Makanya gw bingung.

Tapi apapun itu… ada satu alasan buat para programmer-pemberi-isi-kotak-komentar-di-postingan-asal biar ga ambil lagi nilai awalnya. Dan mereka bingung gimana cara balikinnya. Untuk itu… disinilah gw sebagai pencerah bagi mereka yang kebingungan… Hohoho.

Seperti yang gw tulisin di kotak balasan, ada beberapa langkah yang musti dilakukan:

  1. Parse formatted String ke tipe Number pakai method parse dari objekDecimalFormat
  2. Konversi bentuk Number ke byte/double/float/long/int/short pakai byteValue/doubleValue dst.

Simple kan… buat yang bingung, kodenya gini:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

public class KurensiIndonesia {

    public static void main(String[] args) {
        double harga = 250000000;

        DecimalFormat kursIndonesia = (DecimalFormat) DecimalFormat.getCurrencyInstance();
        DecimalFormatSymbols formatRp = new DecimalFormatSymbols();

        formatRp.setCurrencySymbol("Rp. ");
        formatRp.setMonetaryDecimalSeparator(',');
        formatRp.setGroupingSeparator('.');

        kursIndonesia.setDecimalFormatSymbols(formatRp);
        String x = kursIndonesia.format(harga);
        System.out.println("Harga Rupiah: "+x);
//konversi balik String --> number type
        try {
            Number number = kursIndonesia.parse(x);
            double nilai = number.doubleValue();
            System.out.println("Nilai dari rupiah: "+String.format("%.2f", nilai));
        } catch (ParseException ex) {
            System.out.println("Kesalahan Parsing");
        }
    }
}

Hasil:

Capture

Contoh kode yang lebih singkat… cuma buat konversi rupiah ke angka itu gini:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

public class KurensiIndonesia {

    public static void main(String[] args) {

        String x = "Rp. 250.000.000,00";
        DecimalFormat kursIndonesia = (DecimalFormat) DecimalFormat.getCurrencyInstance();
        DecimalFormatSymbols formatRp = new DecimalFormatSymbols();

        formatRp.setCurrencySymbol("Rp. ");
        formatRp.setMonetaryDecimalSeparator(',');
        formatRp.setGroupingSeparator('.');

        kursIndonesia.setDecimalFormatSymbols(formatRp);
        try {
            Number number = kursIndonesia.parse(x);
            double nilai = number.doubleValue();
            System.out.println("Nilai dari rupiah: "+String.format("%.2f", nilai));
        } catch (ParseException ex) {
            System.out.println("Kesalahan Parsing");
        }
    }
}

Intinya, pastiin objek DecimalFormat sama DecimalFormatSymbols yang dibentuk itu sama jenisnya. Gampangnya, objek yang digunain buat nge-format sama nge-parse itu sama. Jangan sampe beda. Kalau beda, ada kemungkinan kamu dapat nilai yang salah bahkan kegagalan eksepsi.

Dan karena banyak yang nanya juga terkait swing dan lainnya… hal di atas gw juga udah coba ke swing (pakai jtextfield biasa) sama akses database (nyimpen ke Access–biar gw ga usah nginstall dbms lagi)…. dan berhasil.

Moga ngebantu urusan kamu masing-masing…

Baca juga: Mengubah nilai double –> rupiah.

Pass By Reference Menggunakan Java

Okeh… ini postingan yang bermula dari chat yang dah lamaaaaaaa banget. Tapi baru sempat gw bikin tulisannya sekarang. Yeah… shame on me… 😦

Kerjaan seabrek emang mustinya gak jadi alasan. Gw ajah yang ga bisa ngatur jadwal. Tapi yah.. gitu deh, akhirnya ketulisan juga nih blog pake postingan yang sebenernya dah kadaluarsa.

Jadi… yaaa, ada lah yaaa… kenalan gw. Sebut saja si Cantik (karena ga mau disebutin identitasnya). Ceritanya si Cantik ini keukeuh ama temennya kalo yang namanya pass by reference itu mungkin banget ditulisin pake bahasa Java. Dan pendiriannya itu tepat! Sayangnya, contoh implementasi (berdasarkan pengakuan) yang dia kasih… ternyata ga secantik…. nama aliasnya (yah… nama aliasnya si Cantik, kan?).

Key… jadi… di Java emang mungkin untuk membuat sebuah mekanisme pass-by-reference layaknya bahasa pemrograman C++. Cuma caranya ajah yang beda. Kalo di C++, kan pake pengaksesan alamat menggunakan simbol ampersand (&). Sedangkan kalo di Java, cara pengaksesannya menggunakan pengiriman objek. Yah… kalo ada dari kamu yang nganggap ini bukan sebagai bentuk pass by reference, gw juga gak ngebantah. Emang sifatnya agak beda. Tapi gw punya alasan yang cukup buat berpegang teguh kenapa pengiriman objek jadi mirip sama pass by reference.

Cukup ngocehnya, jadi berikut contoh dari kode pass by value plus pass by reference make bahasa pemrograman Java.

public class X {

    int u,v;

    public X(int u, int v) {
        this.u = u;
        this.v = v;
    }

    public void passValue(int u, int v){
        u = u+10;
        v = v*10;
    }

    public void passReference(X x){
        x.u = x.u+10;
        x.v = x.v*10;
    }
}
public class Main {
public static void main(String[] args) {
X x = new X(1,2);

//Nilai u & v milik objek x sebelum pass by value
System.out.println("Pass Value\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passValue(x.u, x.v);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

//Nilai u & v milik objek x sebelum pass by reference
System.out.println("\nPass Reference\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passReference(x);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

}
}

Jadi skenario dari kode di atas, terdapat sebuah class X. Class tersebut mempunyai 2 buah fungsi (passValue untuk merepresentasikan pass by value, dan passReference untuk pass by reference). Kedua fungsi tersebut dimaksudkan untuk mengubah isi dari atribut yang dimiliki. Dan terlihat, bahwa hasil akhirnya sebagai berikut:

Pass By Reference

Terdapat perubahan nilai ketika dilakukan skenario pass by reference. Hal yang perlu diperhatikan di sini, pass by reference di Java hanya mungkin untuk dilakukan oleh pengiriman objek, dan tidak mungkin dilakukan jika menggunakan pengiriman menggunakan tipe data primitif.

Buat nambahin… gw kasih liat kalo yang namanya objek itu merupakan sebuah referensi. Hal ini yang bikin skenario di atas jadi kayak pass by reference, padahal yang diubah cuma nilai objeknya (yah…. kode di atas bisa didebat tentang pass2an itu). Jadi… gw punya skenario kode pembentukan objek dari class X yang ditulisin gini:

public class NewClass1 {
    public static void main(String[] args) {
        X x = new X(10,20);
        X y = new X(30,40);
        System.out.println("Nilai Awal");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

        //operasi penyamaan referensi
        x = y;

        System.out.println("\nNilai Setelah Operasi x = y");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+
    }
}

Hasilnya gini:

Hasil Perubahan x=y

Kalo kamu liat2, hasilnya wajar lah ya…. Kalo x = y, maka nilai x akan ngikutin nilai y. Juga kalau ada perubahan nilai y, maka nilai x otomatis akan berubah. Wajar! Tapi… coba dibalik… kalo seandainya ada skenario gini…

        x.u=1;
        x.v=2;

        System.out.println("\nNilai Setelah Operasi Perubahan x");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

Hasilnya bakal gini…

Nilai Perubahan X

Liat kan… kalau ada perubahan di x, ternyata nilai y juga berubah. Hal ini terjadi karena pas dilakukan operasi “x=y”, yang dilakukan si javanya, ga cuma sekedar ngubah nilai. Tapi juga penyamaan alamat. Kalo kamu masih ga percaya, coba ajah debug, lihat posisi penyimpanan masing-masing objek sebelum dan sesudah operasi “x=y”.

Begitulah… intinya, kamu bisa ngelakuin pass by reference dengan cara ngakses objek dari class terkait… dan hal yang sama gak akan kamu dapatkan dengan ngakses variabel dengan tipe data primitif biasa.

Walo penjelasannya belepotan, moga ngebantu yah… terutama buat si *******… eh, si Cantik… 😀

Menyimpan Objek Java ke dalam File

Minnaaaa~~~, akhirnya blog balita balik lagi. Sekarang, bakal dibahas caranya gimana buat nyimpan data dalam bentuk objek. Yap, emang kalo nyimpan data gampangnya pake database ajah. Tapi, dalam satu atau lain kesempatan, bisa ajah kita musti nyimpen bukan ke database, tapi bentuk lain. Kalo udah gini, cara paling gampang yaaa… pake penyimpanan file. Tapi, akses file sendiri biasanya yang disimpan adalah tulisan2.

Tulisan ini bisa aja dijadiin data tersendiri ke dalam file kalo ngegunain pake bahasa pemrograman Java. Tapi, pendekatan yang gw maksud gini… Pas kamu punya satu master data yang jumlahnya puluhan baris record, dan satu record-nya terdiri dari beberapa hal. Yaa.. contohnya aja kamu nyimpen data semua member JKT48 di aplikasi yang kamu bikin. Kali ajah, kan… Dan hal ini, gak bisa kamu simpan gitu aja dalam bentuk tulisan. Karena, kamu musti bikin parsing dari tulisan2 yang kamu simpan. Alternatif penyimpanan yang bisa kamu lakuin contohnya (paling gak yang kepikiran ma gw sekarang), yaitu nyimpen dalam format XML. Yap, kamu musti parsing lagi, tapi bentuknya kan dah standar. Jadi gampang… dan alternatif lainnya, merupakan hal yang bakal dibahas di postingan sekarang… yaitu nyimpen dalam bentuk objek.

Bahasa Java mengakomodir penyimpanan objek yang dibentuk ke dalam file. Untuk melakukan hal ini, kita butuh yang namanya package java.io. Bagian yang kita butuhkan nantinya yaitu “FileOutputStream” dan “ObjectOutputStream”. Dari namanya ajah dah jelas ya gunanya buat apa. Selain itu, yang kita butuhin juga, bentuk POJO dari class yang kita simpan objeknya. Gw agak gak yakin tentang POJO (yaaa, maaf2 ajah kalo gw salah ngejerumusin kamu semua ama info yang gak valid. Kalo ada yang musti diperbaikin tell2 yak), tapi intinya POJO itu kependekan dari “Plain Old Java Object”. Bentuk dari POJO itu standar… cuma satu class dengan atribut dan method set-get, ditambah meng-implements “Serializable” dari java.io.Serializable.

Okeh, kita langsung praktek yah… Pertama, bikin class POJO dari objek yang nantinya mau disimpen. Gw bikin class “Oshi”, dengan atribut nama, tim, plus tahun lahir. Konstruktornya mau ada ketiga-tiganya, trus override method toString jugak. Jadi, gw bikin 1 file java, dengan class diagram kayak gini:

Class Diagram Oshi

Class diagram di atas dibikin pake plugin EasyUML dari Netbeans, gak bikin sendiri. Jadi kalo dirasa gak sesuai ama UML yang kamu kenal, yaaa… silahkan disesuaikan ajah. Kode dari class diagram di atas ditulisin gini:

import java.io.Serializable;

/**
 *
 * @author arby
 */

public class Oshi implements Serializable{
    private String nama;
    private char tim;
    private int tahunLahir;

    public Oshi(String nama, char tim, int tahunLahir) {
        this.nama = nama;
        this.tim = tim;
        this.tahunLahir = tahunLahir;
    }

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }

    public char getTim() {
        return tim;
    }

    public void setTim(char tim) {
        this.tim = tim;
    }

    public int getTahunLahir() {
        return tahunLahir;
    }

    public void setTahunLahir(int tahunLahir) {
        this.tahunLahir = tahunLahir;
    }

    @Override
    public String toString() {
        return "Oshi{" + "nama=" + nama + ", tim=" + tim + ", tahunLahir=" + tahunLahir + '}';
    }
}

Terus, buat nyimpen objeknya ke file, gw bikin class baru Main.java

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 *
 * @author arby
 */
public class Main {
    public static void main(String[] args) {
        //bentuk 1 objek Oshi
        Oshi o = new Oshi("Melody", 'J', 1992);
        
        //menyimpan objek oshi "o"
        try {
            FileOutputStream fos = new FileOutputStream("file_oshi.dat");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(o);
            oos.close();
            System.out.println("Tersimpan");
        } catch (IOException ex) {
            System.out.println("Gagal. Error: "+ex);
        }
    }
}

Keliatan kan urutannya… pertama, tentukan file-nya pake FileOutputStream, abis itu simpan objek ke dalam file pake ObjectOutputStream. Kalo udah ditulis, jangan lupa ditutup pake “close”. Untuk tipe data (ekstensi file), itu juga bebas c… gak dipakein ekstensi pun sebenernya gak masalah. Nanti, bakal ada file_oshi.dat yang kebentuk sesuai path class yang kamu punya. Kalo gw, berhubung pake netbeans, kebentuknya di dalam project Netbeans-nya langsung. Hirarkisnya gini:

Selection_005

Kalo kamu liat isinya pake text editor, bakal keluarnya gini:

Selection_006

Dan… selesai lah sudah. Objek kamu berhasil tersimpan. Tapi, yang perlu kamu perhatiin… cara di atas, gak cuma bisa nyimpen 1 objek per file lhoh yah.. kalo kamu bikin 2 objek, anggaplah o1 sama o2, terus kamu tulisin syntax “oos.writeObject(o1);” juga “oos.writeObject(o2);”, yang kesimpen 2 objek itu. Cara ngebuktiinnya?! Hmm… cara ngebuktiinnya, kamu musti baca file tersebut. Bisa liat di file-nya langsung pake editor semacam notepad atau wordpad (soalnya kalo gedit/netbeans langsung dah gw coba, dan berakhir dengan kegagalan buat nampilin isinya)…

O iya, yang perlu kamu perhatiin jugak, tentang konsep penyimpanannya. Konsepnya nimpa lhoh yah… bukan nambah2 data baru kayak penambahan row baris di database. Nimpa… alias replace. Jadi, tiap kamu jalanin kode di atas, isinya bakal nimpa sesuai yang kamu tulisin. Bukan nambah data di baris paling bawahnya.

Kalo buat ngebaca file-nya di program java… uhmmm… postingan berikutnya aja yak… Gw lagi males nulisin. Ditunggu ajah… 😀 Ja naaa… moga ngebantu yak…

Sumber: how-to-write-an-object-to-file-in-java/
Valid: Yap!
Kadaluarsa: Sampe method terkait dinyatain deprecated.

Pertanyaannya adalah: Mengapa…

Jadi yah… gw baru ngebuka koleksi drama korea gw yang dah gw donlot berbulan2 lalu… dan sekarang, lagi nonton drama “Blade Man”. Well, sebenernya ceritanya bikin gw enek. Tokoh antagonisnya keterlaluan banget soalnya… Akting mereka terlalu bagus, jadi bikin gw pengen mecahin layar monitor pas nge-shoot mereka. Paling gak itu menurut gw c yah.. tapi tetep ajah gw tonton. Masi ada komedi2nya dikit soalnya 😛

Tapiiii…. bukan cerita tuh drama yang mau gw bahas di mari. Gw lebih pengen nyeritain satu scene dengan potongan gambar kayak gini:

vlcsnap-2015-05-10-20h35m13s55

vlcsnap-2015-05-10-20h35m23s190

vlcsnap-2015-05-10-20h35m44s148

vlcsnap-2015-05-10-20h36m41s192

Scene di atas, ngingetin gw tentang masa sekolah gw… plus.. pembicaraan gw ma teteh yang menghasilkan tulisan di post sebelumnya. Oke, gw ceritain runut yak.. Jadi gini, dulu, gw punya guru les privat. Karena satu dan lain hal, mulai awal kelas 9 sampai akhir kelas 10, gw gak boleh lagi ngeles di lembaga bimbel ama Nyokap… tapi diajarin private ama sodara jauhnya tetangga. Beliau mahasiswi universitas berbasis pendidikan dengan major Kimia.

Yang paling keren dari beliau yaitu… passionnya… passion yang Kak Wid miliki untuk bidang keilmuan yang beliau ajarkan (o iya… namanya c Resi, tapi kita manggilnya Kak Wid). Walau majornya Kimia, tapi pas kelas 9 (3 SMP), gw diajarinnya Matematika ma Fisika. Kimia lum diajarin waktu itu di SMP. Dan… Matematika ma Fisika, kita gak cuma diajarin teori sama nyelesaiin masalah. Tapi juga cara belajar kedua mata pelajaran itu. Sebuah ilmu memiliki alasan untuk dipelajari, dan bagaimana ilmu tersebut dapat menyelesaikan masalah tersebut. Mungkin ini agak2 gak penting… plus, yang diajarin beliau bisa jadi agak2 melenceng… tapi metode yang beliau sampaikan semuanya masuk akal. Dan kita jadi tau cara untuk belajar. Bahkan, gak cuma terbatas di 2 mata pelajaran itu… tapi juga mata pelajaran lain kayak Bahasa atau Bahasa Inggris.

Oke, jadi kenapa gw kepikiran sama guru privat gw pas liat scene dari drama korea di atas?! Yaa… karena cara ngajar guru privat gw selalu diselingi penjelasan dari pertanyaan “kenapa”, “mengapa”, dan “bagaimana” yang bisa diajukan ketika menyelesaikan suatu soal, termasuk dalam memahami teori. Termasuk pas waktu gw ngerjain pembagian pecahan.

Sebagai anak yang kreatifitasnya enam koma (ini hasil pas class placement test di SMA), gw gak pernah kayak anak kecil di atas. Gw gak mempertanyakan ke guru gw kenapa bisa sebuah permasalahan dipecahkan dengan cara yang beliau ajarkan. Plus, gw juga gak pernah mempertanyakan cara mereka menilai gw. Anak baik2 lhah gw. Walo faktanya… kalo ama temen sendiri, gw bandelnya minta ampun. Di sinilah peran Kak Wid (guru privat gw tadi), berusaha untuk menurunkan passion yang beliau miliki ke gw (plus teteh gw). Jadi, beliau menjelaskan hal2 yang gak gw tanyain, tapi sepatutnya gw tanyain.

Contohnya ajah… pas waktu gw ngerjain satu soal yang butuh teori pembagian pecahan. Gw c gak nanya… tapi Kak Wid yang langsung nanya ke gw…

“Tau gak, Dek… kenapa harus dikali dengan cara dibalik?”

Karena gw gak tau… yaaa gw cuma jelasin, itu cara yang gw lakuin pas diajarin di kelas 5 dulu. Kalo udah gitu, gw dijelasin lah ama sang guru les asal datangnya. Dan gw… cuma manggut2. Awalnya c berasa gak meaning… tapi lama2, gw jadi paham bahwa satu materi emang terkait dengan materi lain. Dan… setiap materi memiliki definisinya masing-masing. Dari definisi tersebutlah sebaiknya kita memahami materi. Trus lama2… yaaa… gw jadi sukak ama mata pelajaran eksak. Walo yaaa… remedial di Fisika ama Matematika masih belum bisa gw hindari (tapi gw mau nyombong.. buat Kimia, gw kedua tertinggi satu sekolahan pas UAN, chuy! tampak passion Kimia beliau beneran diturunin ke gw).

Jadi begitulah… kadang yang kita butuhkan hanya pertanyaan “Mengapa”. Dan untuk orang2 tertentu, pertanyaan “Mengapa” memang tidak menjadi prioritas… Tapi bukan berarti hal itu tidak pantas ditanyakan. Karena, pencarian jawaban atas pertanyaan tersebut yang akan membuat kita memahami sesuatu.

Bukan cuma untuk hal2 eksak… tapi juga dalam kehidupan sehari-hari, seperti “Kenapa hobi banget ngumpulin batu akik”, “Kenapa gak mau masuk kerja hari ini”, “Kenapa ngerasa gak sukak ama bos sendiri”… Pertanyaan2 yang membutuhkan jawaban dalam bentuk alasan atau mungkin pembenaran… yang pada akhirnya membuat kita mencoba untuk mengerti, paling tidak untuk menumbuhkan rasa untuk memahami. Dan setelahnya… terdapat suatu aksi untuk mencoba menyelesaikannya dalam pertanyaan “Bagaimana”.

Begitulah… Karena pertanyaan yang pertama adalah… “Mengapa”.

Wisuda

Bulan ini senpai gw wisuda S2… dan gw lagi mikir… nanti pas wisudanya senpai… gw bakal datang buat ngasi bunga gak ya??

Bingung

Diambil dari redbubble.net

Yapp! This is a very big deal for me! Taun kemaren, senpai ngehadirin wisuda gw… Walo ngakunya c itu cuma kebetulan lewat. Tapi, yah… sama2 tau ajah sifatnya senpai gw gimana. Lagipula waktu gw wisuda, dilaksanainnya kan pas hari kerja…

Gw sendiri gak sukak ama event2 macam wisuda ataupun event penuh penghargaan lainnya. Bukannya kenapa2… tapi buat gw yang kompetitif dan paling mudah merasa iri ini, hal2 semacam itu cuma berdampak buruk dengan menghasilkan efek keterpurukan yang mendalam. Bahkan gw aja hampir gak ikut wisuda kalo Nyokap gak maksa gw buat daftar. Terlebih, ini wisudanya senpai. Pasti dia dapat banyak bunga dan penghargaan. Gw bakal ngerasa lebih gak berarti daripada yang seharusnya gw rasain.

Begitulah~~ masih bingung mau pergi atau enggak.

Mengakses Field Date pada Database Oracle

As always… ini tulisan rekues! Sebenernya udah lama c yah… dan orangnya yang ngerikues udah nerima jawabannya. Tinggal jawaban balik buat gw dibolehin apa enggak mosting yang dia tanyain di sini… Dan jawabannya, “terserah ajah”. Berhubung kemaren2 gw lagi di luar kota, nih tulisan baru jadi sekarang. 😀

Apapun prolog di atas, intinya si Aa’ nanya ke gw, gimana caranya kerja pake database Oracle, terus di database itu ada field yang tipe-nya Date. Kalo ajah dia nyari tutorialnya di stackoverflow, percayalah… itu jawaban bakal langsung nemu! Tapi, berhubung nih si Aa’ males ngeliat apapun, jadi dia tanya gw ajah. Katanya gw kan mantan asisten OOP. Hhhh… baiklah. (-_-)

Gimana caranya ngakses field itu? Gw tulisin jawabannya singkat ajah yak… Intinya, kalo insert, pake kuerinya gini:

String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,to_date(?,'DD-MM-YYYY','NLS_DATE_LANGUAGE = American'),?)";

Itu si Aa’ pake PreparedStatement, makanya ada tanda tanya gitu… intinya c pas masukin tanggal, bisa masukin pake format DD-MM-YYYY pas nulisinnya. Terus pas di ResultSet pake kode:

ps.setString(3,"27-05-2014");

Atau kalau kamu gak keberatan pake format “YYYY-DD-MM”, bisa pake java.sql.Date… caranya gini:

Date d = Date.valueOf("2014-11-15");
ps.setDate(3,d);

Yang paling penting dari hal di atas, kelas Date di sana diambil untuk class Date dari package java.sql… bukan java.util, yah. Si Aa’ berkali-kali gagal nyoba, gara2 dia ngira tipe Date di atas itu tipe Date dari java.util. Dan yang paling penting jugak buat kamu ketahui, kedua class ini walo namanya sama, mereka gak bisa di-casting gitu ajah. Boleh ajah kamu berhasil ngelakuin casting… tapi tolong kasi kodenya di kotak komentar yak. Gw jugak pengen tau… 😛

Teruuuuss… kalo kamu mau tau gimana caranya ngambil sysdate (tanggal dari system), kamu bisa pake bantuan dari class Date dari package java.util. Di sini, kamu bisa mengkolaborasikan kedua class Date itu. Caranya:

java.util.Date d1 = new java.util.Date();
Date d = new Date(d1.getTime());
ps.setDate(3,d);

Intinya, kamu bikin objek java.sql.Date dengan bantuan dari objek java.util.Date, tepatnya untuk memanggil method “getTime()”, yang bisa ngambil sysdate…

Dan…. trik terakhir, kalo kamu mau ngambil tipe Date dari ResultSet, dan kamu maunya nampilin pake format “dd-MM-YYYY”, ada class yang namanya “SimpleDateFormat”. Pake class itu, kamu bisa atur format tanggalnya. Caranya gini:

Date d = rs.getDate(3);
SimpleDateFormat sm = new SimpleDateFormat("dd-MM-YYYY");
System.out.println("Tanggal: "+sm.format(d));

Dan begitulah….

Kalau kamu mau tau penggalan kode di atas sebenernya lengkapnya tuh gimana… boleh disimak kode di bawah ini:

Untuk kelas Koneksi (KoneksiDB.java)… kelas ini buat ngecek JDBC ama ngembaliin objek class Connection. Kelas ini kebiasaan aja digunain pas kuliah dulu. Gak harus c, cuma ya itu… udah kebiasa… makanya adaan.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class KoneksiDB{
	private Connection conn;
	private final String DB_DRIVER="oracle.jdbc.driver.OracleDriver";
	private final String DB_URL="jdbc:oracle:thin:@localhost:1521/XE";
	private final String USERNAME="";
	private final String PASSWORD="";
	
	public void bukaKoneksi(){
		boolean flag = false;
		try{
			Class.forName(DB_DRIVER);
		}catch(ClassNotFoundException ex){
			System.out.println(ex.getMessage());
			flag = true;
		}
		if(!flag){
			try{
				conn = DriverManager.getConnection(DB_URL,USERNAME,PASSWORD);
			}catch(SQLException ex){
				System.out.println(ex.getMessage());
			}
		}
	}
	public Connection getConn(){
		return this.conn;
	}
}

Kelas Main yang digunain buat INSERT database:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,to_date(?,'DD-MM-YYYY','NLS_DATE_LANGUAGE = American'),?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG04");
			ps.setString(2,"Tisu Kering");
			ps.setString(3,"27-05-2014");
			ps.setInt(4,20);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

Kelas Main… contoh buat ngambil value dari string dengan format “YYYY-MM-DD”:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,?,?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG03");
			ps.setString(2,"Sabun Cuci");
			Date d = Date.valueOf("2014-11-15");
			ps.setDate(3,d);
			ps.setInt(4,100);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

Kelas Main yang dibikin buat ngambil sysdate:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,?,?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG03");
			ps.setString(2,"Sabun Cuci");
			java.util.Date d1 = new java.util.Date();
			Date d = new Date(d1.getTime());
        	ps.setDate(3,d);
			ps.setInt(4,100);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

dan terakhir…. kelas Main buat nampilin tanggal pake format “dd-MM-YYYY”:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		
		String kueri="SELECT * FROM pergudangan";
		ResultSet rs = null;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			rs = ps.executeQuery();
			while(rs.next()){
				System.out.println("ID Barang: "+rs.getString(1));
				System.out.println("Nama Barang: "+rs.getString(2));
				Date d = rs.getDate(3);
				System.out.println("Tanggal Masuk: "+rs.getString(3));
				SimpleDateFormat sm = new SimpleDateFormat("dd-MM-YYYY");
				
				System.out.println("Tanggal: "+sm.format(d));
				System.out.println("Stok: "+rs.getInt(4)+"\n");
			}
		}catch(SQLException ex){
			System.out.println(ex);
		}
		
	}
}

Begitulaaahhh~~ moga ngebantu yah, guyz….

Valid?: Banget.
Masa Kadaluarsa: Gak tau.
Sumber: stackoverflow, pribadi.

Membuat .jar File dari Kode Java

Jadi gini… lagi2 ada yang nanya… Kalo diliat polanya, pas mosting yang agak serius, itu pasti karena requirement dari seseorang. Entah itu temen, si Aa’, atau sapa lhah… Seolah gw gak bisa bikin sesuatu yang serius, kecuali berupa tanggapan. Huweeee….

Apapun itu, intinya ada yang nanya ke gw, gimana cara bikin file berekstensi jar dari codingan java yang udah dia bikin. Hmmm, gimana yah… Kalo gw biasanya nyuruh dia pake IDE, terus coding pake Netbeans, trus kalo dah selesai, klik kanan di project Netbeans-nya, pilih “Build”. Ntar bakal ada folder “dist” kebentuk dalam folder project, dan itu bisa dijalanin gitu ajah, asal mesinnya keinstal JRE. Tapi, requirement-nya dia lagi gak make Netbeans dan emang cuma pake editor sederhana, yang gak bisa generate IDE-nya langsung.

Okeh… permintaan di atas, mirip2 sama tugas kuliah… Tapi baiklah, berhubung gw baik… jadi gw jelasin aja di mari. Buat yang gak tau apa itu file berekstensi jar, gw jugak bakal jelasin di mari. Ekstensi jar merupakan file java archive. Jadi kayak kamu ngegabungin beberapa file menjadi sebuah file lain. Pernah nge-compress beberapa file jadi 1 file zip/rar? Kalo pernah, yaaa yang kamu lakuin mirip2 ama compress itu. Bedanya, file jar ini bukan berfungsi buat nge-compress, tapi buat ngegabungin semua file class (hasil compile file java) yang udah kamu buat supaya bisa jalan dan jadi sistem yang utuh, walau kesebar di beberapa file codingan. Intinya, file .jar itu merupakan executable file yang terdiri dari satu atau beberapa file yang kamu gunakan untuk membuat sebuah aplikasi berbasis java.

Cara gampang untuk meng-generate file jar yaitu dengan menggunakan editor IDE kayak Eclipse atau Netbeans. Caranya kayak yang udah gw jelasin di atas. Ada cara gampang, ada juga cara native pastinya… Cara native ini kemungkinan yang dilakukan banyak programmer sebelum IDE diciptakan oleh mereka. Cara native-nya pake command “jar” di terminal/console/command prompt. Berhubung sekarang lagi ngetik di komputer berbasis  Windows, jadi gw praktekkin di windows, yak. Yang linux sama ajah… gak ada beda.

Sebelumnya, gw bakal ngasi tau kalo command jar punya beberapa opsi, diantaranya c, m, f, x, t dll. Penjelasannya gini:

  1. c: buat “create” file jar
  2. m: buat memodifikasi file MANIFEST.MF yang ada di folder META-INF
  3. f: untuk merujuk ke sebuah file yang diberikan, jadi keluarannya bukan stdout gitu
  4. x: buat nge”eXtract” file jar
  5. t: buat melihat isi dari file jar yang dimaksud

Contoh? Oke.. gini, pertama, bikin dulu file java yang ada “public static void main(String args[])”-nya biar bisa di-running.

public class Main{
	public static void main(String args[]){
		System.out.println("Hello World");
	}
}

Kompile dan run file java itu…

1. Eksekusi dan Jalankan

Yang perlu kamu ketahui, setiap kamu nge-running java, sebenernya yang kamu jalanin adalah file .class-nya, dan bukan file java-nya. Jadi, dalam jar, kamu cukup masukin file .class yang kamu butuhin… gak usah semuanya jugak. Tapi kalo kamu mau masukin semuanya, juga gak masalah. Kamu tinggal pake command “*” ajah… Gak usah pilih2…

Jadi… langkah selanjutnya, kamu masukin file Main.class ke dalam sebuah file jar, pake command jar

2. Bentuk Jar

Command itu gak usah gw jelasin yah maksud “cf”-nya. Kan udah di atas… Kalo hai.jar, itu nama file jar yang kamu mau, dan setelahnya ada Main.class… itu file class yang mau dimasukin ke file jar-nya. File jar ini, seharusnya udah bisa kamu jalanin… tapi biasanya, yang terjadi c belum bisa dijalanin. Cobain deh gini:

3. Jalankan Jar

Bilangnya, belum ada “main” di manifest sebagai atribut. Mungkin kamu bingung, dan gw lebih bingung lagi ngejelasinnya. Tapi intinya, pas kamu bikin file jar tersebut, ada file MANIFEST.MF dari folder META-INF yang di-generate secara default oleh sistemnya, karena file ini emang dibutuhin sama si file jar-nya. Bentuk default-nya kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)

Isi dari file MANIFEST.MF itu belum lengkap, karena kita gak specified class yang punya “public static void main(String args[])” tuh yang mana. Makanya error-nya gitu. Uhhmmm… nangkep kan maksud gw?! Okeh, nangkep atau enggak, gw bakal kasi tau solusinya. Kamu extract dulu file jar yang tadi pake command gini:

4. Jar Salah

Dan nanti, ada file tambahan di folder tempat kamu nge-ekstract file hai.jar.

5. Struktur File

Ada folder META-INF. Di dalamnya ada MANIFEST.MF. Ubah isi file MANIFEST.MF pake editor favorit kamu (bisa gedit/notepad++/notepad) jadi kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)
Main-Class: Main

Yang gw merahin merupakan nama Class yang bisa di-running (ada public static void main(String args[])). Kalo Class gw kan namanya Main.class, jadi gw bikinnya “Main”. Save, dan tutup editornya. Gak ditutup juga gak papa c. Terus, kamu bikin lagi file jar pake MANIFEST yang udah kamu ubah isinya tadi dan running. Caranya gini:

6. Bentuk Jar

Yang perlu kamu perhatiin, kamu harus nambahin satu karakter kosong sehabis kamu ngubah file MANIFEST.MF, jangan kayak gini:

7. Manifest Salah

Kenapa?! karena kalo gak, yaaa bakal jadi kayak gini kalo kamu running, hal ini lah yang bakal kamu temuin:

8. Jar Salah

Jadi bikinnya, paling gak ada karakter space kayak gini (space lhoh yah… whitespace juga gak ngaruh):

9. Manifest Benar

Dan buat kamu yang bertanya-tanya, kenapa ngejalaninnya pake “java -jar”, bukannya klik dua kali… kan executable?? Gak ada yang bisa gw jawab kecuali “yaaa.. karena tipe aplikasi yang dibikin itu sifatnya console-based”. Jadi jalaninnya tetap di console/terminal/command prompt/cmd. Kalo kamu bikin aplikasi GUI, ntar juga bisa dijalanin pake klik 2x. Dan begitulaaahhhh…. Pertanyaan dan saran, boleh langsung di kotak komentar, yak…

PS: kalo ada yang nanya, buat library eksternal kayak JDBC kalo mau di-running, daftarinnya gimana… Jawabannya gini: “tinggal kamu tambahin atribut Class-Path di file MANIFEST.MF”. Contohnya gini:

10. Manifest dengan Path

Dan struktur folder-nya gini:

11. Bentuk Jar

Kalo library lain ada lagi yang mau ditambahin, tinggal dikasi spasi ajah kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)
Main-Class: Main
Class-Path: lib1.jar lib2.jar lib3.jar

PPS: Kalo ada yang nanya lagi, “itu… file MANIFEST.MF sebenernya buat apa dan harus kayak di atas bikinnya? Generate dulu, extract, baru pake yang ada?” sebenernya enggak. Jawabannya: “gw gak tau yah buat apa sebenernya, tapi kayaknya buat spesifikasi pas nge-running java…kan ada atribut Main-Class gitu, terus kalo harus gitu bikinnya… enggak c yah. Kamu bisa bikin sendiri file MANIFEST.MF itu pake editor biasa, asalkan encoding-nya pake UTF-8”. Contohnya, gini.. gw bikin sendiri MANIFEST.MF kayak di atas, terus gw generate lagi kayak gini:

12. Akhir

Dan selesai… Begitulah caranya.. Moga membantu…

Valid: Iyap!
Kadaluarsa: Gak tau
Sumber: situs oracle, stackoverflow.com sama dok pribadi

Set Classpath Library JDBC

Kemaren si Aa’ nanya ke gw tentang koneksi dari java ke oracle. Sebenernya inih gampang c yah. Tinggal pake IDE terus tambahin library, trus bikin class buat buka koneksi. Sayangnya rekuesan yang gw terima, gak boleh pake IDE. Gak tau apa maunya si Aa’, tapi ya sudahlah… Sebagai adek yang baek, gw kasih tau caranya. Dan ternyata, gw juga gagal!

Kesalahan yang gw lakukan adalah, gw gak tau caranya nge-set classpath jdbc di library java. Dan kalo udah berhasil nge-set classpath, nanti juga berhasil.

Sebenernya ada beberapa cara yang gw lakukan terkait hal ini… yaitu:

1. Download jdbc di situs oracle.

Downloadnya di situs ini. Sebenernya, kalo windows, ini bisa diambil langsung… di tempat instal oracle, terus ke direktori tertentu. Anggap kamu nginstall oracle 11g rilis 2 di drive D:, alamat library-nya ada di D:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib. Di folder tersebut, ada 2 versi ojdbc. Satunya ojdbc6.jar, satunya lagi ojdbc6_g.jar. Sebenernya 2 itu sama ajah c, cuma ada bedanya… gw juga lupa apa. Masalah compile gitu? Entah apapun itu, gw pakenya yang gak pake huruf g. Kalo di linux, gw gak tau… Makanya gw download, bukan nyari di tempat nginstallnya.

2. Bikin class koneksi sebagai berikut:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
 
public class Koneksi{ 
   private final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; 
   private final String DB_URL="jdbc:oracle:thin:@//localhost:1521/XE"; 
   private final String USER ="uname"; 
   private final String PASSWORD="pwd"; 
   private Connection conn = null; 
   
   public void bukaKoneksi(){ 
       boolean flag = false; 
       try{ 
	  Class.forName(JDBC_DRIVER); 
       }catch(Exception e){ 
	  System.out.println("Error: "+e); 
          flag = true; 
       } 
       /*if(!flag){ 
	  try{ 
	     conn = DriverManager.getConnection(DB_URL,USER,PASSWORD); 
	  }catch(Exception e){ 
	     System.out.println(e.getMessage()); 
          } 
	  
       }*/ 
   } 
   public Connection getConn(){ 
	return conn; 
   } 
}

Standar kan yah?! Iya! Standar… Jadi gw coba compile, terus bikin class buat ngejalanin gini:

public class Main{ 
   public static void main(String args[]){ 
      Koneksi k = new Koneksi(); 
      k.bukaKoneksi(); 
   } 
}

Dan ternyata, yang gw dapetin adalah Error… ClassNotFoundException! Driver-nya gak kebaca, sodara2! Gw nyari2, kalo di windows, ternyata bisa copy-in di bagian lib\ext dari direktori penginstalan Java. Jadi kalo kamu punya java 64 bit di mesin kamu (Windows 7), kemungkinan letaknya di “C:\Program Files\Java\jdk1.7.0_55\jre\lib\ext“. Kalo udah gini, program kamu bakal berhasil dijalanin tanpa error. Tapi… sayangnya, ini gak berlaku di linux. Gw gak ngerti kenapa.

Walopun gitu, terlepas dari bisa atau gak, cara di atas sebaiknya gak kamu lakuin yah… Karena library dari compiler sebaiknya gak kamu tambahin apapun. Yang perlu dilakukan yaitu nambahin classpath dengan value berupa path direktori tempat peletakan library jdbc-nya (ojdbc6.jar yang tadi). Kalo di linux yang gw lakukan gini:

di terminal, ketikin:

sudo gedit ~/.bash_profile

dan kebuka sebuah file, tambahin baris gini

CLASSPATH=$CLASSPATH:/home/user/Documents/jdbc/ojdbc6.jar 
export CLASSPATH

Yang “/home/user/Documents/jdbc/ojdbc6.jar”, itu merupakan path tempat peletakan si library jdbc. Terus save, keluar deh… Kalo di windows, bisa pake:

set classpath=E:\JDBC\ojdbc6.jar;.

Jangan lupa buat nambahin titik koma sama titik di akhirnya, yah. Gw coba di komputer Aa’, dan kelupaan ngasi titik, jadinya gak bisaan gitu. Lebih jelasnya, kamu bisa liat di link video ini. Kalo dah ngatur kayak gitu, kamu bisa compile kode java kamu dengan nyaman… Kayak biasa ajah compile sama nge-run Nya.

PS: Pastiin classpath-nya bener pake command “echo $CLASSPATH”. Untuk nama variabel, sifatnya case sensitive lhoh yah.. Jadi jangan sampe salah.