Sabtu, 22 September 2012

Java Foundation Class

Java Foundation Class (JFC) merupakan sekumpulan class-class Java yang digunakan untuk mengembangkan perangkat lunak berbasis GUI (Graphical User Interface). Selain itu, JFC juga mempunyai class-class yang digunakan untuk menambahkan fungsi dan kemampuan interaksi yang variatif dari pemrograman Java. Dari definisi ini, JFC tidak hanya berisi class-class GUI saja tetapi juga class-class lain yang dapat meningkatkan kemampuan pemrograman Java baik dari segi fungsionalitasnya maupun dari segi kemampuan interaksi pemrograman Java yang sangat kaya.

Swing Package

Swing API sangat bagus dan lengkap, Java 6.0 menyertakan setidaknya tujuh belas (17) buah package yang berisi class-class swing yang siap digunakan.

 

Swing HelloWorld

Menggunakan contoh langsung adalah cara yang tepat untuk memulai proses belajar. Cara ini memberikan gambaran kongkrit tentang subject yang akan dipelajari, sehingga proses belajar lebih cepat diserap. Untuk tujuan ini, kita akan membuat sebuah program kecil yang menampilkan kata “HelloWorld” menggunakan komponen swing. Berikut ini adalah langkah-langkah yang harus anda lakukan untuk membuat program “HelloWorld” berbasis komponen swing:

1. Install Java Development Kit (JDK)
2. Membuat program HelloWorld itu sendiri
3. Melakukan kompilasi program HelloWorld
4. Menjalankan program HelloWorld

Install Java Development Kit
Yang perlu kita lakukan dalam langkah ini hanyalah mendownload JDK dari website java.sun.com. kemudian jalankan program instalasinya dan ikuti perintah-perintah dalam langkah-langkah instalasi tersebut. Setelah proses instalasi selesai, kita siap untuk membuat program Java.

Membuat Swing HelloWorld dengan Netbeans 6.1

Netbeans 6.1 dilengkapi dengan GUI builder yang dikenal dengan Matisse. Dalam modul ini selanjutnya, Matisse akan digunakan untuk menyebut Netbeans GUI Builder. Tools ini sangat powerful dan produktif dalam membuat komponen GUI. Langkah-langkah yang harus anda lakukan untuk membuat Swing HelloWorld dengan Matisse adalah sebagai berikut:

1. Buat project baru dalam Netbeans, caranya pilih menu :

File > New Project

2. Langkah berikutnya anda harus menentukan kategori project yang akan anda buat, caranya pilih :

General > Java Application

Anda akan dibawa ke dialog untuk menentukan nama project dan folder dimana anda meletakkan project tersebut, pilih folder sesuai keinginan anda.

Komponen Swing

Swing toolkit menyediakan banyak sekali komponen untuk membangun aplikasi GUI desktop. Swing toolkit juga menyediakan class-class untuk menangani interaksi antara aplikasi dan user menggunakan standard input seperti keyboard dan mouse.

Komponen-komponen yang disediakan swing mencakup semua GUI toolkit yang lazim digunakan dalam apilasi desktop, seperti : JTabel, JList, JTree, JButton, JLabel dan masih banyak komponenkomponen lainnya yang sudah teruji dan siap pakai.

Selain komponen GUI, swing juga menyediakan fasilitas untuk proses undo, komponen untuk mengolah text, internationalization, Komponen GUI yang mendukung penyandang cacat (accessibility support) dan fasilitas drag-and-drop.

Look and Feel merupakan fasilitas yang unik dalam swing. Dengan fasilitas Look and Feel ini kita bisa dengan mudah merubah tampilan dari program kita sesuai dengan keinginan dan tujuan kita. Misalnya, agar program terlihat fancy atau agar program terlihat konsisten dalam segala keadaan.

Struktur Komponen Swing

Secara arsitektur, Swing dibangun diatas arsitektur AWT (Abstract Windows Toolkit). AWT adalah GUI toolkit yang dikembangkan oleh Sun engineer sebelum swing muncul. Kelemahan utama AWT adalah fleksibilitas tampilan GUI, seperti painting method yang masih sangat primitif.

Swing dimaksudkan untuk memperbaiki kekurangan dari AWT tanpa harus membuang teknologi yang sudah dibuat dan membuat GUI toolkit baru dari nol.

Komponen AWT diletakkan dalam satu package yaitu java.awt, didalamnya terdapat komponen-komponen GUI dasar, salah satunya adalah Component. Class Component adalah moyang dari sebagian besar komponen AWT maupun Swing. CheckBox, Label, Button dan beberapa komponen AWT lainnya adalah turunan langsung dari class Component. Namun dalam kenyataanya arsitektur demikian tidak memberikan fleksibilitas yang cukup memadai untuk membuat berbagai macam komponen baru yang dibutuhkan dalam desktop application.

Swing muncul dengan membawa teknologi AWT yang telah ditambahkan dengan banyak kemampuan. Nyaris semua komponen GUI dari swing merupakan turunan class Container dan class Container adalah turunan dari class Component.

Bekerja dengan JLabel, JTextField dan JButton

Bekerja dengan komponen swing menggunakan Matisse sangat menyenangkan dan mudah. GroupLayout yang sangat fleksibel memungkinkan kita untuk membuat aplikasi dengan tampilan seperti yang kita harapkan.

Label, textfield dan tombol adalah komponen-komponen dasar yang selalu ada dalam setiap aplikasi berbasis desktop. Ketiga komponen ini mempunyai fungsi yang sangat sederhana, textfield menyimpan data berbentuk text (string) yang relatif pendek , label banyak digunakan untuk memberikan keterangan penjelas terhadap komponen lain dan tombol digunakan user untuk menjalankan satu instruksi tertentu.
Berikut ini adalah contoh aplikasi sederhana yang melakukan penjumlahan dua buah bilangan.

 
 Contoh program menggunakan JLabel, JTextField dan JButton Untuk membuat aplikasi ini menggunakan Matisse, lakukan langkah-langkah berikut ini:

Bekerja dengan JCheckBox dan JRadioButton

JCheckBox dan JRadioButton hanya bisa mempunyai dua buah kemungkinan nilai, benar atau salah. Kedua komponen ini digunakan untuk merepresentasikan data yang berupa pilihan.

JCheckBox digunakan jika pilihanya berupa multiple selection, sedangkan JRadioButton digunakan jika pilihanya berupa single selection.

JRadioButton digunakan misalnya untuk merepresentasikan pilihan jenis kelamin. JCheckBox digunakan misalnya untuk merepresentasikan pilihan hobby.

ButtonGroup diperlukan untuk mengumpulkan JRadioButton yang mempunyai grup pilihan yang sama. Misalnya grup pilihan jenis kelamin digunakan untuk mengumpulkan JRadioButton yang merepresentasikan pilihan laki-laki dan JRadioButton yang merepresentasikan pilihan perempuan dalam satu group. Jika JRadioButton tidak diletakkan dalam satu group, maka pilihan lakilaki dan pilihan perempuan bisa dipilih bersamaan.

Bekerja dengan JList dan JComboBox 

JComboBox memerlukan tempat yang minimalis dibandingkan dengan JRadioButton, selain itu JComboBox mempunyai bentuk ComboBox yang dapat diedit, sehingga memungkinkan user untuk memilih pilihan yang tidak ada dalam item JComboBox.

                                      Contoh JComboBox

JList memungkinkan multiple selection dengan menekan tombol : SHIFT + Left Click atau CTRL + Left Click. Kemampuan ini membantu user jika harus melakukan multiple selection.

Bekerja dengan Menu, Popup Menu dan Toolbar

Menu, Popup menu dan Toolbar digunakan untuk melakukan navigasi dalam aplikasi. dengan ketiga komponen itu navigasi dalam aplikasi menjadi lebih fleksibel dan mudah digunakan oleh user. Menu dan Toolbar pada umumnya diletakkan di bagian atas dari aplikasi agar mudah ditemukan oleh user. Sedangkan Popup Menu bisa muncul di mana saja sesuai dengan konteks aplikasi.

JMenuBar adalah class yang digunakan untuk menampung JMenu. JMenu dapat menampung satu atau lebih JMenuItem. JMenuItem merupakan bagian terluar dari struktur menu yang tidak bisa mempunyai child. JSeparatordigunakan untuk memisahkan antara satu menu item dan menu item yang lain. Jika didalam menu terdapat sub menu, gunakan JMenu untuk menampung sub menu tersebut. Selain JMenuItem, JMenu juga dapat menerima class JCheckBoxMenuItem dan JRadioButtonMenuItem.

JPopupMenu mempunyai banyak kesamaan dibandingkan dengan JMenuBar. Perbedaan utamanya adalah : JMenuBar hanya bisa berada di atas sebuah jendela JFrame. Sedangkan JPopupMenu bisa muncul di mana saja sesuai dengan konteks dari aplikasi.

Jumat, 21 September 2012

Membuat Dialog dan JFileChooser

Dialog memerankan peran yang penting dalam aplikasi berbasis desktop. Interaksi antara user dengan aplikasi terkadang tidak berjalan dengan baik karena user memberikan aksi yang tidak valid kepada aplikasi. Ketika hal tersebut terjadi, aplikasi harus memberitahukan kepada user apa yang telah terjadi dan bagaimana seharusnya user memperbaikinya. Model interaksi seperti ini tepat dilaksanakan menggunakan dialog.

Skenario lain adalah ketika aplikasi memerlukan input dari user agar aplikasi bisa terus melaksanakan tugasnya, misalnya meminta konfirmasi apakah user yakin akan melaksanakan sebuah aksi penting terhadap aplikasi seperti delete, update atau add data.

Dialog juga memberikan pembatasan kepada user, sebelum dialog selesai diproses, user tidak akan bisa berinteraksi dengan bagian aplikasi lainya. Dialog mencegah hal ini terjadi dengan memastikan bahwa jendela yang bisa diaktifkan hanyalah jendela dialog, sedangkan jendela aplikasi yang lain tidak dapat diaktifkan selama jendela dialog masih aktif.

Konsep MVC

 MVC adalah arsitektur aplikasi yang memisahkan kode-kode aplikasi dalam tiga lapisan, Model, View dan Control. MVC termasuk dalam arsitektural design pattern yang menghendaki organisasi kode yang terstruktur dan tidak bercampur aduk. Ketika aplikasi sudah sangat besar dan menangani struktur data yang
kompleks, harus ada pemisahan yang jelas antara domain model, komponen view dan kontroler yang mengatur penampilan model dalam view.

Arsitektur MVC ini memungkinkan adanya perubahan dalam domain model tanpa harus mengubah code untuk menampilkan domain model tersebut. Hal ini sangat bermanfaat ketika aplikasi mempunyai domain model dan view komponen sangat besar dan kompleks.

Model dalam Komponen Swing

Sebagaian besar komponen swing mempunyai model. JButton mempunyai model yaitu ButtonModel yang memegang 'state' dari JButton – apa keyboard mnemonicnya, apakah JButton tersebut sedang dipilih atau tidak dan seterusnya. Ada pula komponen swing yang mempunyai lebih dari satu model. JList mempunyai ListModel yang memegang isi dari JList dan ListSelectionModel untuk mencatat item JList yang sedang dipilih. 

Pada banyak kasus normal kita tidak perlu pusing memikirkan model ini. Semisal kita tidak perlu memikirkan model dari JButton karena pada kasus umum kita tidak perlu memodifikasi model dari JButton.

Lalu, kenapa model komponen swing dibuat? Alasan utamanya adalah fleksibilitas untuk menentukan bagaimana data disimpan dan diambil dari komponen swing. Misalnya kita mempunyai aplikasi spreadsheet yang menggunakan komponen JTable, karakteristik utama spreadsheet adalah banyak cell yang kosong, dengan begitu kita bisa memilih model data yang sesuai dengan karakteristik tersebut.

TableModel

TableModel adalah class model yang paling sering dikustomisasi. Karakteristik data dari JTable yang berbentuk koleksi data dua dimensi membutuhkan perhatian khusus agar efisien digunakan dalam aplikasi. Jika kita tidak hati-hati, maka aplikasi kita bisa menjadi sangat lambat dan tidak efisien.

TableModel adalah interface yang digunakan oleh JTable untuk mendefinisikan ciri-ciri dari data tabular yang akan ditampilkan oleh JTable. Misalnya : jumlah kolom, nama kolom, class dari object dalam kolom, jumlah baris dan nilai setiap cell. Dengan adanya data-data ini JTable dapat secara efisien menentukan bagaimana menampilkan data tersebut.

Berikut ini adalah kode untuk menampilkan koleksi object Person. Class ArrayList<Person> adalah implementasi dari generics, konsep dalam Java yang digunakan untuk mendefinisikan isi dari koleksi. ArrayList<Person> artinya adalah membuat sebuah object koleksi ArrayList yang harus diisi oleh object Person dan tidak bisa diisi oleh object lainya, misalnya String.

ListModel

JList adalah komponen swing yang mempunyai dua model sekaligus, ListModel dan ListSelectionModel. ListModel digunakan untuk mendefinisikan item/element yang dikandung oleh JList. Sedangkan ListSelectionModel digunakan untuk mendefinisikan bagaimana representasi data jika terjadi proses pemilihan di JList. Seperti halnya TableModel, ListModel mempunyai dua class yang mengimplement ListModel, AbstractListModel dan DefaultListModel. Kita bisa menggunakan salah satu dari tiga tipe

tersebut untuk membuat object ListModel. Cara pertama dengan membuat class baru yang mengimplement ListModel. Cara kedua dengan membuat class baru yang menextends AbstractListModel dan cara ketiga dengan langsung menggunakan DefaultListModel.
 
Struktur data JList tidak terlalu rumit seperti JTable, dan pada umumnya, cukup hanya dengan menggunakan DefaultListModel sudah memenuhi sebagaian besar kebutuhan penggunaan JList.

Menangani Event

Event dan Listener adalah implementasi dari pattern Observer dalam Java. Pattern Observer sangat berguna digunakan untuk mendesign komunikasi yang konsisten antara object yang berdiri sendiri dan object-object yang bergantung padanya.

Observer design pattern melibatkan dua object utama, object pertama berlaku sebgai Subject dan object lainya berlaku sebagai Observer. Object Subject merupakan pusat perhatian dari object Observer, perubahan keadaan dari object Subject selalu dipantau oleh Observer.

Observer dapat melakukan register-unregister terhadap Subject. Jika Observer tertarik dengan perilaku dan keadaan dari Subject, Observer dapat meregister dirinya kepada Subject. Begitu juga sebaliknya jika Observer tidak tertarik terhadap keadaan atau perilaku Subject, Observer tidak perlu melakukan resgistrasi atau kalau sudah terlanjur reguister dapat melakukan unregister.

Event Listener dalam Swing

Pattern Observer melibatkan dua object Subject dan Observer, dalam swing Observer dikenal sebagai Listener. Kemudian, ketika Subject akan memberitahu (notify) Observer tentang apa yang sedang terjadi dalam object Subject, ada satu informasi yang akan di-passing oleh Subject ke Observer, informasi ini disebut sebagai Event object. Sedangkan kejadian ketika Subject melakukan notify kepada Observer disebut sebagai Event triggering.

Agar penjelasan diatas mudah dipahami, kita akan membuat aplikasi sederhana yang mengimplementasikan pattern Observer. Aplikasi sederhana ini terdiri dari dua class utama yaitu Subject dan Observer.

Class Subject akan menjalankan sebuah loop tanpa batas, di dalam loop tersebut Subject akan meminta input dari user berupa sebuah kata yang diakhiri dengan penekanan enter. Ketika user menekan enter, Subject akan menotify Observer. Dalam proses notifikasi tersebut, Subject mengumpulkan informasi tentang event pemasukan kata oleh user, informasi tersebut berupa : kata apa yang dimaksukkan dan object subject dimana event pemasukan kata tersebut terjadi (source). Kemudian Observer akan menerima informasi dari Subject dan mencetak informasi tersebut ke standard output. Berikut ini tampilan dari aplikasi sederhana ini :

ActionListener

ActionListener digunakan untuk mendengarkan action dari event :

● Klik terhadap JButton
● Pemilihan menu item
● Penekanan tombol enter dalam JTextField

Method dalam ActionListener hanya satu yaitu actionPerformed yang menerima argumen object ActionEvent. ActionEvent berisi informasi-informasi penting ketika Action event terjadi, termasuk tombol modifiers apa yang sedang ditekan. Tombol modifiers antara lain : CTRL, ALT, META dan SHIFT. Method untuk menentukan tombol modifiers apa yang sedang aktif adalahgetModifiers. Method getActionCommand digunakan untuk mengambil command string yang didefinisikan oleh JButton.

Di bagian sebelumnya kita telah bekerja menggunakan komponen swing, dan sudah berlatih bagaimana menangani event klik mouse terhadap JButton. Mari kita lihat lagi aplikasi sederhana berikut :

KeyListener

KeyListener akan mendengarkan penekanan tombol oleh komponen yang berada dalam keadaan fokus. Semua komponen swing dapat menerima KeyListener sebagai Observer. KeyListener dapat mendengarkan tiga event berbeda : penekanan tombol, pelepasan tombol dan pengetikan tombol. Ketiganya ditangani oleh method yang berbeda-beda, yaitu :

● keyPressed : dipanggil ketika terjadi penekanan tombol
keyboard.
● keyReleased : dipanggil ketika tombol keyboard dilepaskan.
● keyTyped : dipanggil ketika tombol diketikkan, alias ditekan kemudian dilepaskan. Method ini dipanggil jika tombol yang ditekan mempunyai representasi karakter unicode, seperti tombol angka dan tombol huruf. Sedangkan penekanan tombol modifiers seperti ALT, CTRL, ARROW, CAPSLOCK, NUMLOCK, INS dan lainnya tidak akan mengakibatkan method ini dipanggil.

MouseListener dan MouseMotionListener

MouseListener mendengarkan interaksi mouse terhadap komponen swing. MouseListener dapat didaftarkan pada semua komponen swing. MouseListener mendengarkan event :

● mousePressed : event ini terjadi ketika user menekan salah satu tombol mouse diatas komponen swing.
● mouseReleased : setelah tombol ditekan, komponen swing akan menerima pelepasan tombol mouse. Tetapi jika tombol mouse dilepaskan pada saat pointer mouse tidak berada diatas komponen swing, maka event ini tidak akan terjadi.
● mouseClicked : event ini muncul ketika user melakukan click tombol mouse diatas komponen swing.
● mouseEntered : ketika mouse memasuki area diatas komponen swing, event ini akan dipicu.
● mouseExited : muncul ketika mouse akan meninggalkan area diatas komponen swing

Ketika user menekan tombol mouse (click), event mousePressed dibuat, kemudian mouseReleased dan akhirnya mouseClicked muncul terakhir.

Mengenal JDBC

Java Database Connectivity adalah API yang digunakan Java untuk melakukan koneksi dengan aplikasi lain atau dengan berbagai macam database. JDBC memungkinkan kita untuk membuat aplikasi Java yang melakukan tiga hal: konek ke sumber data, mengirimkan query dan statement ke database, menerima dan
mengolah resultset yang diperoleh dari database. JDBC mempunyai empat komponen :

1. JDBC API
JDBC API menyediakan metode akses yang sederhana ke sumber data relational (RDBMS) menggunakan pemrograman Java. dengan menggunakan JDBC API, kita bisa membuat program yang dapat mengeksekusi SQL, menerima hasil ResultSet, dan mengubah data dalam database. JDBC API juga mempunyai kemampuan untuk berinteraksi dengan lingkungan terdistribusi dari jenis sumber data yang berbeda-beda. JDBC API adalah bagian dari Java Platform yang disertakan dalam library JDK maupun JRE. JDBC API sekarang ini sudah mencapai versi 4.0 yang disertakan dalan JDK 6.0. JDBC API 4.0 dibagi dalam dua package yaitu : java.sql dan javax.sql.

Database Driver

JDBC memerlukan database driver untuk melakukan koneksi ke suatu sumber data. Database driver ini bersifat spesifik untuk setiap jenis sumber data. Database driver biasanya dibuat oleh pihak pembuat sumber datanya, namun tidak jarang juga komunitas atau pihak ketiga menyediakan database driver untuk sebuah sumber data tertentu.

Perlu dipahami sekali lagi bahwa database driver bersifat spesifik untuk setiap jenis sumber data. Misalnya, Database Driver MySql hanya bisa digunakan untuk melakukan koneksi ke database MySql dan begitu juga database driver untuk Postgre SQL juga hanya bisa digunakan untuk melakukan koneksi ke database Postgre SQL.

Database driver untuk setiap DBMS pada umumnya dapat didownload dari website pembuat DBMS tersebut.

Membuat Koneksi

Melakukan koneksi ke database melibatkan dua langkah: Meload driver dan membuat koneksi itu sendiri. Cara meload driver sangat mudah, pertama letakkan file jar database driver ke dalam classpath. Kemudian load driver dengan menambahkan kode berikut ini:

Class.forName(“com.mysql.jdbc.Driver”); 

Nama class database driver untuk setiap DBMS berbeda, anda bisa menemukan nama class tersebut dalam dokumentasi driver database yang anda gunakan. Dalam contoh ini, nama class database driver dari MySql adalah com.mysql.jdbc.Driver.
 
Memanggil method Class.forName secara otomatis membuat instance dari database driver, class DriverManager secara otomatis juga dipanggil untuk mengelola class database driver ini. Jadi anda tidak perlu menggunakan statement new untuk membuat instance dari class database driver tersebut. 

Mengambil dan Memanipulasi Data dari Database

Proses pengambilan data dari database memerlukan suatu class untuk menampung data yang berhasil diambil, class tersebut harus mengimplement interface ResultSet.

Object yang bertipe ResultSet dapat mempunyai level fungsionalitas yang berbeda, hal ini tergantung dari tipe dari result set. Level fungsionalitas dari setiap tipe result set dibedakan berdasarkan dua area:

● Dengan cara bagaimana result set itu dapat dimanipulasi
● Bagaimana result set itu menangani perubahan data yang dilakukan oleh proses lain secara bersamaan (concurrent).

JDBC menyediakan tiga tipe result set untuk tujuan berbeda:

Menggunakan PreparedStatement

Memanggil method executeUpdate berulang-ulang, misalnya melakukan insert ratusan atau ribuan baris, sangat tidak efisien.

Hal ini disebabkan karena DBMS harus memproses setiap query yang dikirimkan dalam beberapa langkah: memparsing query, mengcompile query dan kemudian baru mengeksekusi query tersebut.

PreparedStatement menawarkan solusi yang lebih baik dalam menangani keadaan tersebut. PreparedStatement menyaratkan query yang akan dieksekusi didefinisikan terlebih dahulu ketika PreparedStatement dibuat. Kemudian query tersebut dikirimkan ke dalam database untuk dicompile terlebih dahulu sebelum digunakan. Konsekuensinya, PreparedStatement bukan hanya mempunyai query, tetapi mempunyai query yang sudah dicompile. Ketika PreparedStatement dijalankan, DBMS tidak perlu melakukan kompilasi ulang terhadap query yang dijalankan PreparedStatement. Hal inilah yang menyebabkan PreparedStatement jauh lebih efisien dibandingkan menggunakan method Statement. executeUpdate.

Berikut ini contoh pembuatan PreparedStatement menggunakan class Connection yang telah dibuat sebelumnya :

Batch Execution

Misalnya kita ingin meng-insert seratus baris data dalam sebuah loop, kita bisa menggunakan fasilitas batc execution dari PreparedStatement. batch execution mengumpulkan semua eksekusi program yang akan dilaksanakan, setelah semuanya terkumpul batch execution kemudian mengirimkan kumpulan eksekusi program secara bersamaan ke DBMS dalam satu kesatuan. Metode ini sangat efisien karena mengurangi overhead yang diperlukan program untuk berkomunikasi dengan DBMS.
 
Dalam contoh di bawah ini kita akan menggunakan batch execution untuk melakukan insert data sebanyak seratus kali.

PreparedStatement pInsert = conn.prepareStatement(
"insert into Person(nama) values(?)");
for(int i=0;i<100;i++){
pInsert.setString(1,"user ke " + i);
pInsert.addBatch();
}
pInsert.executeBatch();

Menangani Transaction

Dukungan transaction oleh JDBC tergantung dengan Databasenya,karena ada database yang mendukung transaction dan ada pula database yang tidak mendukung transaction. MySQL mendukung transaction jika kita menggunakan InnoDB sebagai sistem tablenya, kalau kita menggunakan MyISAM maka transaction tidak didukung.

Transaction merupakan konsep penting dari database. Transaction memastikan perubahan data dilaksanakan dengan kaidah ACID (Atomicity, Consistency, Isolation, Durability). Kaidah ini memastikan semua proses perubahan data berjalan secara benar, jika ada yang salah maka semua perubahan dalam satu kesatuan logika harus dibatalkan (rollback).

Mari kita evaluasi kode diatas agar menggunakan transaction, sehingga jika satu proses insert gagal, maka semua insert yang dilaksanakan sebelumnya akan dibatalkan :

DAO dan Service Pattern

Akses terhadap database merupakan bagian yang sangat penting dari aplikasi database. Penggunaan pattern yang sesuai dapat memberikan manfaat sangat besar. Pattern yang sering digunakan dalam akses database adalah DAO (Data Access Object) dan Service/Facade pattern.

Kedua pattern ini digunakan untuk menerapkan “separation of concern” atau pemisahan kode proram berdasarkan fungsi kode program. Semua kode untuk akses data harus dipisahkan dengan kode untuk pengaturan user inteface. Hal ini memungkinkan kode akses data yang dibuat untuk aplikasi desktop, dengan mudahdigunakan untuk aplikasi web.

Penerapan konsep separation of concern secara disiplin, dapat menghasilkan kode program yang dapat dites secara otomatis menggunakan JUnit atau DBUnit. Unit testing merupakan paramater utama dalam menentukan apakah kode program yang kita hasilkan mempunyai mutu yang tinggi atau tidak. Coverage unit testing yang tinggi mencerminkan kode program yang berkualitas tinggi pula.

Java Persistence API (JPA)

Hampir semua aplikasi bisnis menggunakan database. Konsep database relasional sudah populer jauh sebelum konsep objectoriented digunakan orang. Oleh karena itu, apapun bahasa pemrograman yang kita gunakan, menggunakan database adalah suatu keniscayaan.

Dalam interaksi kita dengan database, ada beberapa masalah yang umum kita temukan, diantaranya

• perbedaan dialek SQL antar merek database
• perbedaan konsep relasional dan object-oriented
• peningkatan kinerja (performance)

Pada buku ini kita akan membahas tentang framework yang disebut Object/Relational Mapping (ORM). JPA termasuk framework dalam kategori ORM. Dengan kita menggunakan ORM, maka banyak masalah umum di atas yang dapat diselesaikan tanpa kita harus membuat solusi sendiri.

Mari kita elaborasi.

Persiapan

Instalasi
Seperti library Java lainnya, JPA tidak membutuhkan instalasi khusus. Cukup masukkan file *.jar yang dibutuhkan ke dalam CLASSPATH. NetBeans 6.1 sudah disertai dengan library implementasi JPA, yaitu toplink essensial. Kita tinggal menambahkan saja library toplink essential ke dalam project yang sudah kita buat.

Aplikasi Blog
Menjelaskan konsep saja terasa kurang menggigit apabila tidak disertai aplikasi. Dalam buku ini, kita akan membuat aplikasi blog, yaitu aplikasi untuk memuat tulisan atau artikel di website.

Fungsionalitas Aplikasi
Fitur dari aplikasi ini adalah:

Dasardasar ORM

Mapping Sederhana
Untuk contoh awal, kita akan melakukan mapping untuk class Category. Class ini hanya memiliki tiga properti saja, id, name, dan description. Berikut adalah kode Javanya.

public class Category {
private Integer id;
private String name;
private String description;
// getter dan setter
}

Class ini akan kita simpan di database. Berikut struktur tabelnya, ditulis dalam dialek MySQL.

Pemetaan Relasi

Selanjutnya, setelah kita dapat mengkonfigurasi dan melakukan test terhadap kerja JPA, sekarang kita bisa melangkah ke topik yang lebih bermanfaat, yaitu membuat mapping yang lebih beragam.

Pada bab ini, kita akan memetakan seluruh struktur database aplikasi blog kita. Berikut class-class yang akan terlibat:

• User : mencerminkan semua account yang dapat login ke aplikasi.
• Author : mencerminkan penulis yang mengarang artikel atau menulis berita. Satu author memiliki satu user, dan sebaliknya. Kita memisahkan class User dan Author, karena User berisi informasi tentang security, ijin akses, password, dan informasi keamanan lainnya. Sedangkan class Author menyimpan informasi berkaitan tentang informasi personal, seperti nama lengkap, tanggal lahir, dan sebagainya.
• Group : berisi banyak User, gunanya nanti untuk memudahkan pengaturan ijin akses.
• Category : mencerminkan kelompok artikel. Ada kategori berita, gosip, opini, dan sebagainya
• Article
• Comment : komentar atas artikel tertentu

Hubungan antar class tersebut dapat digambarkan sebagai berikut:

Pertimbangan dalam pemetaan

Seperti sudah disinggung sekilas dalam bagian sebelumnya, ada beberapa ketidak sesuaian (mismatch) antara desain objek dan desain database. Hubungan antar tabel di database jauh lebih sederhana daripada hubungan antar class di aplikasi berorientasi objek.

Dalam kaitannya dengan hubungan antar class, ada beberapa hal yang harus kita perhatikan, yaitu:

  • kasta class
  • navigasi
  • jenis collection
  • optionality
  • transitive persistence

Mari kita bahas satu persatu.

Enum Type

Kita mulai dari yang paling sederhana, yaitu tipe data enum. Dalam domain model kita, enum digunakan untuk menentukan ijin akses user. Mari kita lihat class User.

public class User {
private Integer id;
private String username;
private String password;
private UserLevel level;
}


Class User ini menggunakan fitur baru dalam Java 5, yaitu Typesafe Enum. Adapun enum UserLevel tidak sulit, kodenya seperti ini.

Value Type

Kita memiliki satu value type, yaitu List<String> emails pada class Author. Berikut pemetaannya.

public class Author {
@CollectionOfElements(targetElement = String.class)
@JoinTable(
name = "T_AUTHOR_EMAIL",
joinColumns = {@JoinColumn(name = "author_id")}
)
@Column(name = "email")
private Set<String> emails = new HashSet<String>();
}


Dengan informasi mapping di atas, tabel T_AUTHOR dan T_AUTHOR_EMAIL akan terlihat seperti ini.

One to One

One to One menghubungkan dua entity. Kita menggunakan hubungan ini untuk Author dan User. Yang perlu diperhatikan hanyalah class User, karena navigasinya cuma satu arah. Berikut class User.

public class User {
@OneToOne
@JoinColumn(name = "author_id", nullable = false)
private Author author;
}


Kita mengatur kolom foreign key author_id agar tidak boleh null. Ini berkaitan dengan masalah optionality  yang sudah dijelaskan di atas.

Many to One

Pada contoh aplikasi kita, mapping Many to One ada pada hubungan antara class Article dan Category. Navigasinya satu arah, dari Article ke Category. Dengan demikian, pada class Category, tidak ada property Article.

public class Category {
@Id @GeneratedValue
private Integer id;
private String name;
private String description;
}


Pada class Article, kita mendeklarasikan property Category, dengan mapping @ManyToOne sebagai berikut.

One to Many


List dengan order by

Kita memiliki beberapa kasus One To Many. Pertama, kita lihat dulu tipe collection List yang menggunakan sorting di sisi database melalui perintah order by.

Hubungan ini ada antara Author dan Article. Karena hubungannya dua arah (bidirectional), maka kita akan melihat mapping di kedua sisi class. Berikut gambar domain modelnya.



Di sisi Article, mapping Many-to-One Author sama dengan Category yang kita sudah buat sebelumnya.

Many to Many


Bila kita sudah menguasai pemetaan One-to-Many, maka Many-to- Many tidak sulit. Perbedaannya hanya terletak di anotasinya. Yang tadinya @OneToMany, diganti menjadi @ManyToMany. Sama dengan One-to-Many, kita harus menentukan sisi mana yang inverse. Pada contoh kali ini, sisi inverse terletak pada class User.

Berikut isi class User.

public class User {
@ManyToMany(mappedBy = "members")
private Set<Group> groups = new HashSet<Group>();
}

Berikut pemetaan di class Group.