crud java database connectivity
Post on 25-Feb-2018
254 Views
Preview:
TRANSCRIPT
-
7/25/2019 Crud Java Database Connectivity
1/30
JAVA DATABASE CONNECTIVITYProses manage database mysql menggunakan JDBC
1/24/2016
Muhammad Nurhidayat
-
7/25/2019 Crud Java Database Connectivity
2/30
PRAKATA
Syukur Alhamdulillah kepada Allah SWT. Yang telah
memberikan kemampuan dan nikmatnya sehingga tutorial ini
dapat diselesaikan, semoga apa yang tertulis dapat berguna dan
bermanfaat untuk kemajuan technologi dan meningkatkatpengetahuan serta kemampuan sumber daya manusia dalam hal
pemrograman khususnya pemrograman berbahasa Java.
Akhirnya, berkat support dari semua teman-teman
dibuatlah tutorial ini, walaupun sederhana dan hanya beberapa
halaman saja, silahkan digunakan sebagai referensi untuk belajar
semoga mudah dipahami dan di praktekkan, terimakasih.
24 Januari 2016
MuhammadNurhidayat
-
7/25/2019 Crud Java Database Connectivity
3/30
CHAPTER 01
PERSIAPAN DAN KONFIGURASI
Java adalah bahasa pemrograman yang diluncurkan sejak tahun
1990, java memiliki tiga edisi :
-
Java SEJava SE atau Standard Edition digunakan untuk membangun
aplikasi Desktop, aplikasi yang berjalan didalam satu piranti dan
hanya dapat diakses dari piranti tersebut.
- Java ME
Java ME atau Micro Edition digunakan untuk membangun aplikasi
berbasis Mobile, aplikasi ini berjalan didalam perangkat mobile
atau handphone dengan OS java.
-
Java EEJava EE atau Enterprise Edition digunakan untuk membangun
aplikasi Website, untuk menjalankan aplikasi Enterprise kita
memerlukan web server Tomcat atau glashfish, dan untuk
menjalankan aplikasinya kita bisa menggunakan browser.
Sekilas tentang penjelasan singkat dari ketiga edisi yang ada pada
java, yang akan dibahas dalam tutorial ini yaitu Java SE dengan
menggunakan database MySQL dan Library JDBC yang akan
menghubungkan aplikasi dengan database.
Sebelum memulai pembuatan aplikasi, ada beberapa persiapan
yang harus terpenuhi terlebih dahulu, yaitu sebagai berikut:
1. Netbeans IDE
Netbeans IDE adalah aplikasi yang akan digunakan untuk
membuat aplikasi java, bisa dibilang netbeans ini adalah editor
yang direkomendasikan untuk membangun aplikasi berbasis java,
-
7/25/2019 Crud Java Database Connectivity
4/30
netbeans dapat diinstall setelah JDK terpasang. Aplikasi dapat di
download di website resminya yaitu netbeans.org.
2.
Java Development Kit(JDK)Java Development Kit adalah logic dari bahasa pemrograman java,
pemrograman java tidak lepas dari JDK karena sebenarnya JDK
inilah inti dari pemrograman java tiu sendiri. Semua class
diambildari JDK. Aplikasi JDK dapat di download di website
resminya yaitu oracle.com.
3. Xampp
Xampp adalah aplikasi yang menggabungkan beberapa aplikasi
lain didalamnya, hanya dengan install xampp, kita dapat langsung
menggunakan beberapa aplikasi diantaranya yaitu Apache,
MySQL, Filezilla, Mercury dan Tomcat.
4. Plugin Jasperreport for Netbeans
Plugin Jasperreport adalah plugin khusus untuk Netbeans IDE,
fungsinya untuk membangun report atau laporan dalam aplikasi.
Dapat mendesai tampilan report sesuai keinginan dan
menampilkan data dari table pada database MySQL, dengan
menggunakan jasperreport kita dapat menyimpan laporan
kedalam bentuk file lain seperti PDF, docx, xlsx dan jasper itu
sendiri.
Instalasi Netbeans, xampp dan JDk tidak dijelaskan disini
karena prosesnya sangat mudah untuk dilakukan, bahkan
mahasiswa jurusan selain komputerpun bisa melakukannya, dan
untuk mempersingkat tutorial juga. :D
Instalasi plugin jasperreport pada netbeans yang akandijelaskan disini, karena ini jarang dijelaskan pada tutorial lain, dan
supaya proses pembuatan aplikasi tidak menemukan kendala saat
desain report nantinya, perhatikan baik-baik cara instalasi plugin
jasper pada netbeans berikut ini.
A. Instalasi Plugin Jasperreport
Langkah-langkah instalasi plugin jasperreport:
1. Download dahulu plugin Jasperreport, dicari di google.
2.
Jalankan Aplikasi netbeans IDE.
-
7/25/2019 Crud Java Database Connectivity
5/30
3. Pilih menu ToolsPluginPilih Tab Downloadedklik add
Plugins dan arahkan kefolder dimana plugin jasperreport
disimpan.
Gambar 1 Browse Plugin JasperreportKlik openklik install untuk memasangfinish.
Untuk dapat menggunakan fasilitas Jasper dengan sempurna
maka restart dahulu Netbeans dan jasper telah siap
digunakan.
-
7/25/2019 Crud Java Database Connectivity
6/30
CHAPTER 02
PROSES MEMBANGUN APLIKASI
Chapter kedua ini akan membahas tentang proses
membangun aplikasi, diantaranya ialah pembuatan project,
package, class dan masih banyak lagi yang lainnya.Langkah-langkah membangun aplikasi pada netbeans, yaitu
sebagai berikut:
1. Pembuatan Project
2. Pembuatan Package
3. Pembuatan Database
4. Class Koneksi
5. Class Model
6.
Form Master Pekerjaan7. Form Master Pegawai
8. Form Main Frame
9. Class Main Project
10.Uji Coba Aplikasi
Ada sekitar 10 langkah untuk membuat aplikasi Java
menggunakan JDBC, ikutilah langkah diatas sampai selesai
sesuai dengan urutannya.
Langkah pertama adalah Pembuatan Project.1. Pembuatan Project
Langkah pertama itu buatlah project, dengan cara jalankan
Netbeans terlebih dahulu.
Pilih fileNew ProjectJavaJava Application
-
7/25/2019 Crud Java Database Connectivity
7/30
Kemudian nextIsikan Nama Project Pengolahan Data
kemudian Finish.
-
7/25/2019 Crud Java Database Connectivity
8/30
Setelah selesai maka susunan project akan terlihat seperti
pada gambar dibawah ini.
2. Pembuatan Package
Setelah selesai membuat project dengan nama
Pengolahan Data selanjutnya buatlah package untuk
memisahkan antara desain dan logic dalam aplikasi
sehingga tidak bingung jika terjadi perubahan logic atau
desain.Cara pembuatan package adalah klik kanan pada project
pilih NewJava Package
-
7/25/2019 Crud Java Database Connectivity
9/30
Pada file package name isikan dengan nama
com.yyaayyaatt.formFinish.
Kemudian buatlah package lagi sesuai dengan gambarberikut ini.
3. Pembuatan Database
Pada langkah ini buatlah database dengan nama
Pengolahan_Data dan buat table dengan namapegawaidan pekerjaan.
Pertama pastikan apakah MySQL sudah start atau belum,
cara mengeceknya, masuk kedalam direktori instalasi
xampp, secara defafult terletak pada C://xampp, jalankan
file xampp-control.exe kemudian jalankan apache dan
MySQLnya.
-
7/25/2019 Crud Java Database Connectivity
10/30
Setelah itu jalankan browser(Mozilla firefox, google
crome, internet explorer). Pada kolom URL di browser
isikan localhost/phpmyadmin untuk masuk kedalammysql.
Gambar diatas adalah tampilan setelah mengaksesphpmyadmin.
Selanjutnya klik Basis data Isikan Nama Database
klik Buat atau Create dan database akan segera dibuat.
Selanjutnya buatlah 2 tabel didalam database yaitu :
a. Pegawai
- Id (int) 11 PRIMARY KEY AUTO_INCREMENT
- Nama (varchar) 50
-
Alamat (varchar) 50
- Jabatan (varchar) 50
- jk (varchar) 50
b. Pekerjaan
- Id_pekerjaan(int) 11 PRIMARY KEY AUTO_INCREMENT
- Nm_pekerjaan (varchar) 50
-
7/25/2019 Crud Java Database Connectivity
11/30
Sekarang kita buat tablenya dengan ketentuan diatas.
Table yang akan dibuat pertama adalah table Pegawai,
caranya:Klik database pada panel kiri browserisikan nama table
dan jumlah kolomnyaklik kirim
Selanjutnya isikan nama, jenis, panjang sesuai denganketentuan. Lihat gambar dibawah ini.
-
7/25/2019 Crud Java Database Connectivity
12/30
Setting indeks dari nama id menjadi PRIMARY dan
AUTO_INCREMENT.
Kemudian klik Simpan.
-
7/25/2019 Crud Java Database Connectivity
13/30
Untuk membuat table pekerjaan, caranya sama
saja seperti membuat table pegawai, silahkan lanjutkan
membuat table pekerjaan.
4. Class Koneksi
Pada langkah keempat ini, kembali lagi kedalam aplikasi
Netbeans. Pada langkah ini kita akan membuat class
koneksi.java yang berfungsi untuk menghubungkan antara
aplikasi dengan database pada mysql.
Cara membuatnya:
Klik kanan pada package com.yyaayyaatt.koneksi
pilih New pilih Java Class kemudian isikan nama
classnya dengan nama Koneksihuruf awal besar
klik Finish. Class koneksi akan secara otomatis terbuka
dan hasilnya seperti ini.
-
7/25/2019 Crud Java Database Connectivity
14/30
Penjelasan :
Line 1 menjelaskan tempat dimana class koneksi berada.Line 3 menjelaskan nama classnya.
Ubah class koneksi menjadi seperti berikut:
package com.yyaayyaatt.koneksi;
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JOptionPane;
public class DBConnection {private Connection koneksi;//untuk koneksi ke driver mysqlpublic Connection connect(){
try {Class.forName("com.mysql.jdbc.Driver");System.out.println("Berhasil load
Drivernya");// untuk mengetahui kalau driver berhasil doload
} catch (ClassNotFoundException ex) {
Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("gagal load Drivernya "+ ex);
}//untuk koneksi databasetry {String url =
"jdbc:mysql://localhost:3306/pengolahan_data";//namadatabase yang akan dibuat
-
7/25/2019 Crud Java Database Connectivity
15/30
koneksi =DriverManager.getConnection(url,"root","");
System.out.println("Berhasil Konek ke
database");} catch (SQLException ex) {
Logger.getLogger(DBConnection.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Gagal Konek kedatabase");
JOptionPane.showMessageDialog(null, "GagalKoneksi","Peringatan",
JOptionPane.WARNING_MESSAGE);}
return koneksi;}
}
Penjelasan:String url ="jdbc:mysql://localhost:3306/pengolahan_data";
Teks yang di blok kuning adalah nama database yang akan
dipakai.koneksi = DriverManager.getConnection(url,"root","");
blok kuning adalah url lokasi database.
Blok hijau adalah username default dari mysql.Blok biru adalah password dari mysql, jika tidak ada
passwordnya tinggal kosongkan saja.
5. Class Model
Class model ini digunakan untuk menampung nilai yang
akan dimasukkan kedalam database atau yang akan di
tampilkan kedalam form.
Cara membuatnya, klik kanan pada packagecom.yyaayyaatt.model New Java Class isikan
class name dengan nama Pegawai huruf awal besar
Finish.
Kemudian ubahlah scriptnya menjadi seperti dibawah ini.
package com.yyaayyaatt.model;
public class Pegawai {
private String id;private String nama;
-
7/25/2019 Crud Java Database Connectivity
16/30
private String alamat;private String telp;private String jabatan;
private String jk;
//prosedure
public Pegawai() {}
public Pegawai(String id, String nama, String alamat,String telp, String jabatan, String jk) {
this.id = id;this.nama = nama;
this.alamat = alamat;this.telp = telp;this.jabatan = jabatan;this.jk = jk;
}//getter setter
public String getId() {return id;
}
public void setId(String id) {this.id = id;}
public String getNama() {return nama;
}
public void setNama(String nama) {this.nama = nama;
}
public String getAlamat() {return alamat;
}
public void setAlamat(String alamat) {this.alamat = alamat;
}
public String getTelp() {return telp;
}
public void setTelp(String telp) {
-
7/25/2019 Crud Java Database Connectivity
17/30
this.telp = telp;}
public String getJabatan() {return jabatan;
}
public void setJabatan(String jabatan) {this.jabatan = jabatan;
}
public String getJk() {return jk;
}
public void setJk(String jk) {this.jk = jk;
}}
Selanjutnya buat lagi class java didalam package yang
sama dengan class namenya Pekerjaan, kemudian ubah
scriptnya menjadi seperti dibawah ini.
package com.yyaayyaatt.model;
public class Pekerjaan {private String id_pekerjaan;private String nm_pekerjaan;
public Pekerjaan() {}
public Pekerjaan(String id_pekerjaan, Stringnm_pekerjaan) {
this.id_pekerjaan = id_pekerjaan;
this.nm_pekerjaan = nm_pekerjaan;}
public String getId_pekerjaan() {return id_pekerjaan;
}
public void setId_pekerjaan(String id_pekerjaan) {this.id_pekerjaan = id_pekerjaan;
}
public String getNm_pekerjaan() {return nm_pekerjaan;
-
7/25/2019 Crud Java Database Connectivity
18/30
}
public void setNm_pekerjaan(String nm_pekerjaan) {
this.nm_pekerjaan = nm_pekerjaan;}
}
Selesailah pembuatan modelnya dan lanjut kelangkah
selanjutnya.
6. Form Master Pekerjaan
Form ini digunakan untuk menginputkan master
pekerjaan, data yang diinput akan digunakan saat
menginput data Master Pegawai.
Berikut ini desain dari Form Master Pekerjaan.
Untuk variable name lihat gambar dibawah ini.
-
7/25/2019 Crud Java Database Connectivity
19/30
Ubah script menjadi seperti dibawah ini.
tambahkan import diantara package dan class, dari baris 8
13.
-
7/25/2019 Crud Java Database Connectivity
20/30
Tambahkan script pada akhir class, lihat gambar diatas.
Isikan sebelum tanda kurung kurawal paling akhir.private void input_data() {//panggil method koneksijava.sql.Connection conn = new
DBConnection().connect();
try {String sql = "insert into
pekerjaan(id_pekerjaan,nm_pekerjaan) values(?,?)";java.sql.PreparedStatement stmt =
conn.prepareStatement(sql);
stmt.setString(1, txt_id.getText());stmt.setString(2, txt_nama.getText());
stmt.executeUpdate();JOptionPane.showMessageDialog(null, "Data
Berhasil disimpan");//setelah selesai disimpan maka text akan ksong
kembalitxt_id.setText("");txt_nama.setText("");//panggil method tampil disinitampil_data();
stmt.close();} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(Level.SEVERE, null, ex);
}}
public void tampil_data() {
Object[] baris = {"ID PEKERJAAN", "NAMAPEKERJAAN"};
-
7/25/2019 Crud Java Database Connectivity
21/30
tableModel = new DefaultTableModel(null, baris);tabel_pekerjaan.setModel(tableModel);
//panggil method koneksijava.sql.Connection conn = new
DBConnection().connect();
//listing untuk menampilkan data kedalam tabelString sql = "Select * From pekerjaan order by
id_pekerjaan asc";java.sql.Statement stmt;try {// block try berguna untuk menangkap apabila
terjadi kesalahann sehingga tidak terjadi debug seperti VBstmt = conn.createStatement();
java.sql.ResultSet rslt =stmt.executeQuery(sql);while (rslt.next()) {
String id = rslt.getString("id_pekerjaan");String pekerjaan =
rslt.getString("nm_pekerjaan");String[] data = {id, pekerjaan};tableModel.addRow(data);
}} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(Level.SEVERE, null, ex);}
}
private void update_data() {//panggil method koneksi seperti biasajava.sql.Connection conn = new
DBConnection().connect();
String sql = "Update pekerjaan set nm_pekerjaan=? "+ "where id_pekerjaan =
'"+txt_id.getText()+"'";java.sql.PreparedStatement stmt = null;
try {stmt = conn.prepareStatement(sql);
stmt.setString(1, txt_nama.getText());
stmt.executeUpdate();JOptionPane.showMessageDialog(null, "Data
Berhasil diubah");
-
7/25/2019 Crud Java Database Connectivity
22/30
tampil_data();
} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(Level.SEVERE, null, ex);
}}
private void hapus_data() {//panggil method koneksi terlebih dahulujava.sql.Connection conn = new
DBConnection().connect();
int yes =JOptionPane.showConfirmDialog(FormMasterPekerjaan.this,"Apakah anda
yakin?","Konfirmasi",JOptionPane.YES_NO_OPTION);if (yes==0) {
try {String sql = "delete from pekerjaan where
id_pekerjaan = '"+txt_id.getText()+"'";java.sql.PreparedStatement stmt =
conn.prepareStatement(sql);
stmt.executeUpdate();
JOptionPane.showMessageDialog(FormMasterPekerjaan.this,"Data Berhasil dihapus.");
//untuk mengosongkan data setelah dihapustxt_id.setText("");txt_nama.setText("");
tampil_data();} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(FormMasterPekerjaan.this,"Data gagal dihapus.");
}}
}
private void klik_tabel() {int baris = tabel_pekerjaan.getSelectedRow();String idx = tableModel.getValueAt(baris,
0).toString();
-
7/25/2019 Crud Java Database Connectivity
23/30
String namax= tableModel.getValueAt(baris,1).toString();
txt_id.setText(idx);txt_nama.setText(namax);
}
Script Button tambah (Event Action Performed)
if (txt_id.getText().equals("") || txt_nama.getText().equals("")) {JOptionPane.showMessageDialog(FormMasterPekerjaan.this,
"Data Masih Kosong!!!", "Peringatan", JOptionPane.WARNING_MESSAGE);} else {
//disini kita panggil method Simpan data
input_data();}
Script Button Ubah (Event Action Performed)
if (txt_id.getText().equals("") || txt_nama.getText().equals("")) {JOptionPane.showMessageDialog(FormMasterPekerjaan.this,
"Data Masih Kosong!!!", "Peringatan", JOptionPane.WARNING_MESSAGE);} else {
//disini kita panggil method Update data
update_data();}
Script Button Hapus (Event Action Performed)
if (txt_id.getText().equals("") || txt_nama.getText().equals("")) {JOptionPane.showMessageDialog(FormMasterPekerjaan.this,
"Data Masih Kosong!!!", "Peringatan", JOptionPane.WARNING_MESSAGE);} else {
//disini kita panggil method Hapus data
hapus_data();}
Script Button Batal (Event Action Performed)
txt_id.setText("");txt_nama.setText("");
txt_id.requestFocusInWindow();
Script Button Keluar (Event Action Performed)
-
7/25/2019 Crud Java Database Connectivity
24/30
dispose();
Script Klik Tabel (Event Mouse Click)klik_tabel();
terakhir ubahlah menjadi seperti ini.
7.
Form Master Pegawai
-
7/25/2019 Crud Java Database Connectivity
25/30
Untuk variable name bisa dilihat pada gambar di halaman
berikutnya.
-
7/25/2019 Crud Java Database Connectivity
26/30
Ubah Script menjadi seperti dibawah ini.package com.yyaayyaatt.form;
import com.yyaayyaatt.koneksi.DBConnection;import java.sql.SQLException;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JOptionPane;import javax.swing.table.DefaultTableModel;
/***
-
7/25/2019 Crud Java Database Connectivity
27/30
* @author Lenovo*/
public class FormMasterPegawai extends
javax.swing.JInternalFrame {
DefaultTableModel tableModel;
/*** Creates new form FormMasterPegawai*/public FormMasterPegawai() {
initComponents();//dibawah sayatampil_data();
comboPekerjaan();}private void input_data() {
//panggil method koneksijava.sql.Connection conn = new
DBConnection().connect();
try {String sql = "insert into
pegawai(id,nama,alamat,telp,jabatan,jk) values(?,?,?,?,?,?)";java.sql.PreparedStatement stmt =
conn.prepareStatement(sql);
stmt.setString(1, txt_id_pegawai.getText());stmt.setString(2, txt_nm_lengkap.getText());stmt.setString(3, txt_alamat.getText());stmt.setString(4, txt_telp.getText());stmt.setString(5,
cmb_jabatan.getSelectedItem().toString());if (rBtn_laki2.isSelected()) {
stmt.setString(6, rBtn_laki2.getText());} else if (rBtn_perempuan.isSelected()) {
stmt.setString(6, rBtn_perempuan.getText());}
stmt.executeUpdate();JOptionPane.showMessageDialog(null, "Data Berhasil
disimpan");//setelah selesai disimpan maka text akan ksong
kembalitxt_id_pegawai.setText("");txt_nm_lengkap.setText("");txt_alamat.setText("");txt_telp.setText("");
//panggil method tampil disini
-
7/25/2019 Crud Java Database Connectivity
28/30
tampil_data();
stmt.close();
} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(Level.SEVERE, null, ex);
}}
public void tampil_data() {Object[] baris = {"ID", "NAMA PEGAWAI", "ALAMAT",
"TELEPON", "JABATAN", "JENIS KELAMIN"};tableModel = new DefaultTableModel(null, baris);
tbl_pegawai.setModel(tableModel);
//panggil method koneksijava.sql.Connection conn = new
DBConnection().connect();
//listing untuk menampilkan data kedalam tabelString sql = "Select * From pegawai order by id asc";java.sql.Statement stmt;try {// block try berguna untuk menangkap apabila
terjadi kesalahann sehingga tidak terjadi debug seperti VB
stmt = conn.createStatement();java.sql.ResultSet rslt = stmt.executeQuery(sql);while (rslt.next()) {
String id_karyawan = rslt.getString("id");String nama_karyawan = rslt.getString("nama");String alamat = rslt.getString("alamat");String telp = rslt.getString("telp");String jabatan = rslt.getString("jabatan");String jk = rslt.getString("jk");String[] data = {id_karyawan, nama_karyawan,
alamat, telp, jabatan, jk};tableModel.addRow(data);
}} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void comboPekerjaan() {
//panggil method koneksi
-
7/25/2019 Crud Java Database Connectivity
29/30
java.sql.Connection conn = newDBConnection().connect();
//listing untuk menampilkan data kedalam tabelString sql = "Select * From pekerjaan order by
id_pekerjaan asc";java.sql.Statement stmt;try {// block try berguna untuk menangkap apabila
terjadi kesalahann sehingga tidak terjadi debug seperti VBstmt = conn.createStatement();java.sql.ResultSet rslt = stmt.executeQuery(sql);while (rslt.next()) {
String nama_karyawan =rslt.getString("nm_pekerjaan");
cmb_jabatan.addItem(nama_karyawan);}} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(Level.SEVERE, null, ex);
}
}
Script Button Tambah// TODO add your handling code here:
if (txt_id_pegawai.getText().equals("") ||txt_nm_lengkap.getText().equals("")) {
JOptionPane.showMessageDialog(FormMasterPegawai.this, "Data Masih
Kosong!!!","Peringatan",
JOptionPane.WARNING_MESSAGE);} else {
//disini kita panggil method Simpan datainput_data();
}
Script Hapus, edit, batal dan keluar coba dikerjakan sendiri
berdasarkan Form Master Pekerjaan, karena intinya sama,
yang membedakan hanya nama field dan nama table
databasenya. :D
8. Form Main Frame
9.
Class Main Project
-
7/25/2019 Crud Java Database Connectivity
30/30
10.Uji Coba Aplikasi
Tutorial ini masih sedang dikerjakan lebih lanjut :D
top related