Java Netbeans Tutorial
Java Netbeans Tutorial
Java Desktop
Ifnu Bima
[email protected]
http://ifnu.artivisi.com
http://www.artivisi.com
Jakarta, 2008
Daftar Isi
Java Foundation Class.......................................................................................................1
Feature JFC...................................................................................................................1
Swing Package..............................................................................................................2
Swing HelloWorld........................................................................................................3
Install Java Development Kit...................................................................................3
Membuat program HelloWorld................................................................................3
Melakukan kompilasi program HelloWorld............................................................4
Menjalankan program HelloWorld..........................................................................4
Membuat Swing HelloWorld dengan Netbeans 6.1.....................................................5
Komponen Swing.............................................................................................................7
Struktur Komponen Swing...........................................................................................7
Bekerja dengan JLabel, JTextField dan JButton...........................................................8
Bekerja dengan JCheckBox dan JRadioButton..........................................................11
Bekerja dengan JList dan JComboBox.......................................................................15
Bekerja dengan Menu, Popup Menu dan Toolbar......................................................18
Membuat Menu......................................................................................................19
Membuat Popup Menu...........................................................................................24
Membuat Toolbar...................................................................................................25
Membuat Dialog dan JFileChooser............................................................................29
Membuat pre-defined dialog dengan JOptionPane................................................30
Membuat JFileChooser..........................................................................................35
Konsep MVC...................................................................................................................38
Model dalam Komponen Swing.................................................................................39
TableModel.................................................................................................................41
ListModel....................................................................................................................42
Menangani Event.............................................................................................................44
Event Listener dalam Swing.......................................................................................45
ActionListener.............................................................................................................48
KeyListener.................................................................................................................50
HALAMAN III
MouseListener dan MouseMotionListener.................................................................52
Koneksi Database Dengan JDBC....................................................................................55
Mengenal JDBC..........................................................................................................55
Database Driver..........................................................................................................56
Membuat Koneksi.......................................................................................................56
Mengambil dan Memanipulasi Data dari Database....................................................58
Menggunakan PreparedStatement..............................................................................60
Batch Execution..........................................................................................................62
Menangani Transaction...............................................................................................62
DAO dan Service Pattern............................................................................................63
Java Persistence API (JPA).............................................................................................71
Perbedaan dialek SQL............................................................................................71
Perbedaan konsep relasional dan object-oriented..................................................72
Peningkatan kinerja................................................................................................73
Persiapan.....................................................................................................................74
Instalasi...................................................................................................................74
Aplikasi Blog..........................................................................................................75
Fungsionalitas Aplikasi..........................................................................................75
Dasar-dasar ORM.......................................................................................................75
Mapping Sederhana................................................................................................75
Konfigurasi JPA.....................................................................................................76
Menyimpan dan Mengambil Object.......................................................................78
EntityManagerFactory............................................................................................79
Menyimpan object ke database..............................................................................79
Mengambil data dari database................................................................................80
Membuat skema database.......................................................................................81
Membuat CategoryDao..........................................................................................81
Menggunakan EntityManager................................................................................82
Client Code.............................................................................................................82
Pemetaan Relasi..........................................................................................................83
Pertimbangan dalam pemetaan...................................................................................85
Kasta.......................................................................................................................86
HALAMAN IV
Navigasi..................................................................................................................89
Jenis Collection......................................................................................................90
Optionality..............................................................................................................91
Transitive Persistence.............................................................................................92
Enum Type..................................................................................................................93
Value Type..................................................................................................................94
One to One..................................................................................................................95
Many to One...............................................................................................................95
One to Many...............................................................................................................96
List dengan order by...............................................................................................96
Many to Many.............................................................................................................99
Parent-Child..............................................................................................................100
Mengambil Objek dari Database..............................................................................101
JPA Query Language (JPAQL)................................................................................101
Query Sederhana..................................................................................................101
Pagination.............................................................................................................102
Parameter Binding................................................................................................102
Named Query.......................................................................................................103
Restriction............................................................................................................104
Query untuk Collection........................................................................................106
Projection.............................................................................................................106
Join.......................................................................................................................106
Report Query........................................................................................................107
Subquery...............................................................................................................107
Native SQL...............................................................................................................108
Jasper Report.................................................................................................................109
Pengenalan................................................................................................................109
Instalasi.....................................................................................................................109
Alur Proses JasperReport..........................................................................................110
Istilah Umum dalam JasperReport............................................................................110
iReport sebagai Visual Designer...............................................................................111
Konfigurasi Koneksi Database dalam iReport..........................................................112
HALAMAN V
Menampilkan Data dalam Report.............................................................................113
Kompilasi Report dengan Ant..................................................................................114
Integrasi JasperReport dengan Swing.......................................................................116
Menampilkan Report Menggunakan DataSource.....................................................117
Mengirim Parameter.................................................................................................120
Menggunakan Scriptlet.............................................................................................120
Penutup..........................................................................................................................122
Referensi dan Bacaan Lebih Lanjut...............................................................................123
HALAMAN VI
JAVA FOUNDATION CLASS | HALAMAN 1
Feature JFC
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.
javax.accessibility javax.swing.plaf javax.swing.text
javax.swing javax.swing.plaf.basic javax.swing.text.html
javax.swing.border javax.swing.plaf.metal javax.swing.text.rtf
javax.swing.colorchooser javax.swing.plaf.multi javax.swing.table
javax.swing.event javax.swing.plaf.synth javax.swing.tree
javax.swing.filechooser javax.swing.undo
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 program HelloWorld
HALAMAN 4 | JAVA SWING
Komponen Swing
penting
Jendela Design menampilkan visualisasi kompone
Ganti
Klik nama
kanankomponen-komponen tersebut
> Change Variable Name ...(sesuai urutan dari
kiri ke kanan, atas ke bawah) menjadi : lblKeterangan, txtA,
lblPlus, txtB, btnHitung, lblHasil.
6. Menambahkan variable untuk menampung nilai yang akan
dijumlahkan. Klik tombol Source untuk membuka jendela yang
menampilkan kode sumber dari program di atas kemudian
tambahkan kode di bawah ini tepat dibawah definisi dari class
Penjumlahan:
private String str = "Hasilnya adalah :
"; private int a, b;
7. Menangani penekanan tombol btnHitung. Klik kanan diatas
komponen btnHitung kemudian pilih menu :
Events > Action > actionPerformed
Anda akan dibawa ke jendela Source, dan akan menemukan
kode program seperti di bawah ini :
KOMPONEN SWING | HALAMAN
dan 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.
JComboBox dan JList sangat fleksibel, kita dapat menambah dan
menghapus item di dalamnya dengan sangat mudah. Sehingga
cocok digunakan untuk merepresentasikan pilihan yang item
pilihannya bersifat dinamis.
Aplikasi di bawah ini adalah contoh penggunaan JComboBox dan
JList.
Jendela Properties
Pilih komponen JComboBox di Jendela Design, Jendela
Properties akan menampilkan properties dari JComboBox.
Pada bagian model di dalam Jendela Properties masukkan item
Pelajar, Mahasiswa, Programmer, Technical Writer dan Tester.
Setiap item dipisahkan dengan koma (,).
4. Merubah isi JList. Pilih JList di Jendela Design maka Jendela
Properties untuk JList akan muncul. Di bagian model isikan
item : Membaca, Olahraga, Trekking, Coding, Menonton Film,
Bersepeda dan Mengajar. Setiap item dipisahkan dengan koma
(,).
KOMPONEN SWING | HALAMAN
Toolbar
JMenuItem adalah struktur terluar dari Menu yang tidak bisa mempunyai child.
JToolBar pada umumnya menampung JButton yang diberi Icon dan mempunyai background transparan.
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
KOMPONEN SWING | HALAMAN
Proses penambahan, pengurangan dan pengaturan posisi menu semua dilaksanakan dari Jendela Inspector
\
KOMPONEN SWING | HALAMAN
dan menuPaste.
4. Memunculkan JPopupMenu. Ketika tombol kanan mouse di
klik diatas JFrame, JPopupMenu akan tampil. Agar behavior
tersebut berjalan, kita perlu menangani event mouseClick
terhadap JFrame. Caranya :
a) Klik kanan JFrame di Jendela Design, kemudian pilih menu :
Events > Mouse > mouseClicked
b) Di dalam jendela source yang terbuka masukkan kode
berikut ini :
private void formMouseClicked(
java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if(evt.getButton() == MouseEvent.BUTTON3){
popUpMenu.show(
(Component)evt.getSource(
),
evt.getX(),evt.getY());
}
Kondisi if diatas digunakan apakah tombol yang diklik
mouse adalah tombol sebelah kanan, jika nilai kembalian
method getButton sama dengan nilai BUTTON3 maka
benar tombol kanan yang ditekan.
Method show digunakan untuk memunculkan popup menu,
parameter pertama diisi dengan Component dimana
nantinya popup menu akan ditampilkan, sedangkan
parameter kedua dan ketiga diisi dengan letak koordinat
popup menu akan ditampilkan.
5. Simpan file ToolbarMenu.java, compile dan jalankan.
Kemudian coba munculkan popup menu dengan mengklik
kanan JFrame.
Popup menu sangat berguna jika aplikasi yang kita kembangkan
membutuhkan interaksi yang intensif dengan user. Popup menu
menyediakan cara mudah untuk mengakses menu/action yang
sesuai dengan konteks dari aplikasi.
Membuat Toolbar
Toolbar memberikan dimensi lain dalam mengakses menu
dbandingkan menu ataupun popup menu. Pada umumnya Toolbar
merupakan cara singkat untuk mengakses menu. Menu yang
diwakili toolbar adalah menu yang bersifat umum dan tidak terikat
pada konteks tertentu.
Kegunaan lain dari toolbar adalah mempercantik tampilan aplikasi,
karena toolbar biasanya adalah tombol yang didekorasi dengan
HALAMAN 26 | JAVA
icon yang menarik. Selain itu toolbar juga memberikan kesempatan
kepada user untuk mengkustomisasi tampilan dari aplikasi. Karena
layout toolbar sangat fleksibel, user bisa memindah-mindahkan
letak toolbar di dalam aplikasi, di atas, dibawah atau disamping,
atau bahkan mengambang (floating) diatas jendela yang sedang
aktif.
Dalam contoh program diatas kita akan membuat sebuah JToolBar
dengan dua buah JButton yang telah didekorasi dengan icon cantik.
Icon yang digunakan banyak tersedia di internet, format file yang
dipilih adalah .png, karena format file ini paling bagus dalam
menangani transparasi komponen.
Sebelum mulai membuat JToolBar, kita perlu mempersiapkan
terlebih dahulu icon yang akan digunakan sebagai dekorasi
JButton. Ikuti langkah-langkah berikut ini :
1. Buatlah sebuah java package baru untuk menampung semua
icon yang akan digunakan. caranya klik kanan di jendela
Projects bagian nama project, pilih menu :
New > Java Package
Beri nama images untuk java package yang baru saja kita buka.
2. Memasukkan Icon ke dalam package. Untuk memasukkan
image ke dalam package kita perlu tahu dimana project
disimpan, misalkan project disimpan dalam folder :
c:\javaswing
Buka file explorer, kemudian navigasi ke folder
penting c:\javaswing\src\images
Copy semua
Build Project akan berhasil jika tidak ada satupun error dalam icon
kode yang diperlukan ke dalam folder diatas.
program.
3. Build project. Langkah ini diperlukan untuk mengcompile
Sebelum melakukan build project pastikan terlebih dahulu tidak ada error dalam kode.
semua file .java menjadi file .class. Selain itu proses ini juga
akan mengkopi file selain file .java (termasuk file icon) ke
Lakukan build setiap kali menambahkan file non-dalam
java kefolder
dalam folder source file. Agar
build\classes. Jikafile tersebut
proses iniikut tercopy
tidak ke dalam folder build\classes
dilaksanakan,
maka ketika program dijalankan, file icon tidak akan ditemukan
dan program menjadi error .
Setelah proses persiapan selesai, lakukan langkah-langkah berikut
ini untuk membuat Toolbar :
1. Buka class ToolbarMenu.java yang sudah dibuat di langkah
sebelumnya.
2. Buat sebuah object JToolBar, caranya : klik item JToolBar dari
Jendela Pallete, kemudian klik JFrame di Jendela Design.
Secara otomatis sebuah object JToolBar akan dimasukkan ke
dalam JFrame. Ganti namanya menjadi toolBar.
KOMPONEN SWING | HALAMAN
JOptionPane.showMessageDialog(null
, "Your action was succeed,
“ +
“you can proceed to next
assigment", "Information dialog",
JOptionPane.showMessageDialog(nul
l,
"You neet to be sure to do this action!",
JOptionPane.showMessageDialog(null,
"Something goes wrong and generate error
message", "Error Dialog",
JOptionPane.showConfirmDialog(null,
"Choose yes or no","Confirmation
Dialog", JOptionPane.YES_NO_OPTION,
JoptionPane.WARNING_MESSAGE);
HALAMAN 34 | JAVA
JOptionPane.showConfirmDialog(null,
"Choose yes, no or cancel","Confirmation
Dialog", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
OptionDialog
JOptionPane.showInputDialog(null,
"Input your name here","Input
Dialog",
Membuat JFileChooser
JFileChooser digunakan untuk bernavigasi dalam file system,
kemudian memilih satu atau lebih file atau folder dari list file dan
folder. JFileChooser pada dasarnya adalah pengembangan dari
dialog yang dapat digunakan untuk memilih file. JFileChooser
dapat digunakan sebagai dialog untuk menyimpan file atau untuk
membuka file.
JFileChooser hanya memberikan fasilitas untuk memilih file atau
folder, sedangkan mekanisme untuk menyimpan atau membuka file
dilakukan sendiri menggunakan library I/O.
Aplikasi berikut ini adalah contoh penggunaan JFileChooser untuk
membuka dan menyimpan file.
Tampilan JFileChooser
Untuk membuat aplikasi diatas lakukan langkah-langkah berikut ini
:
1. Buat class JFrame Form baru, beri nama Chooser.java
2. Masukkan dua buah JTextField : txtOpen dan txtSave, dua buah
HALAMAN 36 | JAVA
Jbutton : btnOpen dan btn save, sebuah JLabel : lblStatus.
Sesuaikan penataan komponen sesuai dengan gambar diatas.
3. Tambahkan sebuah object JFileChooser sebagai field dari class
Chooser, beri nama chooser.
public class Chooser{
JFileChooser chooser = new JFileChooser();
//kode lain di sini
}
4. FileNameExtentionFilter digunakan sebagai file filter dalam
JFileChooser. Metode filteringnya adalah mencocokkan
ekstensi file dalam file system dengan ekstensi yang ada dalam
FileNameExtentionFilter. Contoh kode di bawah ini akan
menyebabkan JFileChooser mempunyai pilihan “JPEG File”,
dan jika pilihan tersebut dipilih, maka file dengan ekstensi
“jpg”, “jpeg”,”JPG” atau“JPEG” saja yang akan ditampilkan oleh
JFileChooser.
FileNameExtensionFilter JPEGFilter
= new
FileNameExtensionFilter(
"JPEG File","jpg","jpeg",”JPG”,”JPEG”);
5. Set direktori yang akan dituju oleh JFileChooser. Untuk
mengetahui dimana direktori aktif aplikasi, kita bisa
menggunakan system property “user.dir”. Kode berikut ini akan
menyebabkan JFileChooser dibuka pada direktori aktif
aplikasi :
String dir =
System.getProperty("user.dir");
6. Menghandle event penekanan tombol btnSave. Ketika tombol
btnSave ditekan, chooser akan menampilkan dialog save file,
kemudian mengambil nama file yang dipilih dan
menampilkannya dalam txtSave, serta menampilkanya dalam
lblStatus. Berikut ini kodenya :
KOMPONEN SWING | HALAMAN
Konsep MVC
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.
public class PersonTableModel extends
AbstractTableModel{ private List<Person> persons;
public PersonTableModel(List<Person> persons)
{ this.persons = persons;
}
public int getRowCount()
{ return
persons.size();
}
public int getColumnCount()
{ return 3;
}
public Object getValueAt(int rowIndex,
int columnIndex) {
Person p =
persons.get(rowIndex);
switch(columnIndex){
case 0 : return p.getId();
case 1 : return
p.getName(); case 2 :
return p.getEmail();
default : return "";
HALAMAN 42 | JAVA
@Override
public String getColumnName(int column)
{ switch(column){
case 0 : return "ID";
case 1 : return
"NAME"; case 2 :
return "EMAIL";
default : return "";
}
}
Yang perlu diperhatikan bahwa dalam AbstracTableModel, method
isCellEditable selalu mengembalikan nilai false, artinya semua cell
tidak dapat diedit. Kemudian method setValueAt adalah method
kosong belaka, artinya jika kita memanggil method ini tidak akan
terjadi apa-apa.
Class kedua adalah DefaultTableModel yang telah
mengimplementasi semua method abstract dari interface
TableModel. Representasi data DefaultTableModel menggunakan
dua jenis data tabular, yaitu array dua dimensi, Object[][], dan
Vector dari Vector, Vector<Vector<Object>>. Jika kita mempunyai
struktur data selain kedua jenis tersebut kita harus melakukan
konversi data ke dalam salah satu bentuk struktur data tersebut.
Cara yang lebih cerdas adalah mendefinisikan sendiri class yang
mengimplement interface TableModel seperti class
CustomerTableModel diatas.
Setelah TableModel selesai didefinisikan kita tinggal memanggil
method setTableModel dari object JTable, atau membuat object
JTable baru menggunakan constructor yang menerima argumen
TableModel. Contohnya seperti potongan kode di bawah ini :
JTable table = new JTable(new
DefaultTableModel()); JTable table1 = new
JTable();
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
KONSEP MVC | HALAMAN
Menangani Event
ini nanti yang akan dipanggil oleh Subject ketika event pemasukan
kata oleh user terjadi di Subject.
public interface KeyboardPressedListener {
public void keyPressed(KeyboardPressedEvent e);
}
Class Observer mengimplement interface KeyboardPressedListener
dan nantinya akan didaftarkan ke subject sebagai Observer.
Method keyPressed diimplementasikan dengan mencetak informasi
yang diperoleh dari Subject ke standard output.
public class Observer implements
KeyboardPressedListener{ private String name;
public Observer(String name){ this.name = name;
} public void keyPressed(KeyboardPressedEvent
e) {
System.out.println("print from observer : " +
name + "\n\tevent from : " +
Class KeyboardPressedEvent adalah Java Bean biasa yang
menyimpan informasi kejadian pemasukan kata oleh user,
didalamnya hanya ada field source dan word serta getter-setter
method untuk kedua field tersebut.
public class KeyboardPressedEvent {
private Object source;
private String word;
public Object getSource() { return source; }
public void setSource(Object src) { source =
src;} public String getWord() { return word; }
public void setWord(String wrd) { word = wrd; }
}
Sampai disini, class-class diatas masih berdiri sendiri dan belum
ada class yang mempunyai method main. Nah, disinilah kode class
MainClass untuk menyatukan semua object diatas menjadi aplikasi
utuh.
HALAMAN 48 | JAVA
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 adalah
MENANGANI EVENT | HALAMAN
new ActionListener() {
public void actionPerformed(ActionEvent
evt){ btnHitungActionPerformed(evt);
}
Yang dilakukan oleh kode diatas sebenarnya adalah:
1. Membuat Class baru yang tidak punya nama (anonymous)
2. Class baru tersebut turunan dari Object dan mengimplement
interface ActionListener
3. Mengimplementasi method abstrac actionPerformed
4. Method actionPerformed dari class tak bernama ini akan
memanggil method btnHitungActionPerformed dari class
parentnya.
Secara umum Netbeans akan membuat sebuah anonymous
innerclass seperti diatas untuk setiap penanganan event. Dari sisi
kerapian kode metode ini sangat bagus, karena Netbeans
menyembunyikan kerumitan kode untuk menangani event seperti
diatas. Kita tidak perlu susah-susah membuat sebuah public class
Observer tersendiri untuk menangani event. Cukup dengan
anonymous innerclass.
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.
Ketiga method diatas menerima parameter KeyEvent. Untuk
mengetes tombol apakah yang ditekan oleh user, digunakan
method getKeyCode. Kemudian hasil kembalian method
getKeyCode dibandingkan dengan field static kepunyaan class
KeyEvent yang diawali dengan huruf VK, seperti : VK_ENTER,
VK_A, VK_B, VK_1, VK_LEFT_ARROW dan seterusnya.
MENANGANI EVENT | HALAMAN
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
MENANGANI EVENT | HALAMAN
muncul terakhir.
MouseMotionListener juga dapat didaftarkan sebagai listener pada
semua komponen swing. MouseMotionListener dipisahkan dari
MouseListener karena penanganan event mouseMove yang lebih
berat dan intensif. MouseMotionListener mendengarkan dua
envent:
● mouseMoved : terjadi ketika user menggerakkan mouse diatas
komponen swing
● mouseDragged : terjadi ketika user menekan tombol mouse
sekaligus menggerakkanya diatas komponen swing
Semua method diatas menerima argumen berupa class
MouseEvent. Method getClickCount digunakan untuk menentukan
jumlah click yang terjadi dalam waktu yang berdekatan. Method
getClickCount juga digunakan untuk menentukan apakah klik yang
terjadi adalah single klik atau double klik.
Method getButton digunakan untuk menentukan tombol mana yang
ditekan oleh user. Pada umumnya mouse yang tersedia di pasaran
mempunyai tiga timbol yang dapat di klik, tombol kiri, tombol
tengah dan tombol kanan. Method getButton akan mengembalikan
nilai MouseEvent.BUTTON1 jika tombol kiri ditekan,
MouseEvent.BUTTON2 jika tombol tengah ditekan dan
MouseEvent.BUTTON3 jika tombol kanan ditekan.
Method getX dan getY akan mengembalikan koordinat dimana
MouseEvent terjadi. Koordinat yang digunakan adalah koordinat
relatif. Koordinat (0,0) berada di pojok kiri atas dari komponen
swing, semakin kebawah nilai Y semakin besar dan semakin ke
kanan nilai X semakin besar. Nilai koordinatnya dinyatakan dalam
satuan pixel.
Aplikasi di bawah ini adalah sebuah JFrame yang mempunyai
JLabel di dalamnya. Ketika terjadi event mouseClick dan
mouseMove, JLabel akan menampilkan dimana event tersebut
terjadi. Jika event klik yang muncul, maka text dari JLabel akan
berisi “clicked at (x,y)”, sedangkan event move hanya akan
memunculkan koordinat “(x,y)” saja.
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.
2. JDBC Driver Manager
Class DriverManager dari JDBC bertugas untuk mendefisikan
object-object yang dapat digunakan untuk melakukan koneksi
ke sebuah sumber data. Secara tradisional DriverManager
telah menjadi tulang punggung arsitektur JDBC.
3. JDBC Test Suite
JDBC Test Suite membantu kita untuk mencara driver mana
yang cocok digunakan untuk melakukan sebuah koneksi ke
sumber data tertentu. Tes yang dilakukan tidak memerlukan
resource besar ataupun tes yang komprehensif, namun cukup
tes-tes sederhana yang memastikan fitur-fitur penting JDBC
dapat berjalan dengan lancar.
4. JDBC-ODBC Bridge
HALAMAN 56 | JAVA
Brige ini menyediakan fasilitas JDBC untuk melakukan koneksi
ke sumber data menggunakan ODBC (Open DataBase
Connectivity) driver. Sebagai catatan, anda perlu meload driver
ODBC di setiap komputer client untuk dapat menggunakan
bridge ini. Sebagai konsekuensinya, cara ini hanya cocok
dilakukan di lingkungan intranet dimana isu instalasi tidak
menjadi masalah.
Dengan keempat komponen yang dipunyainya, JDBC menjadi tools
yang dapat diandalkan untuk melakukan koneksi, mengambil data
dan merubah data dari berbagai macam sumber data. Modul ini
hanya akan membahas dua komponen pertama dari keempat
komponen yang dipunyai oleh JDBC, yaitu JDBC API dan
DriverManager. Sumber data yang digunakan adalah Relational
Database.
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. Beberapa
vendor DBMS menyebut Database driver ini dengan sebutan Java
Connector (J/Connector). Database driver biasanya dibungkus
dalam file yang berekstensi jar. Setiap database driver harus
mengimplement interface java.sql.Driver.
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:
KONEKSI DATABASE DENGAN JDBC | HALAMAN
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.
Langkah berikutnya adalah membuat koneksi ke database
menggunakan database driver yang sudah diload tadi. Class
DriverManager bekerja sama dengan interface Driver untuk
mengelola driver-driver yang diload oleh aplikasi, jadi dalam satu
sesi anda bisa meload beberapa database driver yang berbeda.
Ketika kita benar-benar melakukan koneksi, JDBC Test Suite akan
melakukan serangkaian tes untuk menentukan driver mana yang
akan digunakan. Parameter yang digunakan untuk menentukan
driver yang sesuai adalah URL. Aplikasi yang akan melakukan
koneksi ke database menyediakan URL pengenal dari server
databse tersebut. Sebagai contoh adalah URL yang digunakan
untuk melakukan koneksi ke MySql :
jdbc:mysql://[host]:[port]/[schema]
contoh konkritnya :
jdbc:mysql://localhost:3306/latihan
Setiap vendor DBMS akan menyertakan cara untuk menentukan
URL ini di dalam dokumentasi. Anda tinggal membaca
dokumentasi tersebut tanpa harus khawatir tidak menemukan
informasi yang anda perlukan.
Method DriverManager.getConnection bertugas untuk membuat
koneksi:
Connection conn =
DriverManager.getConnection( “jdbc:mys
ql://localhost:3306/latihan”);
Dalam kebanyakan kasus anda juga harus memasukkan parameter
username dan password untuk dapat melakukan koneksi ke dalam
database. Method getConnection menerima Username sebagai
parameter kedua dan pasword sebagai parameter ketiga, sehingga
kode diatas dapat dirubah menjadi :
HALAMAN 58 | JAVA
Connection conn =
DriverManager.getConnection( “jdbc:mysql://
localhost:3306/latihan”, ”root”,””);
Jika salah satu dari driver yang diload berhasil digunakan untuk
melakukan koneksi dengan URL tersebut, maka koneksi ke
database berhasil dilaksanakan. Class Connection akan memegang
informasi koneksi ke database yang didefinisikan oleh URL
tersebut.
Setelah sukses melakukan koneksi ke database, kita dapat
mengambil data dari database menggunakan perintah query
ataupun melakukan perubahan terhadap database. bagian berikut
ini akan menerangkan bagaimana cara mengambil dan
memanipulasi data dari database.
Menggunakan PreparedStatement
Memanggil method executeUpdate berulang-ulang, misalnya
melakukan insert ratusan atau ribuan baris, sangat tidak efisien.
KONEKSI DATABASE DENGAN JDBC | HALAMAN
PreparedStatement pInsert =
conn.prepareStatement( "insert into
Person(name) values(?)");
pInsert.setString(1,"dian"
);
pInsert.executeUpdate();
PreparedStatement pUpdate =
conn.prepareStatement( "update Person set
name=? where name=?");
Dalam contoh diatas, insert dan update data hanya dilaksanakan
sekali saja, hal ini tidak memberikan gambaran yang tepat untuk
melihat keunggulan PreparedStatement dibandingkan
Statement.executeUpdate.
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();
}
Setiap kali iterasi, method setString dipanggil untuk mengisikan
sebuah string ke dalam PreparedStatement, kemudian method
addBatch dipanggil untuk mengumpulkan batch dalam satu wadah.
Setelah iterasi selesai, method executeBatch dipanggil untuk
melaksanakan semua keseratus instruksi insert secara berurut
dengan sekali saja melaksanakan koneksi ke database.
Menangani Transaction
Dukungan transaction oleh JDBC tergantung dengan Databasenya,
KONEKSI DATABASE DENGAN JDBC | HALAMAN
updateStatement =
this.connection.prepareStatemen
t( updateQuery);
deleteStatement =
this.connection.prepareStatemen
t( deleteQuery);
getByIdStatement =
this.connection.prepareStatemen
t( getByIdQuery);
getAllStatement =
this.connection.prepareStatemen
t( getAllQuery);
} catch (SQLException ex) {
}
}
category.getName());
insertStatement.setString(2,
category.getDescription());
int id = insertStatement.executeUpdate();
category.setId(id);
} else {
updateStatement.setString(1,
category.getName());
updateStatement.setString(2,
category.getDescription());
updateStatement.setInt(3, category.getId());
updateStatement.executeUpdate();
}
} catch (SQLException ex) {
}
}
ResultSet rs =
getAllStatement.executeQuery();
while(rs.next()){
Category category = new Category();
category.setId(rs.getInt("id"));
category.setName(rs.getString("name")
); category.setDescription(
rs.getString("description")
); categories.add(category);
}
return categories;
} catch (SQLException ex) {
}
return null;
}
Service pattern digunakan utamanya untuk menyederhanakan
class-class DAO yang ada, misalnya kita mempunyai 50 buah table
maka lazimnya akan ada 50 buah class DAO. Class DAO tersebut
perlu disederhanakan, caranya adalah dengan mengelompokkan
class-class DAO dalam satu modul aplikasi ke class Service.
Misalnya DAO yang berhubungan dengan user management ke
dalam class UserService.
Transaction diatur dalam class Service, praktek yang lazim
digunakan adalah satu method dalam class service adalah satu
scoop transaction. Jadi ketika method dalam service mulai
dieksekusi transaction akan dimulai (begin), ketika method akan
berakhir, transaction akan dicommit.
Berikut ini adalah contoh class Service :
KONEKSI DATABASE DENGAN JDBC | HALAMAN
private CategoryDaoJdbc
categoryDao; private Connection
connection;
return categoryDao.getAll();
}
}
Setelah class DAO dan service berhasil dibuat, mari kita lihat
bagaimana cara menggunakannya :
public class MainJdbc {
{ MysqlDataSource dataSource =
new MysqlDataSource();
dataSource.setUser("root");
dataSource.setPassword("admin");
dataSource.setDatabaseName("latihan"
);
dataSource.setServerName("localhost"
); dataSource.setPortNumber(1527);
System.out.println("id : " +
category.getId()); System.out.println("name :
" +
category.getName());
try {
dataSource.getConnection().close(
);
Setelah mengenal JDBC, kita akan membahas cara mengakses
database yang lebih baik dengan manggunakan JPA. Dengan
menggunakan JPA kode program yang akan dibuat akan lebih
ringkas dan terlihat konsep OOP dibanding dengan JDBC murni.
JPA adalah framework ORM untuk memetakan tabel dalam
database dan class dalam konsep OOP. Dengan menggunakan JPA
kode program kita akan lebih rapi dan terlihat OOP.
JAVA PERSISTENCE API (JPA) | HALAMAN 71
Persiapan
Instalasi
Seperti library Java lainnya, JPA tidak membutuhkan instalasi
JAVA PERSISTENCE API (JPA) | HALAMAN 75
Dasar-dasar 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;
}
}
Selanjutnya, kode program kita akan dibuat dalam method main.
EntityManagerFactory
Pertama, kita harus membaca konfigurasi yang sudah kita buat
tadi. Konfigurasi yang telah diaktifkan akan menghasilkan object
EntityManagerFactory. EntityManagerFactory ini hanya dibuat
sekali saja sepanjang aplikasi berjalan.
EntityManagerFactory entityManagerFactory=
penting
Jangan terlalu lama menyimpan object EntityManager.
Biasanya, session dibuka di awal method, dan segera ditutup di akhir method.
EntityManager JPA tidak sama dengan koneksi database. Koneksi database dikelola oleh EntityManagerFactory.
Persistence.createEntityManagerFactory("JpaPU");
entityManager.persist(category);
entityManager.getTransaction().commit(
EntityManager adalah object sekali pakai. Kita ambil
EntityManager dari EntityManagerFactory, gunakan untuk
operasi persistence, dan kemudian langsung ditutup.
Siklus hidup EntityManager berbeda dengan
EntityManagerFactory. EntityManagerFactory umurnya sama
dengan aplikasi, dibuat satu buah, pada saat aplikasi mulai
dijalankan, dan digunakan terus sepanjang aplikasi berjalan.
Kita bisa membagi-pakai (share) EntityManagerFactory ke
berbagai object yang berjalan berbarengan (concurrent), karena
EntityManagerFactory dibuat secara thread-safe, sehingga aman
untuk pemakaian multi-threading. Tapi kita tidak bisa
menggunakan EntityManager di banyak objek sekaligus.
Setelah dijalankan, kode di atas akan memasukkan satu record ke
tabel Category dalam database.
Mengambil data dari database
Object yang ada dalam database juga bisa diambil dengan cara
yang tidak jauh berbeda. Bila kita sudah tahu ID object tersebut,
kita bisa langsung mengambilnya dari database.
Kode untuk membuka EntityManager, menjalankan transaction,
menyelesaikan transaction (commit), dan menutup
EntityManager tidak ditulis, karena sama dengan di atas.
Category c = (Category)
entityManager.createQuery(“select c from Category where
c.id=:id”).setParameter("id", 1).getSingleResult();
System.out.println("ID: "+c.getId());
System.out.println("Name: "+c.getName());
Tidak sulit bukan? Kita tidak perlu menulis SQL lagi. Tapi ini tidak
berarti kita boleh tidak mengerti SQL. Seperti kita akan lihat pada
bagian selanjutnya, pemahaman SQL sangat penting agar kita bisa
menggunakan JPA dengan optimal.
JAVA PERSISTENCE API (JPA) | HALAMAN 81
public void
setEntityManager( Entit
yManager em) {
this.entityManager = em;
}
Menggunakan EntityManager
Selanjutnya, mari kita isi method save. Di dalam method ini harus
ada logika untuk menentukan apakah operasi save yang akan
dilakukan adalah insert atau update. Konvensi yang digunakan
adalah: jika id dari entity masih null maka entity tersebut belum
ada di dalam database, sehingga operasi insert yang akan
dilaksanakan. Sebaliknya, jika idnya tidak null maka operasi update
yang akan dilaksanakan:
public void save(Category cat)
{ if(cat.getId()==null){
entityManager.persist(cat);
} else {
entityManager.merge(cat);
}
}
method findById.
public Category findById(Integer id){
return (Category)
entityManager.createQuery( "select g
from Group g where g.id=:id")
.setParameter("id", id)
.getSingleResult();
Client Code
Kita dapat membuat kode sederhana untuk mengetes kinerja
CategoryDao. Buat class DemoDao yang memiliki method main.
Isikan kode program berikut dalam method main.
JAVA PERSISTENCE API (JPA) | HALAMAN 83
EntityManagerFactory factory =
Persistence.createEntityManagerFactory(“JpaPU”
);
ID: 1
Name: Tutorial JPA
Description: Belajar
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:
HALAMAN 84 | JAVA
• 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:
Navigasi
Kita harus memikirkan urusan arah navigasi (direction) dalam
merancang pemetaan. Dua class dikatakan memiliki navigasi dua
arah (bidirectional) apabila kita dapat mengakses class yang satu
dari class yang lain, dan sebaliknya. Sebagai contoh, User dan
Group mempunyai hubungan bidirectional, jadi kode Javanya kira-
kira seperti ini.
public class User {
private Set<Group> groups = new HashSet<Group>();
}
sedangkan class Group berisi seperti ini
HALAMAN 90 | JAVA
Optionality
Masalah optionality ini hanya ada di sisi database. Dari sudut
pandang desain object, optionality tidak menjadi pertimbangan.
Mari kita lihat lagi relasi antara User dan Author. Pada kasus kita,
satu User pasti memiliki satu Author, dan sebaliknya. Desain
seperti ini direalisasikan di database dengan DDL berikut:
create table T_AUTHOR (
id INT PRIMARY KEY AUTO_INCREMENT
);
tutorial.setAuthor(endy);
endy.getArticles().add(tutorial
Pada kasus di atas, class Article adalah Entity, jadi JPA tidak
otomatis melakukan insert. Jika dijalankan, kode di atas akan
menghasilkan error, yang menyebutkan bahwa object tutorial
belum ada di database, sehingga tidak bisa dihubungkan dengan
object endy.
JAVA PERSISTENCE API (JPA) | HALAMAN 93
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
Class User ini menggunakan fitur baru dalam Java 5, yaitu Typesafe
Enum. Adapun enum UserLevel tidak sulit, kodenya seperti ini.
public enum UserLevel {
CONTRIBUTOR, EDITOR,
ADMINISTRATOR
Kita memiliki dua pilihan bagaimana UserLevel ini akan disimpan
dalam tabel, yaitu:
• ordinal : menyimpan nilai index dari enum tersebut.
CONTRIBUTOR akan disimpan dengan nilai 1, EDITOR dengan
nilai 2, dan ADMINISTRATOR dengan nilai 3. Ordinal adalah
modus default.
• string : menyimpan nilai teks enum. Di database, nilainya akan
disimpan sebagai tipe data enumeration bila tersedia, atau
varchar.
Untuk memetakan enum, cukup berikan anotasi @Enumerated.
HALAMAN 94 | JAVA
@Enumerated(value =
EnumType.STRING) private UserLevel
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;
Pada class Article, kita mendeklarasikan property Category,
dengan mapping @ManyToOne sebagai berikut.
public class Article
{ @ManyToOne
@JoinColumn(name = "category_id", nullable =
false) private Category category;
}
Deklarasinya tidak jauh berbeda dengan @OneToOne. Pemetaan di
atas mencerminkan skema database sebagai berikut.
HALAMAN 96 | JAVA
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.
penting
inverse ini juga mengatur eksekusi SQL. Mari kita
bahas internal JPA
JPA mampu membuat pemetaan satu arah dari Author ke Article, bahkan tanpa adanya property author di sisi Article.
Asosiasi dua arah antara Author dan Article
sebetulnya terdiri dari dua asosiasi satu arah, yaitu
Pemetaan satu arah ini tetap dilakukan dengan adanya foreign key author_id di T_ARTICLE
dari Author ke Article, dan sebaliknya. Di dalam
database, asosiasi ini diimplementasikan dengan
Tapi konsekuensinya, JPA tidak tahu apakah foreign
foreign keykeyauthor_id
author_id tersebut sudahada
yang dipetakan atau tabel
dalam belum.
T_ARTICLE. Dengan demikian, satu hubungan foreign
Ini sebabnya mengapa kita harus menggunakan keyworddua
key dipetakan inverse.
kali oleh JPA.
Konsekuensinya, dua mapping ini akan menghasilkan
dua kali eksekusi SQL. Coba perhatikan skenario
berikut.
HALAMAN 98 | JAVA
tutorial.setAuthor(endy);
endy.getArticles().add(tutorial
);
Rangkaian kode program di atas akan menghasilkan eksekusi SQL
sebagai berikut:
select * from T_AUTHOR where id=100;
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
HALAMAN 100 | JAVA
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.
public class Group {
@ManyToMa
ny
@JoinTabl
e(
name = "T_GROUP_MEMBERS",
joinColumns = {@JoinColumn(name = "group_id")},
inverseJoinColumns = {@JoinColumn(name =
"user_id")}
Pemetaan many-to-many membutuhkan tabel perantara. Anotasi
@JoinTable digunakan untuk mengatur nama tabel dan
kolom dalam tabel perantara. Jika kita menghilangkan anotasinya,
maka JPA akan mencari tabel bernama T_GROUP_T_USER dengan
nama kolom groups_id dan members_id.
Berikut adalah struktur tabel database yang dipetakan oleh anotasi
di atas.
Parent-Child
Terakhir, kita akan membuat pemetaan parent-child. Ini
merupakan pemetaannya yang sering kita gunakan. Pemetaan ini
biasanya berbentuk one-to-many. Sisi one menentukan kondisi sisi
many. Bila terjadi save, update, atau delete pada sisi one, maka sisi
many akan terpengaruh.
Sebagai contoh, kita akan menggunakan relasi parent-child ini
pada hubungan antara Author dan Article. Bila Author dihapus,
maka seluruh Article yang pernah ditulisnya juga akan ikut
terhapus.
JAVA PERSISTENCE API (JPA) | HALAMAN
return entityManager
.createQuery(query)
.setParameter("authorId", author.getId())
.getResultList();
}
Selain itu, kita juga bisa menggunakan parameter bertipe
java.util.Date. Contohnya bila kita ingin mendapatkan artikel
yang diterbitkan setelah tanggal tertentu. Buat method
articlesPublishedAfter dalam ArticleDao.
public List<Article> articlesPublishedAfter
(Date publishDate)
{ String query = "from Article a ";
query += "where a.publishDate > :publishDate";
return entityManager.createQuery(query)
.setParameter("publishDate", publishDate)
.getResultList();
}
Named Query
Kita bisa mengeluarkan JPAQL dari dalam objek DAO dan
memindahkannya ke class Entity. Dari class DAO, kita cukup
memanggil nama query tersebut. Fitur ini disebut Named Query.
Misalnya, kita ingin mengambil artikel berdasarkan kategori.
Berikut JPAQL-nya.
from Article a where a.category.id = :categoryId
JPAQL ini bisa kita letakkan dalam class Article. Berikut deklarasi
class Article.
HALAMAN 104 | JAVA
@Entity @Table(name =
"T_ARTICLE") @NamedQueries({
@NamedQuery(
name =
"articleByCategory",
query = "from Article a
"+
"where a.category.id = :categoryId"
)
Named Query ini dipanggil dari ArticleDao dalam method
findByCategory seperti ini.
public List<Article> findByCategory(Category category)
{ return entityManager
.createNamedQuery("articleByCategory")
.setParameter("categoryId", category.getId())
.getResultList();
}
Restriction
Kita menggunakan restriction untuk membatasi jumlah record yang
dihasilkan. Mirip dengan SQL, kita menggunakan keyword where
untuk membatasi hasil query.
Contohnya, kita mengambil artikel yang diterbitkan setelah tanggal
tertentu. JPAQLnya tampak seperti ini:
from Article a where a.publishDate > :publishDate
Hampir semua operator yang biasa kita gunakan di Java dapat
digunakan. Berikut tabel operator yang didukung, diurutkan
berdasarkan prioritas eksekusinya:
Operator Penjelasan
. navigasi object
+- untuk membuat menjadi positif/negatif
*/ perkalian dan pembagian
+- penjumlahan dan pengurangan
= <> sama dengan atau tidak sama dengan
<, >, <=, >= perbandingan
[NOT] BETWEEN, [NOT] LIKE, perbandingan, mirip dengan sintaks SQL
[NOT] IN, IS [NOT] NULL
IS [NOT] EMPTY, [NOT] pengecekan collection
MEMBER [OF]
JAVA PERSISTENCE API (JPA) | HALAMAN
List<Article> hasil =
entityManager.createQuery(jpaql).getResultList(
Kita menggunakan karakter % untuk menggantikan karakter apa
saja dalam jumlah berapa saja. Misalnya, kita ingin mencari artikel
yang diawali dengan huruf A, maka kita gunakan JPAQL seperti ini:
from Article a where a.title like 'A%'
Lalu bagaimana kalau kita ingin mencari artikel yang diawali
dengan karakter %?
Gunakan escape character \, sehingga JPAQLnya menjadi seperti
ini:
from Article a where a.title like '\%'
Bila kita menggunakan lebih dari satu persyaratan, gunakan
keyword and atau or sesuai kebutuhan. Contohnya, kita ingin
mencari artikel yang judulnya diawali huruf A, dan nama
pengarangnya juga diawali dengan huruf A.
from Article a where a.title like 'A
%' and a.author.fullname like 'A%'
Contoh lain, bila kita ingin mencari artikel yang diawali huruf A dan
juga huruf B, JPAQLnya seperti ini.
from Article a where a.title like 'A
%' or a.title like 'B%'
Kita bisa mengurutkan hasil pencarian dengan menggunakan
keyword order by, sama seperti SQL.
Berikut contoh pengurutan artikel berdasarkan judulnya.
String jpaql = “from Article a
“; jpaql += “order by a.title
asc ”;
List<Article> hasil =
Kita menggunakan keyword asc, yang artinya ascending untuk
mengurutkan dari kecil ke besar. Untuk urutan sebaliknya,
gunakan keyword desc, yang artinya descending.
HALAMAN 106 | JAVA
Query untuk Collection
Ada beberapa keyword yang dapat digunakan untuk memanipulasi
collection. Misalnya, kita ingin mencari group yang tidak punya
member.
from Group g where g.members is empty
Atau mencari user yang tergabung dalam grup dengan nama
tertentu.
from User u, Group g where g.name=? and u member
of g.members
Projection
Bila tadi kita sudah menentukan sumber data dengan keyword
from dan batasan hasil dengan keyword where, sekarang kita bisa
menentukan format hasil yang dikeluarkan dengan keyword
select.
Mari kita lihat lagi query user yang menjadi anggota grup.
from User u, Group g where g.name=? and u member
of g.members
Pada query di atas, kita bisa memilih untuk hanya mengambil data
user saja dengan menggunakan select. Query di atas bisa ditulis
menjadi seperti ini:
select u
from User u, Group g
where g.name=? and u member of g.members
Dengan query seperti itu, kita bisa membuat method di class
GroupDao sebagai berikut:
public List<User> membersOf(String groupName)
{ String jpaql = "select u ";
jpaql += "from User u, Group g ";
jpaql += "where g.name = :groupName
"; jpaql += "and u member of
g.members';
return entityManager
.createQuery(jpaql)
.setString("groupName", groupName)
.getResultList();
Join
JPA memiliki kemampuan untuk menggabungkan beberapa objek
sekaligus. Sebagai contoh, kita ingin menampilkan nama penulis
JAVA PERSISTENCE API (JPA) | HALAMAN
Native SQL
Jika JPAQL di atas masih juga tidak mencukupi, kita bisa langsung
mengeksekusi SQL ke database melalui JPA.
Sejauh ini, JPA sudah mencukupi untuk aplikasi blog kita. Tapi
sekedar untuk menambah pengetahuan, mari kita ambil 10 artikel
terbaru dengan menggunakan native SQL MySQL.
SQLnya sebagai berikut
select * from T_ARTICLE
order by publishDate desc limit 0,10
SQL di atas kita gunakan dalam ArticleDao sebagai berikut.
public List<Article> topTenNative() {
String sql = "select * from T_ARTICLE
";
sql += "order by publishDate desc limit 0,10";
return entityManager
.createNativeQuery(sql,Article.class)
.getResultList();
Untuk menggunakannya, kita panggil methodnya seperti biasa.
Client code tidak perlu tahu implementasi internalnya. Dari sisi
client code, sama saja seperti mengakses JPAQL.
JASPER REPORT | HALAMAN
Jasper Report
Pengenalan
Menampilkan report atau laporan merupakan hal yang penting dan
umum digunakan oleh aplikasi manapun, terutama yang bersifat
sistem informasi. Oleh karena itu kita akan membahas bagaimana
membuat desain report, mengisi report dengan data, lalu
memberikan hasilnya kepada pengguna. Dalam Java, terdapat
berbagai teknologi untuk membuat report diantaranya adalah,
● JasperReport, http://jasperreport.sourceforge.net/
● BIRT, http://www.birt-exchange.com/
● Data Vision, http://datavision.sourceforge.net/
JasperReport merupakan reporting tools yang paling populer di
Java dan bahkan beberapa aplikasi PHP menggunakan
JasperReport sebagai solusi untuk menampilkan report.
Instalasi
Persiapan yang perlu kita lakukan adalah:
1. Menginstall Java SDK, versi yang digunakan adalah JDK 1.6.0.
Anda dapat mendownload JDK tersebut dari website
http://java.sun.com
2. Menginstall NetBeans 6.0
3. Menginstall iReport
4. Menginstall MySQL
Java SDK diperlukan sebagai toolkit untuk mengembangkan
aplikasi Java. Di dalamnya terdapat Java compiler, java virtual
machine dan java library standard. Tanpa SDK kita tidak akan bisa
mengembangkan aplikasi Java.
NetBeans adalah IDE (Integrated Development Environment) yang
dikembangkan oleh Sun Microsystems. NetBeans difokuskan untuk
mengembangkan aplikasi java secara produktif, didalamnya
terdapat banyak wizard yang mengotomatisasi pengembangan
aplikasi, menghindarkan developer dari low level configuration
yang rumit.
iReport adalah visual designer untuk membuat reporting
menggunakan library jasperreport. Tanpa iReport development
HALAMAN 110 | JAVA
report menjadi sangat susah dan tidak efisien
MySQL digunakan sebagai basis data yang akan dibuatkan
reportnya.
CREATE DATABASE
ejb3; CREATE TABLE
T_PERSON
GRANT ALL ON belajar.* TO belajar@localhost IDENTIFIED
BY 'java';
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
library-inclusion-in-archive:
library-inclusion-in-manifest:
compile:
compile-report:
Compiling 1 report design
files. File :
/home/ifnu/NetBeansProjects/jasper/jasper/report/
PersonRe port.jrxml ... OK.
BUILD SUCCESSFUL (total time: 4 seconds)
<queryString>
<![CDATA[select * from T_PERSON]]>
</queryString>
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
</jasperReport>
Kita dapat langsung menggunakan file PersonReport.jrxml di atas
agar dapat menampilkan DataSource. Yang perlu dilakukan adalah,
● Hilangkan tag queryString
● Sesuaikan nama field dan tipenya dengan property pada
class Person , sehingga PersonReport.jrxml menjadi,
Berikut file PersonReport.jrxml setelah diubah,
<jasperReport name="PersonReport">
</jasperReport>
Selanjutnya adalah membuat PersonReport.java untuk men-
generate report,
JASPER REPORT | HALAMAN
// Export report
JasperExportManager.exportReportToPdfFil
e(
jasperPrint,
"/home/dhiku/jasper/PersonReport.pdf"
);
}
Mengirim Parameter
Selain DataSource, adapula parameter yang dapat dikirimkan ke
dalam report. Misalkan kita ingin mencetak judul report secara
dinamis yang dikirim dari kode Java. Berikut langkah-langkah
untuk mengirimkan parameter,
1. Siapkan parameter di report
View >
Parameter Klik
New
Isi parameter name,
2. Berikan parameter ke report
// Compile Report dan siapkan DataSource
// Fill Report
JasperPrint jasperPrint
=
JasperFillManager.fillReport(jasperRepor
t, param, dataSource);
Menggunakan Scriptlet
Scriptlet adalah kode Java yang diselipkan pada saat proses fill
report. Proses fill report terdiri dari beberapa tahap, scriptlet dapat
menjalankan kode Java pada sebelum dan sesudah tahap-tahap
tersebut misalnya,
● Sebelum atau sesudah report diinisialisasi
● Sebelum atau sesudah setiap halaman report diinisialisasi
● Sebelum atau sesudah setiap kolom diinisialisasi
● Sebelum atau sesudah setiap group diinisalisasi
● Sebelum atau sesudah setiap baris atau record diinisialisasi
Untuk membuat scriptlet maka kita harus membuat sebuah class
yang meng-extend kelas JRAbstractScriptlet. Berikut contoh
scriptlet yang akan dijalankan setiap sebelum baris diinisialisasi,
JASPER REPORT | HALAMAN
Penutup
Dengan ilmu yang sudah diperoleh dalam pelatihan ini, anda sudah
bisa mulai untuk membuat program Java desktop sederhana. Pada
awalnya pasti terasa sulit, sikapi dengan pantang menyerah dan
selalu cari cara yang lebih baik dalam membuat aplikasi.
Langkah selanjutnya anda bisa mulai aktif bertanya atau menjawab
hal-hal yang berhubungan dengan Java. Media yang bisa digunakan
banyak sekali, bisa forum milis atau diskusi dengan teman. Ini cara
terbaik untuk mengetes apakah pemahaman anda mengenai Java
sudah cukup lengkap atau anda masih perlu belajar lebih banyak
lagi.
Setelah yakin dengan kemampuan anda, berfikirlah untuk
mengambil sertifikasi profesional Java. Pelatihan untuk persiapan
sertifikasi Java banyak tersedia di lembaga pelatihan. Kalau anda
merasa terlalu berat mengambil kursus persiapan sertifikasi,
berlatihlah sendiri menggunakan materi yang banyak tersedia di
internet, misalnya javaranch.com.
Cara belajar Java yang paling efektif adalah dengan melibatkan diri
dalam project berbasis Java. Jika di perusahaan anda tidak
memungkinkan, di luar sana banyak sekali project opensource yang
memerlukan bantuan anda. Berkunjunglah ke website-website open
source project hosting seperti sourceforge.net atau dev.java.net
Learn, Try dan Teach adalah formula untuk meningkatkan
pengetahuan anda tentang Java. Jika sudah belajar dan sukses
mencoba, tularkan ilmu anda pada orang disekeliling anda, dijamin
ilmunya bakalan bertambah berlipat-lipat.
REFERENSI DAN BACAAN LEBIH LANJUT | HALAMAN 123