29 Sep 2006
Programmer beraliran komersial tentunya sudah tidak asing dengan perlengkapan reporting seperti Crystal Report. Reporting tools ini berguna untuk membuat laporan dari sumber data yang sudah ada.
Cara kerjanya sederhana. Bagi yang belum pernah menggunakan aplikasi reporting dan ingin memahaminya secara sederhana, dapat menggunakan fasilitas mail merge yang dimiliki aplikasi office seperti Microsoft Word atau OpenOffice Writer.
Intinya, kita membuat satu template. Di dalam template tersebut kita isikan variabel-variabel yang kita ingin tampilkan. Pada saat dijalankan (runtime), variabel ini akan digantikan oleh template processor dengan data yang diambil dari sumber data eksternal.
Contoh umum penggunaan fasilitas mail merge adalah untuk mencetak label alamat pada undangan. Kita definisikan variabel yang akan tampil, misalnya:
Kemudian, kita sediakan file lain di spreadsheet (MS Excel atau OO Calc) yang memuat data tersebut. Data yang disimpan bisa saja ratusan atau ribuan. Untuk Open Office, database yang digunakan tidak hanya dari spreadsheet, tapi bisa juga dari database betulan seperti MySQL atau Oracle.
Setelah template dan data siap, aplikasi dijalankan untuk melakukan merge. Hasilnya adalah ratusan label yang sudah terisi dengan data dari database.
Logika yang sama digunakan oleh perlengkapan reporting seperti Crystal Report dan kompetitor lainnya. Biasanya template dibuat dalam format XML. Selanjutnya, prosesnya sama. Desain templatenya, kemudian siapkan datanya.
Saya tidak akan membahas Crystal Report di sini. Kita akan membahas aplikasi reporting yang gratis, yaitu Eclipse BIRT. Sebagai bagian dari Eclipse, aplikasi ini gratis dan berkualitas tinggi.
Fitur BIRT juga tidak kalah dengan aplikasi reporting lain, diantaranya adalah:
- Berbagai pilihan datasource; RDBMS, XML, Text File, dan lain-lain. Lain-lain maksudnya di sini adalah sumber lain yang dapat diakses melalui scripting language BIRT.
- Berbagai pilihan output; PDF, XLS, CSV, HTML, XML adalah format yang didukung. Untuk format lain, asalkan berbasis text, bisa menggunakan output XML yang kemudian diproses lagi menggunakan XSLT.
- Berbagai pilihan integrasi. BIRT dapat dijalankan sebagai standalone report server, atau juga diembed (digabungkan) dengan aplikasi kita. Bila dijalankan sebagai standalone server, BIRT dapat berkomunikasi dengan aplikasi dengan bahasa pemrograman yang berbeda, misalnya PHP, Ruby, .Net, atau yang lainnya.
- Visual Designer. Eclipse sudah melengkapi BIRT dengan database explorer, drag-and-drop query builder, dan fitur canggih lainnya. Kita akan lihat fitur ini dalam screenshot di bawah.
- Integrated dengan IDE. Bila kita menggunakan Java, kita bisa coding di Eclipse, dan membuat report di Eclipse juga. Jadi tidak perlu menggunakan beberapa tools yang berbeda.
Baiklah, mari kita coba saja.
Pertama, kita harus donlod dulu dari homepagenya. Ukurannya relatif besar, sekitar 200 MB. Tapi jangan khawatir, ada mirrornya di server Universitas Indonesia. Kalau kita sudah punya Eclipse terbaru, bisa langsung gunakan fitur updatenya. Jalankan downloadnya sebelum pulang kantor. Dengan demikian, besok pagi ketika kita datang, BIRT sudah terinstal.
Setelah terinstal, kita bisa langsung menggunakannya. BIRT terinstal lengkap bersama contoh database. Tutorial cara penggunaannya juga cukup jelas dan lengkap. Sayangnya tidak ada screenshotnya. Jangan khawatir, pada artikel ini, saya akan sediakan screenshotnya.
Berikut adalah tampilan Eclipse pada saat sudah dijalankan.

Selanjutnya, kita langsung membuat project baru. Klik File > New, kemudian pilih Report Project

Beri nama projectnya. Kemudian klik Next. Eclipse akan menanyakan apakah kita ingin bekerja dalam Report Perspective. Jawab saja Yes.
Report perspective tampil seperti screenshot berikut

Perhatikan di sebelah kiri ada tiga tab : Pallete, Data Explorer, dan Library. Kita akan gunakan tab ini untuk mendesain report.
Kemudian, mari kita buat report pertama kita. Datasource yang akan digunakan sudah disediakan Eclipse sebagai database sample. Sesuai tutorial Eclipse, kita akan membuat laporan yang berisi daftar nama pelanggan, dikelompokkan berdasarkan provinsi (State) dan kota (City).
Untuk membuat report baru, klik File > New > Report. Kalau pilihan Report belum ada, pilih Others dan cari di daftar yang tersedia, dalam kategori Business Intelligence and Reporting Tools.

Beri nama reportnya

Kemudian pilih templatenya. Supaya lebih seru, kita akan gunakan Blank Template

Selanjutnya, template report kita tampil di layar dalam Design View. Kita dapat berganti ke berbagai view melalui tab di bawah editor report.
Setelah report tampil, kita dapat menambahkan label. Tambahkan saja satu label untuk judul, yaitu Laporan Data Pelanggan. Jenis huruf, rata tengah, dan setting lainnya dapat dilakukan melalui toolbar yang ada di bagian bawah.

Sebelum melangkah lebih jauh, kita perlu mendefinisikan Data Source untuk report ini. Buat Data Source baru melalui panel sebelah kiri.

Pilihan datasource akan muncul. Kita akan menggunakan database sample yang sudah ada. Untuk project betulan, kita dapat gunakan database atau sumber data yang lainnya.

Beri nama Sample di kolom Data Source Name, kemudian klik Finish.
Dari datasource yang ada, kita dapat mendefinsikan Data Set. Data Set ini adalah sebagian dari isi Data Source yang akan kita gunakan dalam report.

Muncul pilihan datasource dan jenis data set. Kita bisa menggunakan lebih dari satu datasource dalam satu report. Untuk kali ini, cuma ada satu data source. Pilih tipe data set SQL Select Query. Jangan lupa beri nama yang deskriptif untuk dataset yang dibuat.

Setelah kita tekan Next, akan muncul database explorer di panel kiri, dan SQL editor di kanan. Kita dapat melakukan drag and drop pada layar ini.

Edit SQL menjadi seperti ini:
Kemudian drag-and-drop tabel Customer ke sebelah kanan from, sehingga kodenya menjadi seperti ini:
select *
from CLASSICMODELS.CUSTOMERS
Klik Next. Selanjutnya muncul Data Set Editor.

Kita tidak melakukan perubahan apa-apa di sini. Tapi bila ingin tahu apa isi tabelnya, kita dapat melihat Preview Result seperti ini:

Klik OK. Dataset siap digunakan.
Selanjutnya, kita akan tampilkan data pelanggan dalam bentuk tabel. Pilih Table di Pallete, dan letakkan di report. Kita akan tampilkan 4 kolom dan 1 baris detail. Kolom yang nantinya akan ditampilkan adalah:
- Provinsi
- Kota
- Nama Pelanggan
- Nomer Telepon
Tampilan yang dihasilkan adalah seperti ini:

Dari seluruh data pelanggan yang ada, kita akan kelompokkan berdasarkan provinsi, kemudian kota. Untuk itu, kita tambahkan Group di tabel. Caranya, klik tombol pemilih tabel, kemudian klik kanan di baris detail.

Group Editor akan muncul. Beri nama State, kemudian klik OK.

Hasilnya akan tampak seperti ini

Untuk mengisikan State ke Group Row tersebut, drag-and-drop dari panel kiri ke kolom paling kiri di baris Group Header Row. Layar Select Data Binding akan muncul, langsung saja klik OK.

Kita perlu memasukkan Group Row satu lagi untuk City. Caranya sama, yaitu dengan menambahkan Group Row di bawah Group Header State.

Beri nama City, kemudian klik OK. Lalu pilih field city dari Data Explorer di sebelah kiri, dan pasang di kolom kedua di Group Header Row 2. Hasilnya seperti ini:

Terakhir, masukkan field CUSTOMERNAME dan PHONE ke Detail Row. Kolom judul CUSTOMERNAME kurang enak dibaca, jadi kita bisa ganti labelnya di baris paling atas menjadi Customer Name. Hasil akhirnya adalah seperti ini:

Report kita sudah selesai. Silahkan disave, kemudian lihat previewnya. Kalau semua dilakukan dengan benar, kita akan melihat tampilan seperti ini:

Kita akan lihat bahwa data pelanggan sudah diurutkan dan dikelompokkan berdasarkan State dan City.
Kalau kita tekan menu File, kita akan menemui pilihan View Report in Web Viewer, as HTML, dan as PDF. Silahkan gunakan sesuai kebutuhan.

Selamat mencoba.
28 Sep 2006
JFreeChart adalah library untuk menghasilkan chart dengan Java. Berbagai chart bisa dihasilkan, dari Pie Chart, Bar Chart, dan sebagainya.
Pada artikel ini, kita akan mencoba membuat Gantt Chart. Gantt chart adalah diagram yang menunjukkan rangkaian task, tanggal mulai, selesai, dan persentase kemajuannya. Bagi mereka yang pernah menggunakan aplikasi manajemen proyek pasti tau apa itu Gantt Chart.
Berikut output yang kita inginkan

Diagram di atas dihasilkan dari sumber data sebagai berikut
Aktivas |
Tanggal Mulai |
Tanggal Selesai |
Persentase Selesai |
UML Design |
01-01-2006 |
03-01-2006 |
100 % |
Coding |
02-01-2006 |
03-01-2006 |
75 % |
Testing |
03-01-2006 |
14-01-2006 |
50 % |
Integrate |
04-01-2006 |
25-01-2006 |
25 % |
Untuk mengubah data tersebut menjadi chart, berikut langkah-langkah dan kode yang digunakan.
Pertama, kita harus buat data tersebut menjadi Task object.
Task design = new Task("UML Design", toDate("01-01-2006"), toDate("03-01-2006"));
Task coding = new Task("Coding", toDate("02-01-2006"), toDate("03-01-2006"));
Task test = new Task("Testing", toDate("03-01-2006"), toDate("14-01-2006"));
Task commit = new Task("Integrate", toDate("04-01-2006"), toDate("25-01-2006"));
Untuk memudahkan konversi tanggal, saya buat method seperti ini
private static Date toDate(String date) throws ParseException {
return formatter.parse(date);
}
kemudian, kita set persentase kemajuan task.
design.setPercentComplete(1);
coding.setPercentComplete(0.75);
test.setPercentComplete(0.50);
commit.setPercentComplete(0.25);
Task dapat dikelompokkan menjadi TaskSeries.
TaskSeries codingTasks = new TaskSeries("Coding Activities");
codingTasks.add(design);
codingTasks.add(coding);
codingTasks.add(test);
codingTasks.add(commit);
Dan kumpulan TaskSeries disebut TaskCollection
TaskSeriesCollection allTasks = new TaskSeriesCollection();
allTasks.add(codingTasks);
TaskCollection ini digunakan untuk membuat chart.
JFreeChart chart = ChartFactory.createGanttChart("Coba Gantt Chart", "Task", "Tanggal", allTasks, false, false, false);
Terakhir, kita gambar chart menjadi file PNG
ChartUtilities.saveChartAsPNG(new File("output/gantt.png"), chart, 400, 300);
Selain menjadi PNG, kita juga bisa menghasilkan file JPEG
ChartUtilities.saveChartAsJPEG(new File("output/gantt.jpg"), chart, 400, 300);
Demikianlah cara membuat chart dengan JFreeChart. Selain Gantt chart masih banyak lagi fitur JFreeChart yang bagus. Silahkan download dan coba
27 Sep 2006
Menggunakan izPack
Setelah kita selesai membuat aplikasi, what next? Tentunya mendistribusikan pada orang yang membutuhkan. Bagaimana caranya agar aplikasi kita mudah digunakan? Langkah pertama adalah dengan cara memudahkan proses instalasi.
Dalam tulisan ini, kita akan mempelajari cara menggunakan izPack, framework untuk membuat installer aplikasi, sehingga menginstal aplikasi akan semudah menekan tombol Next.
Para programmer tentunya sudah familiar dengan berbagai framework installer. Ada yang komersil seperti InstallShield, dan ada juga yang gratis seperti NSIS dan izPack. Kelebihan izPack adalah dia berbasis Java, tidak seperti NSIS yang cuma bisa jalan di Windows.
Langkah pertama, mari kita download izPack. IzPack disediakan sebagai installer, sehingga kita harus menginstalnya dulu sebelum bisa digunakan.
Selanjutnya, mari kita lihat struktur folder project kita yang ingin dibuatkan installernya. Struktur folder saya seperti ini:

Setelah terinstal di komputer pengguna, saya ingin foldernya seperti ini:

Perhatikan bahwa folder src tidak perlu diikutkan. Pengguna dapat memilih apakah mau menginstal source code atau tidak. Jadi, folder source code adalah optional. Folder dokumentasi dan plugin tambahan juga biasanya diinstal secara optional.
Berikutnya, tentukan screen yang akan tampil selama proses instalasi, biasanya adalah :
- Salam pembukaan, menyatakan kepada pengguna bahwa proses instalasi akan dimulai.
- Informasi aplikasi, menjelaskan tentang aplikasi dan kegunaannya.
- License Agreement
- Pemilihan paket yang akan diinstal. Di sini pengguna dapat memilih apakah dia akan menginstal paket optional atau tidak.
- Tujuan instalasi. Pengguna menentukan di folder mana dia akan menginstal.
- Proses instalasi. Menunjukkan kemajuan proses instalasi. Biasanya menggunakan progress bar.
- Instalasi selesai. Menampilkan pesan sukses atau gagal.
Kerangka dari konfigurasi installer kita adalah sebagai berikut :
<installation version="1.0">
<info> </info>
<guiprefs> </guiprefs>
<locale> </locale>
<resources> </resources>
<panels> </panels>
<packs> </packs>
</installation>
Isi dari tag info adalah sebagai berikut
<info>
<appname>PlayBilling</appname>
<appversion>1.1-RC3</appversion>
<authors>
<author name="Endy Muhardin" email="endy@artivisi.com"/>
<author name="Anton Raharja" email="anton@ngoprek.org"/>
</authors>
<url>http://playbilling.sourceforge.net</url>
<javaversion>1.5.0</javaversion>
</info>
Bagian guiprefs menjelaskan tampilan yang akan digunakan. Kita akan pakai native saja, sesuai OS, supaya tampak alami. Kalau mau, kita dapat memilih beberapa tampilan Look & Feel yang tersedia.
<guiprefs width="800" height="600" resizable="yes"/>
Berikutnya, pilihan bahasa instalasi. Untuk mudahnya, gunakan bahasa Inggris saja.
<locale>
<langpack iso3="eng" />
</locale>
Untuk bagian resource, kita perlu mendefinisikan file-file yang dibutuhkan installer. File-file ini harus sudah ada.
<resources>
<res src="installer/application-description.html" id="HTMLInfoPanel.info"/>
<res src="installer/gpl.txt" id="LicencePanel.licence"/>
</resources>
Tentukan urutan screen seperti sudah dijelaskan di atas.
<panels>
<panel classname="HelloPanel"/>
<panel classname="HTMLInfoPanel"/>
<panel classname="LicencePanel"/>
<panel classname="PacksPanel"/>
<panel classname="TargetPanel"/>
<panel classname="InstallPanel"/>
<panel classname="SimpleFinishPanel"/>
</panels>
Bagian packs menentukan folder-folder yang akan diinstal. Sintaksnya mirip dengan Ant.
<packs>
<pack name="Base" required="yes">
<description>Base System files</description>
<fileset dir="." targetdir="$INSTALL_PATH">
<include name="ext/jetty/*"/>
<include name="webapp/**/*"/>
<include name="*.sh"/>
<include name="*.bat"/>
</fileset>
</pack>
<pack name="Source" required="no">
<description>Source code and test files</description>
<fileset dir="." targetdir="$INSTALL_PATH">
<include name="src/**/*"/>
<include name="lib/**/*"/>
<include name="*.xml"/>
</fileset>
</pack>
</packs>
Variabel $INSTALL_PATH akan diisikan sesuai folder tujuan yang dipilih pengguna.
Ok, file konfigurasi installer kita sudah selesai. Sekarang tinggal diotomasi sehingga bisa dipanggil lewat Ant.
Ada beberapa informasi yang dibutuhkan oleh izPack, yaitu:
- lokasi konfigurasi instalasi (file xml yang baru saja kita buat)
- nama file installer yang akan dihasilkan (misalnya MyProject-installer.jar)
- jenis instalasi (desktop atau web)
- base folder (folder acuan untuk menentukan lokasi relatif folder yang lain)
- lokasi instalasi izPack
Berikut adalah target untuk Ant
<taskdef name="izpack"
classpath="${izpack_install_dir}/lib/compiler.jar"
classname="com.izforge.izpack.ant.IzPackTask"
/>
<target name="build-installer">
<izpack input="installer/playbilling-installer.xml"
output="dist/playbilling-installer.jar"
installerType="standard"
basedir="."
izPackDir="${izpack_install_dir}"
/>
</target>
Setelah Ant target dijalankan, kita akan mendapatkan file playbilling-installer.jar di dalam folder dist.
Mari kita coba jalankan file installer tersebut.
java -jar dist/playbilling-installer.jar
Kita akan disodori tampilan selamat datang

Klik Next, dan kita akan melihat keterangan tentang PlayBilling. Keterangan ini langsung dicopy-paste dari homepage PlayBilling

Next lagi, dan muncullah license agreement, yaitu GPL, yang diambil langsung dari website GPL.

Screen selanjutnya adalah pilihan paket yang akan diinstal. Perhatikan bahwa paket wajib diburamkan dan tidak bisa diklik.

Setelah itu, kita akan ditanya lokasi instalasi.

Pilih lokasi yang sesuai, kemudian Next. Instalasi akan segera dimulai.

Sukses … !

Sebagai bonus, izPack juga akan membuatkan Uninstaller. Coba jalankan
java -jar /home/endy/PlayBilling/Uninstaller/uninstaller.jar

Klik OK, dan aplikasi akan dihilangkan dari komputer Anda.
Selamat mencoba. Semoga bermanfaat.
27 Sep 2006
Dalam beberapa project terakhir, saya menggunakan Spring MVC untuk membuat presentation layer. Spring sangat fleksibel dan mudah dipelajari. Ini menambah fleksibilitas dalam menyusun tim programmer. Dengan kemudahannya, programmer yang sudah pernah membuat aplikasi web –baik menggunakan Struts, PHP, Ruby on Rails, atau bahkan yang cuma mengerti servlet– dapat beradaptasi dalam hitungan hari dan langsung produktif.
Di lain pihak, saya sering sekali mendengar kehebatan Tapestry. Para pendukungnya menggembar-gemborkan peningkatan produktifitas (baca: kecepatan membuat aplikasi) yang signifikan. Harga yang harus dibayar untuk produktifitas tersebut adalah kompleksitas. Tapestry terkenal sulit. Dia menggunakan paradigma event-driven. Jadi kita harus berpikir seolah-olah kita membangun aplikasi desktop dengan Swing atau VB. Kompleksitas ini menyebabkan kita tidak bisa sembarangan menyusun tim programmer. Butuh orang yang pemahaman Java-nya menengah ke atas agar aplikasi dapat diselesaikan dengan baik.
Setelah merasa nyaman menggunakan Spring di beberapa project terakhir, saya putuskan untuk keluar dari zona aman dan belajar Tapestry. Masa depan aplikasi web nampaknya adalah component-mania. Berbagai komponen siap pakai yang tersedia di pasaran (baik gratis maupun bayar) yang tinggal kita tempelkan di aplikasi kita, akan menjadi trend. Terutama dengan maraknya penggunaan Ajax belakangan ini. Pasti akan banyak orang yang membuat komponen Ajax-ready yang bisa langsung digunakan.
Prediksi ini diperkuat dengan presentasi Chuk Mun Lee di Sun Developer Day 2006 kemarin. Dia menunjukkan bagaimana cepatnya orang bisa membuat aplikasi web. Cukup mendownload kumpulan komponen dari jMaki, dan langsung menggambar di IDE. Kalau para pesaing bekerja seperti ini, sementara kita masih secara manual memparsing request, wah … kita akan ketinggalan.
Sebagai titik awal pelajaran, saya akan mulai dari Spring Framework. Ada beberapa kegiatan utama dalam pembangunan aplikasi web yang terjadi berulang-ulang. Dalam membandingkan Spring vs Tapestry, kegiatan-kegiatan ini akan menjadi kriteria penilaian. Dalam setiap kegiatan, saya akan memberi nilai dan menyatakan pemenangnya. Masing-masing kegiatan bobotnya berbeda, tergantung frekuensi kemunculannya dalam aplikasi.
Berikut adalah kriteria penilaiannya :
- Hello World. Yaitu kegiatan setup pertama kali sampai Hello World muncul. Bobotnya cuma 5%, karena kegiatan ini cuma dilakukan sekali saja di awal.
- Form binding. Bagaimana semua variabel dalam form bisa diambil sebagai satu domain object. Bobotnya 20%, karena ini adalah kegiatan wajib, inti dari aplikasi.
- Validasi form. Bagaimana mencegah invalid input, baik secara server-side maupun client-side. Bobotnya 20%, saudara kembar dengan Form Binding.
- Web Asset. Bagaimana penanganan image, css, javascript. Bobotnya 10%.
- Security. Bagaimana kemudahan mengaktifkan otentikasi dan otorisasi. Bobotnya 20%. Ini juga bagian yang penting. Kalau penanganan di sisi ini tidak elegan, akan banyak duplikasi kode bertebaran di dalam kode program.
- Ajax readiness. Bobotnya 10%.
- Reusability. Bagaimana kemudahan menggunakan komponen/library yang sudah ada. Bobotnya 10%.
Disclaimer: dalam kegiatan membandingkan ini, tidak ada tujuan untuk menjelekkan yang satu terhadap yang lainnya. Ini murni adalah pekerjaan harian software designer, yaitu memilih framework dan teknologi. Berbagai saran dan masukan dari pendukung masing-masing framework sangat diharapkan.
Hello World akan dibahas di artikel selanjutnya.
26 Sep 2006
Database testing merupakan suatu kegiatan yang sulit, apalagi dalam dunia Java. Bayangkan saja, untuk melakukan testing database, kita harus melakukan :
-
Membuat skema database. Skema terdiri dari dari tabel, constraint, view, dan lainnya.
-
Mengisi sampel data.
-
Mengeksekusi query.
-
Periksa ke database untuk memastikan hasilnya benar.
-
Koreksi atau lanjutkan sesuai dengan hasil di nomer 4.
Semua kegiatan di atas sangat membosankan dan melelahkan untuk diulang-ulang setiap kali melakukan perubahan kode program. Akibatnya programmer menjadi bosan dan malas mengetes kode programnya. Padahal kode akses database merupakan salah satu bagian krusial dalam aplikasi.
Pada artikel ini kita akan membahas cara membuat kode akses database yang mudah dan cepat, dilengkapi dengan testing yang menyeluruh dan menyenangkan.
Saya biasanya menggunakan kombinasi Spring Framework dan Hibernate. Dengan kombinasi ini, kita dapat membuat aplikasi dengan sangat cepat.
Kita mulai dengan struktur tabel sederhana. Misalnya kita memiliki class Siswa, sebagai berikut:
Class Siswa
public class Siswa {
private Integer id;
private String nama;
private Date tanggalLahir;
public Integer getId() { return this.id; }
public String getNama() { return this.nama; }
public Date getTanggalLahir() { return this.tanggalLahir; }
// setter method
}
class ini akan disimpan di database dengan struktur tabel (MySQL) sebagai berikut:
mysql-schema.sql
CREATE TABLE TBL_SISWA (
id_siswa INT PRIMARY KEY AUTO_INCREMENT,
nama VARCHAR(255),
tanggal_lahir DATE
);
Dengan menggunakan Hibernate, kita tidak perlu menulis SQL query. Sebagai gantinya, kita harus memberitahu Hibernate tentang skema database kita. Caranya adalah dengan menambahkan annotation sehingga class kita menjadi seperti ini:
Siswa.java
package tutorial.hibernate;
@Entity
@Table(name="TBL_SISWA")
public class Siswa {
private Integer id;
private String nama;
private Date tanggalLahir;
@Id
@Column(name="id_siswa")
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() { return this.id; }
public String getNama() { return this.nama; }
@Column(name="tanggal_lahir")
public Date getTanggalLahir() { return this.tanggalLahir; }
}
Pembaca yang teliti segera protes, “Ada yang ketinggalan!! Di atas public String getNama() belum ada @Column”
Tidak, itu bukan kelupaan. Tapi memang Hibernate dapat dengan cerdas menebak nama kolom. public String getNama akan diterjemahkan menjadi kolom nama. Bahkan seandainya nama tabel kita SISWA (bukannya TBL_SISWA), kita tidak perlu menuliskan @Table.
Oke. Sekarang mapping sudah selesai. Saatnya membuat kode untuk mengisi record (create), membaca record (read), mengubah record (update), dan menghapus record (delete). Empat serangkai operasi database ini dikenal dengan istilah CRUD.
Pertama, kita buat interface dulu, kode yang mendefinisikan operasi CRUD ini.
SiswaDao.java
package tutorial.hibernate;
public interface SiswaDao {
public void create(Siswa s);
public Siswa getById(Integer id);
public void update(Siswa s);
public void delete(Siswa s);
}
Pembuatan interface berguna supaya kapan-kapan kalau kita sudah bosan dengan Hibernate, kita bisa mengganti dengan implementasi yang lainnya, misalnya iBatis atau JDBC biasa.
Berikut implementasi operasi CRUD dengan Spring dan Hibernate.
SiswaDaoHibernate.java
package tutorial.hibernate;
public class SiswaDaoHibernate extends HibernateDaoSupport implements SiswaDao {
public void create(Siswa s){
getHibernateTemplate().save(s);
}
public Siswa getById(Integer id){
return (Siswa) getHibernateTemplate().load(Siswa.class, id);
}
public void update(Siswa s){
getHibernateTemplate().update(s);
}
public void delete(Siswa s) {
getHibernateTemplate().delete(s);
}
}
Lagi-lagi ada yang bertanya, “Kok tidak ada kode untuk menangani koneksi database? Mana connect dan disconnect dengan database? Mana kode untuk begin dan commit transaction?”
Semua kode birokratis yang ditanyakan barusan akan diinisialisasi melalui Spring Framework. Sebenarnya kita bisa saja menginisialisasi sendiri melalui kode program biasa. Tapi akan lebih efisien dan konsisten apabila kita menggunakan Spring Framework, seperti akan kita lihat sebentar lagi.
Berikut adalah deklarasi SiswaDaoHibernate, DataSource koneksi database, dan konfigurasi transaction :
belajar.xml
<beans>
<bean id="siswaDaoAsli" class="tutorial.hibernate.SiswaDaoHibernate">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>tutorial.hibernate.Siswa</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/belajar"/>
<property name="username" value="belajar"/>
<property name="password" value="belajar"/>
</bean>
<bean id="siswaDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="siswaDaoAsli"/>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
Object yang kita gunakan adalah siswaDao. Object ini dirangkai dari berbagai object lain, diantaranya adalah koneksi database (dataSource), transaction interceptor (gunakan transaction untuk method create, update, delete*), dan transaction manager untuk mengelola transaction Hibernate.
Perhatikan kode ini:
<prop key="hibernate.hbm2ddl.auto">create</prop>
Baris kode di atas akan men-drop seluruh tabel dan constraint di database, dan membuat ulang semuanya. Dengan demikian, database kita akan fresh seperti baru.
PERHATIAN!!! Jangan dijalankan di database production!!
Berikut adalah unit test untuk class SiswaDaoHibernate:
SiswaDaoHibernateTest.java
package tutorial.hibernate;
public class SiswaDaoHibernateTest extends TestCase {
private static ApplicationContext ctx;
private static SiswaDao dao;
private static DataSource ds;
private static Connection conn;
static {
ctx = new ClassPathXmlApplicationContext("belajar.xml");
dao = (SiswaDao)ctx.getBean("siswaDao");
ds = (DataSource)ctx.getBean("dataSource"););
}
public void setUp() throws Exception {
conn = ds.getConnection();
}
public void tearDown() throws Exception {
conn.close();
}
public void testCreate() throws Exception {
Siswa endy = new Siswa();
endy.setNama("Endy Muhardin");
endy.setTanggalLahir(new SimpleDateFormat("dd-MM-yyyy").parse("17-08-1945"));
dao.save(endy);
// mari kita test
String sql = "SELECT * FROM TBL_USER WHERE nama='Endy Muhardin'";
ResultSet rs = conn.createStatement().executeQuery(sql);
assertTrue("harusnya ada minimal satu record", rs.next());
assertEquals("coba cek tanggal lahir", rs.getDate("tanggal_lahir"), new SimpleDateFormat("dd-MM-yyyy").parse("17-08-1945"));
}
}
Nah, dengan adanya unit test di atas, kita tidak perlu lagi secara manual menjalankan kode test, kemudian memeriksa isi database.
Sekarang, bagaimana mengetes method getById? Apakah kita harus melakukan insert dulu baru kemudian menjalankan dao.getById(1) ?
Tidak perlu. Kita dapat menggunakan DBUnit untuk menginisialisasi sampel data.
Kita buat sampel data (fixture) sebagai berikut:
siswa-fixture.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<TBL_USER id="99"
nama="Khalisa Alayya"
tanggal_lahir="2005-12-31"
/>
</dataset>
Sekarang, pastikan fixture di atas dijalankan sebelum setiap test dieksekusi. Caranya adalah dengan menambahkan kode berikut di method setUp:
public void setUp() {
conn = ds.getConnection();
// inisialisasi koneksi DBUnit
DatabaseConnection dbUnitConn = new DatabaseConnection(conn);
// inisialisasi fixture
FlatXmlDataSet fixture = new FlatXmlDataSet(new File("siswa-fixtures.xml"));
DatabaseOperation.CLEAN_INSERT.execute(dbUnitConn,fixture);
}
Kode ini :
DatabaseOperation.CLEAN_INSERT.execute(dbUnitConn,fixture);
akan menghapus semua data yang ada di database, dan mengisinya dengan satu record, yaitu Khalisa Alayya.
Sehingga kita dapat membuat kode test seperti ini:
public void testGetById() {
Siswa khalisa = dao.getById(99);
assertNotNull(khalisa);
assertEquals("Khalisa Alayya", khalisa.getNama());
}
Berikut adalah Ant script untuk mengeksekusi test di atas:
build.xml
<project name="belajar-hibernate" default="test" basedir=".">
<!-- silahkan lengkapi dengan target compile -->
<target name="test" depends="compile">
<junit haltonfailure="true" fork="true" printsummary="yes">
<classpath refid="project-classpath"/>
<formatter type="xml"/>
<batchtest todir="report/junit">
<fileset dir="bin" includes="**/*Test.class"/>
</batchtest>
</junit>
</target>
</project>
Silahkan jalankan berkali-kali sepuasnya. Rangkaian kode di atas akan dengan senang hati melakukan:
-
Pembuatan schema
-
Mengisi sampel data
-
Menjalankan kode program
-
Memeriksa hasilnya di database
Tidak perlu memelototi phpmyadmin lagi :D
Semoga bermanfaat.