Halo kembali lagi di blog saya, jadi kali ini saya akan membahas tentang kelanjutan dari Optimalisasi JDBC dengan JavaBeans yaitu tadinya kita memisahkan antara yang sifatnya value dengan sturuktur JDBCnya. Sekarang kita akan memecah kembali karena khan pada dasarnya klo kita ngoding untuk bikin apalikasi tidak hanya untuk 1 tabel tapi bisa menjadi ratusan tabel bahkan ribuan table dalam 1 database, jadi disini kita bakalan membahas tentang modularisasi dengan konsep Repository.

Nah sebelum kita melanjutkan ke topik utama sebelumnya sama mau menambahkan dulu tabel untuk database yang kemarin yaitu jdbc_mysql yang berelasi ke table mahasiswa yaitu jurusan. berikut adalah perintah sqlnya:

drop database if exists jdbc_mysql;
create database if not exists jdbc_mysql;
use jdbc_mysql;
CREATE TABLE IF NOT EXISTS mahasiswa(
nim varchar(8) primary key,
nama varchar(25) not null,
id_jurusan varchar(2) not null
)engine = InoDB;
CREATE TABLE IF NOT EXISTS JURUSAN(
id varchar(2) primary key,
nama varchar(25) not null
)engine = InoDB;

silahkan eksekusi kemudian check hasilnya maka akan menampilkan output seperti berikut:

MariaDB [jdbc_mysql]> drop database if exists jdbc_mysql;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> create database if not exists jdbc_mysql;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use jdbc_mysql;
Database changed
MariaDB [jdbc_mysql]> CREATE TABLE IF NOT EXISTS mahasiswa(
    ->     nim varchar(8) primary key,
    ->     nama varchar(25) not null,
    ->     id_jurusan varchar(2) not null
    -> );
Query OK, 0 rows affected (0.26 sec)

MariaDB [jdbc_mysql]>
MariaDB [jdbc_mysql]> CREATE TABLE IF NOT EXISTS JURUSAN(
    ->     id varchar(2) primary key,
    ->     nama varchar(25) not null
    -> );
Query OK, 0 rows affected (0.19 sec)

MariaDB [jdbc_mysql]>

kemudian setelah itu kita buat kelas baru dengan nama Jurusan.java seperti berikut:

import java.io.Serializable;
public class Jurusan implements Serializable {
public Jurusan() {
}
public Jurusan(String id, String nama) {
this.id = id;
this.nama = nama;
}
private String id;
private String nama;
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;
}
}
view raw Jurusan.java hosted with ❤ by GitHub

Kemudian setelah itu kita update kelas Mahasiswa.java atau supaya tidak menggangu kelas yang sebelumnya kita buat ja kelas baru misalnya MahasiswaUpdated.java seperti berikut:

package model;
/**
*
* @author dimMaryanto
*/
public class MahasiswaUpdated {
private String nim;
private String nama;
private Jurusan jurusan;
public String getNim() {
return nim;
}
public void setNim(String nim) {
this.nim = nim;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public Jurusan getJurusan() {
return jurusan;
}
public void setJurusan(Jurusan jurusan) {
this.jurusan = jurusan;
}
}

Jadi kita hanya mengganti tipe data yang tadinya

private String jurusan;

public void setJurusan(String jurusan){
  this.jurusan = jurusan;
}

public String getJurusan(){
  return this.jurusan;
}

Menjadi seperti berikut:

private Jurusan jurusan;

public void setJurusan(Jurusan jurusan){
  this.jurusan = jurusan;
}

public Jurusan getJurusan(){
  return this.jurusan;
}

Ok, sekarang kit kembali ke topik tentang bagaimana cara memodularisasi JDBC dengan konsep repository. Jadi konsep ini sebenarnya adalah MVC + S yaitu Model View Controller + Service, jadi service inilah yang disebut repository. jadi kita menyediakan sebuah layanan yang dinamis dan biasanya diterpkannya menggunakan interface. yang jadi kenapa penggunakan interface? gak pake kelas biasanya yaitu tujuannya sederhana supaya suatu saat kita mau data tersebut di open ke RMI (Romote Method Invocation) bisa gampang tinggal implementasikan interface tersebut setelah itu kita buat implementasi klasnya.

Selanjutnya kita terapkan ke koding yang kita buat untuk kelas Mahasiswa dan Jurusan tapi pertama saya mau membuat yang jurusan dulu.

Getting started

Pertama anda buat dulu package dalam belajar.jdbc dengan nama repo jadi seperti berikut:

Package Repo

Kemudian buat interface dengan nama RepositoryJurusan.java seperti berikut:

Klik kanan di folder atau source repo kemudian New File maka akan tampil form seperti berikut:

New interface

Di menu categories pilih Java kemudian di File Type pilih Java Interface kemudian klik Next maka akan tampil form sebagai berikut:

New File Interface

Kemudian di Class name input RepositoryJurusan maka hasilnya seperti berikut:

package belajar.jdbc.repo;

/**
 *
 * @author dimMaryanto
 */
public interface RepositoryJurusan {

}

Setelah itu, kita bisa tambahkan fungsi-fungsi abstract karena kita khan cuman menggunakan database jadi ya kurang lebih fungsi yang kita gunakan yaitu

  • insert
  • update
  • delete
  • findById
  • selectAll.

Maka berikut implementasinya:

package belajar.jdbc.repo;
import belajar.jdbc.model.Jurusan;
import java.sql.SQLException;
import java.util.List;
/**
*
* @author dimMaryanto
*/
public interface RepositoryJurusan {
public List<Jurusan> selectAll() throws SQLException;
public Jurusan save(Jurusan jurusan) throws SQLException;
public Jurusan update(Jurusan jurusan) throws SQLException;
public void delete(String id) throws SQLException;
public Jurusan findById(String id) throws SQLException;
}

Nah jadi dalam interface RepositoryJurusan itu, kita hanya mendefinisikan method-method kosong, kemudian kita buat package baru dengan nama belajar.jdbc.service seperti berikut:

Package service

Kemudian didalam package tersebut anda buat kelas baru dengan nama ServiceJurusan maka hasilnya seperti berikut:

package belajar.jdbc.service;

/**
 *
 * @author dimMaryanto
 */
public class ServiceJurusan {

}

Kemudian implements interface RepositoryJurusan seperti berikut:

package belajar.jdbc.service;

import belajar.jdbc.repo.RepositoryJurusan;

public class ServiceJurusan implements RepositoryJurusan{

}

Setelah itu, ada error nih di Netbeans nya seperti berikut:

Error Implement all abastract method

Ini karena ada method yang harus di implement oleh kelas tersebut, caranya untuk mengenerate method-method yang harus implementasikan yaitu klik lampu yang merah itu terus pilih Implement all abstract methods maka hasil generatenya seperti berikut:

package belajar.jdbc.service;

import belajar.jdbc.model.Jurusan;
import belajar.jdbc.repo.RepositoryJurusan;
import java.sql.SQLException;
import java.util.List;

/**
 *
 * @author dimMaryanto
 */
public class ServiceJurusan implements RepositoryJurusan{

    @Override
    public List<Jurusan> selectAll() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Jurusan save(Jurusan jurusan) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Jurusan update(Jurusan jurusan) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void delete(String id) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Jurusan findById(String id) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

Nah sekarang kita tinggal ganti dengan fungsi-fungsi yang seharunya seperti insert, update, delete, select data dari database. karena kita udah punya kita bisa copy-paste kemudian modifikasi menjadi seperti berikut:

package belajar.jdbc.service;
import belajar.jdbc.model.Jurusan;
import belajar.jdbc.repo.RepositoryJurusan;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author dimMaryanto
*/
public class ServiceJurusan implements RepositoryJurusan {
@Override
public List<Jurusan> selectAll() throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "select * from jurusan";
List<Jurusan> daftarJurusan = new ArrayList<>();
Statement st = koneksi.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
Jurusan m = new Jurusan(rs.getString(1), rs.getString(2));
daftarJurusan.add(m);
}
st.close();
rs.close();
return daftarJurusan;
}
@Override
public Jurusan save(Jurusan jurusan) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "INSERT INTO jurusan (id, nama) VALUES (?,?)";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, jurusan.getId());
ps.setString(2, jurusan.getNama());
ps.executeUpdate();
ps.close();
return jurusan;
}
@Override
public Jurusan update(Jurusan jurusan) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "UPDATE jurusan SET nama = ? WHERE id = ?";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, jurusan.getNama());
ps.setString(2, jurusan.getId());
ps.executeUpdate();
return jurusan;
}
@Override
public void delete(String id) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "DELETE FROM jurusan WHERE id = ?";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, id);
ps.executeUpdate();
ps.close();
}
@Override
public Jurusan findById(String id) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "select * from jurusan";
Statement st = koneksi.createStatement();
ResultSet rs = st.executeQuery(sql);
Jurusan jurusan = null;
if (rs.next()) {
jurusan = new Jurusan(rs.getString(1), rs.getString(2));
}
st.close();
rs.close();
return jurusan;
}
}

Setelah itu kita bisa mecoba merunningnya dengan membuat kelas baru contohnya saya mau buat kelas ModularJDBC dalam package belajar.jdbc seperti berikut:

package belajar.jdbc;

/**
 *
 * @author dimMaryanto
 */
public class ModularJDBC {
    public static void main(String[] args) {

    }
}

Kemudian tambahkan seperti berikut:

package belajar.jdbc;
import belajar.jdbc.model.Jurusan;
import belajar.jdbc.repo.RepositoryJurusan;
import belajar.jdbc.service.ServiceJurusan;
import java.sql.SQLException;
import java.util.List;
public class ModularJDBC {
public static void main(String[] args) throws SQLException {
RepositoryJurusan repo = new ServiceJurusan();
// cara menggunakan untuk insert data
System.out.println("INSERT ---------------------");
repo.save(new Jurusan("IF", "Informatika"));
System.out.println("FIND BY ID------------------");
// cara menggunakan untuk mencari data berdasarkan id
Jurusan IF = repo.findById("IF");
System.out.println("Kode IF adalah " + IF.getNama());
System.out.println("UPDATE -----------------------");
IF.setNama("INFORMATIKA");
repo.update(IF);
System.out.println("FIND BY ID after Update------------------");
// cara menggunakan untuk mencari data berdasarkan id
Jurusan IFUpdated = repo.findById("IF");
System.out.println("Kode IF adalah " + IFUpdated.getNama());
System.out.println("DELETE ---------------------");
// cara menggunakan untuk hapus data
repo.delete(IFUpdated.getId());
System.out.println("SELECT ALL ------------------");
List<Jurusan> daftarJurusan = repo.selectAll();
System.out.println("Jumlah data jurusan: " + daftarJurusan.size());
for (Jurusan jur : daftarJurusan) {
System.out.println("Kode: " + jur.getId()
+ ", Namanya: " + jur.getNama());
}
}
}

Klo di running maka hasilnya seperti berikut:

compile-single:
run-single:
INSERT ---------------------

FIND BY ID------------------
Kode IF adalah Informatika

UPDATE -----------------------

FIND BY ID after Update------------------
Kode IF adalah INFORMATIKA

SELECT ALL ------------------
Kode: IF, Namanya: INFORMATIKA

DELETE ---------------------
BUILD SUCCESSFUL (total time: 1 second)

Bagaimana jadi lebih sederhana khan? OK sekarang kita buat yang satu lagi yaitu Mahasiswa yang berelasi dengan Jurusan. seperti berikut kodingnya:

package belajar.jdbc.repo;
import belajar.jdbc.model.MahasiswaUpdated;
import java.sql.SQLException;
import java.util.List;
/**
*
* @author dimMaryanto
*/
public interface RepositoryMahasiswa {
public List<MahasiswaUpdated> selectAll() throws SQLException;
public MahasiswaUpdated save(MahasiswaUpdated mhs) throws SQLException;
public MahasiswaUpdated update(MahasiswaUpdated mhs) throws SQLException;
public void delete(String id) throws SQLException;
public MahasiswaUpdated findById(String id) throws SQLException;
}

Setelah membuat repository tahap selanjutnya membuat kelas baru dengan nama ServiceMahasiswa seperti berikut dan jangan lupa implements interface RepositoryMahasiswa:

package belajar.jdbc.service;

import belajar.jdbc.model.MahasiswaUpdated;
import belajar.jdbc.repo.RepositoryMahasiswa;
import java.sql.SQLException;
import java.util.List;

public class ServiceMahasiswa implements RepositoryMahasiswa {

    @Override
    public List<MahasiswaUpdated> selectAll() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public MahasiswaUpdated save(MahasiswaUpdated mhs) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public MahasiswaUpdated update(MahasiswaUpdated mhs) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void delete(String id) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public MahasiswaUpdated findById(String id) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

Kemudian kita edit file tersebut masukin fungsi-fungsi yang telah kita buat sebelumnya kita masukin ke kelas tersebut, maka hasilnya seperti berikut:

package belajar.jdbc.service;
import belajar.jdbc.model.Jurusan;
import belajar.jdbc.model.MahasiswaUpdated;
import belajar.jdbc.repo.RepositoryMahasiswa;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class ServiceMahasiswa implements RepositoryMahasiswa {
@Override
public List<MahasiswaUpdated> selectAll() throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "SELECT m.nim, m.nim, j.id, j.nama\n"
+ "FROM mahasiswa m JOIN jurusan j ON (m.id_jurusan = j.id)";
List<MahasiswaUpdated> daftarMahasiswa = new ArrayList<>();
Statement st = koneksi.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
MahasiswaUpdated m = new MahasiswaUpdated();
m.setNim(rs.getString(1));
m.setNama(rs.getString(2));
// mendapatkan nilai jurusan dari kolom ke 3 dan ke 4
Jurusan j = new Jurusan(rs.getString(3), rs.getString(4));
m.setJurusan(j);
daftarMahasiswa.add(m);
}
st.close();
rs.close();
return daftarMahasiswa;
}
@Override
public MahasiswaUpdated save(MahasiswaUpdated mhs) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "INSERT INTO mahasiswa (nim, nama, id_jurusan) VALUES (?,?,?)";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, mhs.getNim());
ps.setString(2, mhs.getNama());
// yang dipasing hanya id jurusannya aja
ps.setString(3, mhs.getJurusan().getId());
ps.executeUpdate();
ps.close();
return mhs;
}
@Override
public MahasiswaUpdated update(MahasiswaUpdated mhs) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "UPDATE mahasiswa SET id_jurusan = ?, nama = ? WHERE nim = ?";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, mhs.getJurusan().getId());
ps.setString(2, mhs.getNama());
ps.setString(3, mhs.getNim());
ps.executeUpdate();
ps.close();
koneksi.close();
return mhs;
}
@Override
public void delete(String id) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "DELETE FROM mahasiswa WHERE nim = ?";
PreparedStatement ps = koneksi.prepareStatement(sql);
ps.setString(1, id);
ps.executeUpdate();
ps.close();
koneksi.close();
}
@Override
public MahasiswaUpdated findById(String id) throws SQLException {
Connection koneksi = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_mysql", "root", "admin");
String sql = "SELECT m.nim, m.nim, j.id, j.nama\n"
+ "FROM mahasiswa m JOIN jurusan j ON (m.id_jurusan = j.id)";
List<MahasiswaUpdated> daftarMahasiswa = new ArrayList<>();
Statement st = koneksi.createStatement();
ResultSet rs = st.executeQuery(sql);
MahasiswaUpdated m = null;
if (rs.next()) {
m = new MahasiswaUpdated();
m.setNim(rs.getString(1));
m.setNama(rs.getString(2));
// mendapatkan nilai jurusan dari kolom ke 3 dan ke 4
Jurusan j = new Jurusan(rs.getString(3), rs.getString(4));
m.setJurusan(j);
daftarMahasiswa.add(m);
}
st.close();
rs.close();
return m;
}
}

nah sekarang kita buat kelas baru lagi untuk mengobain atau menjalankannya dengan nama ModularJDBCMahasiswa seperti berikut:

package belajar.jdbc;

public class ModularJDBCMahasiswa {

    public static void main(String[] args) {

    }
}

Selanjutnya karena kita ingin menambahkan data Mahasiswa jadi kita membutuhkan juga data Jurusan, jadi kita copy-paste aja perintah berikut ke dalam file ModularJDBCMahasiswa seperti berikut:

package belajar.jdbc;

import belajar.jdbc.model.Jurusan;
import belajar.jdbc.repo.RepositoryJurusan;
import belajar.jdbc.service.ServiceJurusan;
import java.sql.SQLException;

public class ModularJDBCMahasiswa {

    public static void main(String[] args) throws SQLException {
        RepositoryJurusan repo = new ServiceJurusan();

        // cara menggunakan untuk insert data
        System.out.println("INSERT ---------------------");
        repo.save(new Jurusan("IF", "Informatika"));
    }
}

kemudian tambahkan lagi contohnya untuk tambah data mahasiswa dan menampilkan datanya seperti berikut:

package belajar.jdbc;
import belajar.jdbc.model.Jurusan;
import belajar.jdbc.model.MahasiswaUpdated;
import belajar.jdbc.repo.RepositoryJurusan;
import belajar.jdbc.repo.RepositoryMahasiswa;
import belajar.jdbc.service.ServiceJurusan;
import belajar.jdbc.service.ServiceMahasiswa;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ModularJDBCMahasiswa {
public static void main(String[] args) throws SQLException {
RepositoryJurusan repo = new ServiceJurusan();
RepositoryMahasiswa repoMhs = new ServiceMahasiswa();
// cara menggunakan untuk insert data
System.out.println("INSERT JURUSAN---------------------");
Jurusan jurusan = new Jurusan("IF", "Informatika");
repo.save(jurusan);
System.out.println("INSERT MAHASISWA ------------------");
MahasiswaUpdated mhs = new MahasiswaUpdated();
mhs.setNim("10511148");
mhs.setNama("Dimas Maryanto");
mhs.setJurusan(jurusan);
repoMhs.save(mhs);
List<MahasiswaUpdated> daftarMahasiswa = repoMhs.selectAll();
System.out.println("Jumlah data mahasiswa: " + daftarMahasiswa.size());
for (MahasiswaUpdated mahasiswa : daftarMahasiswa) {
System.out.println(
"NIM: " + mahasiswa.getNim()
+ ", Nama: " + mahasiswa.getNama()
+ ", Nama Jurusan: " + mahasiswa.getJurusan().getNama());
}
}
}

Kalo anda jalankan maka hasilnya seperti berikut:

run-single:
INSERT JURUSAN---------------------

INSERT MAHASISWA ------------------

Jumlah data mahasiswa: 1
NIM: 10511148, Nama: 10511148, Nama Jurusan: Informatika
BUILD SUCCESSFUL (total time: 1 second)

Sisanya silahkan anda improve sendiri seperti update mahasiswa, dan hapus data. Ok mungkin cukup dulu pembahasan tentang modularisasi JDBC. see you next post!.