Hal yang sering ditanyakan bagi yang baru belajar akses basisdata menggunakan pola DAO termasuk saya dulu adalah bagaimana cara membuat DAO untuk join tabel. Selanjutnya mungkin akan bertanya
Jika saya memiliki 2 kelas Buku dan Kategori, di DAO yang mana saya membuat method untuk join-nya
Semoga tulisan ini bisa memberikan sebuah penjelasan mengenai cara membuat join tabel pada sebuah DAO.
Pada tulisan ini saya menggunakan teknologi JDBC karena yang pertama dipelajari oleh pemula untuk mengakses basisdata adalah JDBC.
Tabel Data
Untuk contoh kasus akan kita gunakan relasi antara tabel [rad-hl]buku[/rad-hl] dengan [rad-hl]kategori[/rad-hl]. Berikut adalah script untuk membuatnya
tabel buku
1 2 3 4 5 6 7 8 9 |
CREATE TABLE `buku` ( `id` int(10) NOT NULL AUTO_INCREMENT, `judul` varchar(50) NOT NULL, `penulis` varchar(50) NOT NULL, `id_kategori` int(10) NOT NULL, PRIMARY KEY (`id`), KEY `id_kategori` (`id_kategori`), CONSTRAINT `buku_ibfk_1` FOREIGN KEY (`id_kategori`) REFERENCES `kategori` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
tabel kategori
1 2 3 4 5 |
CREATE TABLE `kategori` ( `id` int(10) NOT NULL AUTO_INCREMENT, `nama` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
Gambar relasinya sebagai berikut
Kelas Domain
Untuk tiap tabel diatas kita buatkan kelasnya pada Java. Nanti proses CRUD akan jauh lebih enak jika kita menggunakan kelas POJO ini.
Ingat, tabel diatas memiliki relasi yang dihubungkan dengan [rad-hl]primary key[/rad-hl] dan [rad-hl]foreign key[/rad-hl]. Pada kelas Java relasi ditunjukkan dengan variabel.
file : Buku.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package com.agung.daojointable.domain; /** * * @author Agung Setiawan */ public class Buku { private Integer id; private String judul; private String penulis; private Kategori kategori; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getJudul() { return judul; } public void setJudul(String judul) { this.judul = judul; } public String getPenulis() { return penulis; } public void setPenulis(String penulis) { this.penulis = penulis; } public Kategori getKategori() { return kategori; } public void setKategori(Kategori kategori) { this.kategori = kategori; } } |
Dan berikut kelas Kategori yang merupakan mapping dari tabel kategori
file : Kategori.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package com.agung.daojointable.domain; import java.util.ArrayList; import java.util.List; /** * * @author Agung Setiawan */ public class Kategori { private Integer id; private String nama; List<Buku> daftarBuku=new ArrayList<Buku>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public List<Buku> getDaftarBuku() { return daftarBuku; } public void setDaftarBuku(List<Buku> daftarBuku) { this.daftarBuku = daftarBuku; } } |
Pada kelas [rad-hl]Buku[/rad-hl] terdapat varibel [rad-hl]kategori[/rad-hl] sedangkan pada kelas [rad-hl]Kategori[/rad-hl] terdapat variabel [rad-hl]daftarBuku[/rad-hl]. Kedua variabel tersebut menunjukkan relasi antara kedua kelas.
Kelas DAO
Sekarang saatnya kita menulis kelas DAO.
Untuk menyederhanakan kasus dan menyesuaikan judul maka DAO hanya akan memiliki satu method, yaitu method untuk mengambil data JOIN antara tabel [rad-hl]buku[/rad-hl] dengan tabel [rad-hl]kategori[/rad-hl]. Hasil outputnya nanti bisa menampilkan data buku dengan kategori yang dimilikinya.
Di DAO mana kita akan menulisnya?
Apakah di DAO Buku atau DAO Kategori?
Sebaiknya di DAO Buku karena intinya kita akan mengambil data buku dari basisdata bukan data kategori.
Dan berikut adalah kelas [rad-hl]BukuDaoJdbc[/rad-hl]
file : BukuDaoJdbc.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package com.agung.daojointabel.dao; import com.agung.daojointabel.domain.Buku; import com.agung.daojointabel.domain.Kategori; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * * @author Agung Setiawan */ public class BukuDaoJdbc { Connection connection; List<Buku> daftarBuku=new ArrayList<Buku>(); public BukuDaoJdbc(Connection connection){ this.connection=connection; } public List<Buku> getAll() throws SQLException{ PreparedStatement ps=connection.prepareStatement( "SELECT buku.id,buku.judul,buku.penulis,kategori.id as id_kategori, kategori.nama" + " FROM buku inner join kategori on(buku.id_kategori=kategori.id)"); ResultSet rs=ps.executeQuery(); while(rs.next()){ Buku buku=new Buku(); Kategori kategori=new Kategori(); buku.setId(rs.getLong("id")); buku.setJudul(rs.getString("judul")); buku.setPenulis(rs.getString("penulis")); kategori.setId(rs.getLong("id_kategori")); kategori.setNama(rs.getString("nama")); buku.setKategori(kategori); daftarBuku.add(buku); } return daftarBuku; } } |
Perhatikan pada baris yang saya tandai, [rad-hl]buku.setKategori(kategori)[/rad-hl] merupakan cara untuk merelasikan antara objek buku dengan objek kategori. Tanpa itu relasi antara kedua kelas tidak akan bisa terjalin
Pertama tentu kita harus melakukan mapping data dari hasil ResultSet kedalam kelas [rad-hl]Buku[/rad-hl] dan juga kelas [rad-hl]Kategori[/rad-hl]. Set id-nya dan lain sebagainya, baru kemudian direlasikan seperti kode yang saya tandai
Kelas Main
Untuk mencoba hasilnya kita tulis di kelas Main saja, mau pakai Integration Test juga boleh
Sebelumnya saya sudah memasukkan beberapa data sampel
1 2 3 4 5 6 |
INSERT INTO `kategori` ( `id` , `nama` ) VALUES ( NULL , 'Java' ), ( NULL , 'PHP' ); |
1 2 3 4 5 6 7 8 9 10 11 12 |
INSERT INTO `buku` ( `id` , `judul` , `penulis` , `id_kategori` ) VALUES ( NULL , 'Spring in Action', 'Spring Guy', '1' ), ( NULL , 'PHP in Action', 'PHP Guy', '2' ), ( NULL , 'Pro Java EE 7', 'Java Guy', '1' ), ( NULL , 'Hibernate In Action', 'ORM Guy', '1' ), ( NULL , 'PHP ORM', 'PHP Guy', '2' ); |
file : App.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package com.agung.daojointabel; import com.agung.daojointabel.dao.BukuDaoJdbc; import com.agung.daojointabel.domain.Buku; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import java.sql.SQLException; import java.util.List; public class App { public static void main( String[] args ) throws SQLException { //setingan datasource MysqlDataSource dataSource=new MysqlDataSource(); dataSource.setServerName("localhost"); dataSource.setDatabaseName("daojointabel"); dataSource.setUser("root"); dataSource.setPassword(""); BukuDaoJdbc bukuDao=new BukuDaoJdbc(dataSource.getConnection()); //ambil data dari basisdata List<Buku> daftarBuku=bukuDao.getAll(); //cetak hasil kelayar for(Buku b:daftarBuku){ System.out.println("Judul : "+b.getJudul()+" Penulis : "+b.getPenulis()+" Kategori : "+b.getKategori().getNama()); } } } |
Hasil yang muncul dilayar adalah seperti berikut
Source Code
Seperti biasa saya selalu menyertakan file project sampel pada artikel yang saya tulis.
Silahkan dapat dilihat disini
Semoga tulisan ini bermanfaat 🙂
gan, ane mau tanya nih, kalo pas kategori itu dipanggil di web page, pake hashmap kira” gimana ya gan?
terima kasih sebelumnya