0% menganggap dokumen ini bermanfaat (0 suara)
255 tayangan

Crud Java Database Connectivity

Dokumen ini memberikan panduan lengkap tentang proses membangun aplikasi Java yang dapat mengakses dan mengelola database MySQL menggunakan JDBC. Langkah-langkahnya meliputi persiapan lingkungan pengembangan, pembuatan proyek dan package, konfigurasi database, pembuatan koneksi dan kelas model, serta pengujian aplikasi.

Diunggah oleh

Nurhidayat Mmd
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
255 tayangan

Crud Java Database Connectivity

Dokumen ini memberikan panduan lengkap tentang proses membangun aplikasi Java yang dapat mengakses dan mengelola database MySQL menggunakan JDBC. Langkah-langkahnya meliputi persiapan lingkungan pengembangan, pembuatan proyek dan package, konfigurasi database, pembuatan koneksi dan kelas model, serta pengujian aplikasi.

Diunggah oleh

Nurhidayat Mmd
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 30

JAVA DATABASE CONNECTIVITY

Proses manage database mysql menggunakan JDBC

1/24/2016
Muhammad Nurhidayat

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 meningkatkat
pengetahuan 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

CHAPTER 01

PERSIAPAN DAN KONFIGURASI

Java adalah bahasa pemrograman yang diluncurkan sejak tahun


1990, java memiliki tiga edisi :
- Java SE
Java 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 EE
Java 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,

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 akan
dijelaskan 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.

3. Pilih menu Tools Plugin Pilih Tab Downloaded klik add


Plugins dan arahkan kefolder dimana plugin jasperreport
disimpan.

Gambar 1 Browse Plugin Jasperreport


Klik open klik install untuk memasang finish.
Untuk dapat menggunakan fasilitas Jasper dengan sempurna
maka restart dahulu Netbeans dan jasper telah siap
digunakan.

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 Pekerjaan
7. 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 file New Project Java Java Application

Kemudian next Isikan Nama Project Pengolahan Data

kemudian Finish.

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 New Java Package

Pada file package name isikan dengan nama


com.yyaayyaatt.form Finish.
Kemudian buatlah package lagi sesuai dengan gambar
berikut ini.

3. Pembuatan Database
Pada langkah ini buatlah database dengan nama
Pengolahan_Data dan buat table dengan nama
pegawai dan 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.

Setelah itu jalankan browser(Mozilla firefox, google


crome, internet explorer). Pada kolom URL di browser
isikan localhost/phpmyadmin untuk masuk kedalam
mysql.

Gambar diatas adalah tampilan setelah mengakses


phpmyadmin.
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

Sekarang kita buat tablenya dengan ketentuan diatas.


Table yang akan dibuat pertama adalah table Pegawai,
caranya:
Klik database pada panel kiri browser isikan nama table
dan jumlah kolomnya klik kirim

Selanjutnya isikan nama, jenis, panjang sesuai dengan


ketentuan. Lihat gambar dibawah ini.

Setting indeks dari nama id menjadi PRIMARY dan


AUTO_INCREMENT.

Kemudian klik Simpan.

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 Koneksi huruf awal besar

klik Finish. Class koneksi akan secara otomatis terbuka


dan hasilnya seperti ini.

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
import
import
import
import
import

java.sql.Connection;
java.sql.DriverManager;
java.sql.SQLException;
java.util.logging.Level;
java.util.logging.Logger;
javax.swing.JOptionPane;

public class DBConnection {


private Connection koneksi;
//untuk koneksi ke driver mysql
public 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(Lev
el.SEVERE, null, ex);
System.out.println("gagal load Drivernya "
+ ex);
}
//untuk koneksi database
try {
String url =
"jdbc:mysql://localhost:3306/pengolahan_data";//nama
database yang akan dibuat

koneksi =
DriverManager.getConnection(url,"root","");
System.out.println("Berhasil Konek ke
database");
} catch (SQLException ex) {
Logger.getLogger(DBConnection.class.getName()).log(Lev
el.SEVERE, null, ex);
System.out.println("Gagal Konek ke
database");
JOptionPane.showMessageDialog(null, "Gagal
Koneksi","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 package
com.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;

private
private
private
private

String
String
String
String

alamat;
telp;
jabatan;
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) {

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, String
nm_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;

}
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.

Ubah script menjadi seperti dibawah ini.

tambahkan import diantara package dan class, dari baris 8


13.

Tambahkan script pada akhir class, lihat gambar diatas.


Isikan sebelum tanda kurung kurawal paling akhir.
private void input_data() {
//panggil method koneksi
java.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
kembali
txt_id.setText("");
txt_nama.setText("");
//panggil method tampil disini
tampil_data();
stmt.close();
} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(L
evel.SEVERE, null, ex);
}
}
public void tampil_data() {
Object[] baris = {"ID PEKERJAAN", "NAMA
PEKERJAAN"};

tableModel = new DefaultTableModel(null, baris);


tabel_pekerjaan.setModel(tableModel);
//panggil method koneksi
java.sql.Connection conn = new
DBConnection().connect();
//listing untuk menampilkan data kedalam tabel
String 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 VB
stmt = 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(L
evel.SEVERE, null, ex);
}
}
private void update_data() {
//panggil method koneksi seperti biasa
java.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");

tampil_data();
} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(L
evel.SEVERE, null, ex);
}
}
private void hapus_data() {
//panggil method koneksi terlebih dahulu
java.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 dihapus
txt_id.setText("");
txt_nama.setText("");
tampil_data();
} catch (SQLException ex) {
Logger.getLogger(FormMasterPekerjaan.class.getName()).log(L
evel.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();

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)

dispose();

Script Klik Tabel (Event Mouse Click)


klik_tabel();

terakhir ubahlah menjadi seperti ini.

7. Form Master Pegawai

Untuk variable name bisa dilihat pada gambar di halaman


berikutnya.

Ubah Script menjadi seperti dibawah ini.


package com.yyaayyaatt.form;
import
import
import
import
import
import
/**
*

com.yyaayyaatt.koneksi.DBConnection;
java.sql.SQLException;
java.util.logging.Level;
java.util.logging.Logger;
javax.swing.JOptionPane;
javax.swing.table.DefaultTableModel;

* @author Lenovo
*/
public class FormMasterPegawai extends
javax.swing.JInternalFrame {
DefaultTableModel tableModel;
/**
* Creates new form FormMasterPegawai
*/
public FormMasterPegawai() {
initComponents();
//dibawah saya
tampil_data();
comboPekerjaan();
}
private void input_data() {
//panggil method koneksi
java.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
kembali
txt_id_pegawai.setText("");
txt_nm_lengkap.setText("");
txt_alamat.setText("");
txt_telp.setText("");
//panggil method tampil disini

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 koneksi
java.sql.Connection conn = new
DBConnection().connect();
//listing untuk menampilkan data kedalam tabel
String 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

java.sql.Connection conn = new


DBConnection().connect();
//listing untuk menampilkan data kedalam tabel
String 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 VB
stmt = 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 data
input_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

10. Uji Coba Aplikasi


Tutorial ini masih sedang dikerjakan lebih lanjut :D

Anda mungkin juga menyukai