Istilah-Istilah Seputar ORM

Tugas kuliah PSBO buat besok (hehe..) adalah mencari tahu seputar Object Relational Mapping a.k.a ORM di Java.  Ternyata lumayan banyak istilah-istilah yang ditemukan.  Tapi usut punya usut, beberapa istilah ini sudah pernah dikenali sebelumnya, hanya saja karena waktu itu belum cukup umur (baca: pengetahuan sebelumnya masih kurang)  gak bener-bener ngerti dan iya-iya aja waktu dijelasin..  Well, here it is.. 

 

ORM 

Ini keyword pertama yang mendasari seluruh pencarian. ORM kependekan dari Objek Relational Mapping, adalah teknik pemrograman untuk menjembatani konsep yang berbeda dari database relasional dengan konsep pemrograman berorientasi objek (OOP). Menurut mbah yang ini, dengan ORM, basis data relasional itu digunakan untuk menyimpan data (memang iya), tetapi dalam bentuk objek.

 

um.. terus gimana teknik-tekniknya itu? ada beberapa teknik dan sebenernya lebih kompleks dari yang bakal dijelasin di contoh di bawah ini.  Contoh ini hanya hasil interpretasi penulis, mungkin bisa (CMIIW) nunjukkin bagian kecil tentang gimana yang dimaksud menjembatani database dengan OOP ( hanya supaya konsepnya ga terlalu abstrak) 

Dulu tugas kuliah rekayasa perangkat lunak, kelompok kami mengembangkan aplikasi yang namanya APPM (Aplikasi Pendeteksi Penyakit Manusia) (exSys-like application, kata orang2 c).  Aplikasi ini menggunakan database untuk menyimpan hal-hal berikut :

  1. Pertanyaan-pertanyaan yang akan diajukan ke ‘pasien’ untuk mendeteksi penyakitnya. (tabel pertanyaan)
  2. Data pengguna, meliputi nama, umur, jenis kelamin, dll (tabel pengguna)
  3. Data obat-obatan herbal (tabel herbal)

Nah, lalu di program java-nya dibuatlah satu buah package (namanya model), yang isinya adalah kelas-kelas yang mendeskripsikan tabel-tabel yang tadi.  Atribut-atribut dari kelas ini adalah kolom-kolom yang ada di tabel.

Misalnya tabel pengguna memiliki kolom user_name, password, jenis_kelamin. Maka kelas yang mendeskripsikannya kurang lebih seperti ini :

public class Pengguna {

private String userName;
private String password;
private String jenisKelamin;

 

//method getter dan setter
}

 

Jadi, kelas yang mendeskripsikan tabel Pengguna  itu sederhana aja, cuma diisi oleh atribut-atribut (yang mewakili kolom di database) dan method getter-setter nya.  Ternyata eh ternyata (kalo kata temen yang ini) kelas yang simpel kayak begitu bisa disebut sebagai…

 

POJO (Plain Old Java Object)

Istilah yang rada-rada berbau nama orang Indonesia ini mempunyai nama panjang yang keren ternyata: Plain Old Java Object.  sederhananya sih, ini adalah objek yang sederhana, nggak kompleks. Kata Beliau, POJO itu nggak mau ribet, dia nggak diinstantiasi dari kelas yang rada-rada komplex gitu deh, mis.: merupakan turunan dari kelas lain, mengimplementasi suatu interface, atau mengandung anotasi.

Kalau kata yang ini,

Tapi rule of thumb yang bisa
dipake adalah the simpler = the more POJO. Jadi suatu object yang dikatakan
POJO atau POCO kalau dirinya tidak tergantung pada external framework (hence
jadi complex)

 

Hm,, omong-omong tentang framework.. nah. konsep ORM nya kan udah, sekarang,, nge-implementasiinnya pake cara-cara apa aja ya,, berikut cuplikannya..

 

JPA

Tentunya kita tidak sedang membicarakan laki-laki karena JPA yang dimaksud di sini bukanlah Jenggot Pemikat Akhwat melainkan Java Persistence API.  

 

Hibernate

Hibernate juga merupakan salah satu library yang menyediakan framework untuk ORM.  lebih jelasnya ke sini aja, saya juga belum bener2 baca, dah malem.. baca sendiri aja ya.. (emang dari tadi dibacain gitu??) hehe..

 

yap, sekian. Besok pas kul kalo ternyata konsepnya  salah, mudah2an bisa segera memperbaiki tulisan ini..  daag..

BasProg Rev 260508

Ada beberapa catatan dari praktikum kemarin dan kuliah yang tgl 19nya(pekan sebelumnya) :

  1. Ternyata data-data bertipe private dan protected tidak bisa diakses dari fungsi main.  Wah baru menyadari sekarang,, kemarin iya-iya aja kalau dibilang ‘protected itu hanya bisa diakses oleh kelas itu sendiri dan turunannya’ dan ‘private itu hanya bisa diakses oleh kelas itu sendiri’.

Jadi, misalkan ada

class Coba {

private:

int u;

public :

void setU (int a) {u=a;}

int getU(){return u;}

};

Misalnya kita ingin mencetak nilai u, maka cara yang seperti ini :

main () {

Coba coba;

std::cout<<coba.u;

}

akan error, karena u itu private, ya to? Jadi untuk mensiasatinya digunakanlah fungsi getter (untuk mengambil nilai dari data2 yang private/protected, di dalam contoh di atas getter nya itu getU ya?) sehingga, coba ganti dengan :

std::cout<<coba.getU();

Kadang kita perlu bener2 mencoba supaya bener2 ngerti.

2. Ternyata saat kita membentuk objek dari suatu derived class, maka konstruktor base-nya akan dipanggil terlebih dahulu.  Kode di bawah ini sewaktu dicoba menunjukkan begitu (ya..?):

#include <iostream>

using namespace std;

class Mother {

public :

Mother () {cout<<”base constructor :Mother()\n”;}

Mother(int a){cout<<”base constructor: Mother(“<<a<<”)\n”;}

};

class Daughter : public Mother {

public :

Daughter(int){cout <<”Daughter(int)\n”;}

};

class Son : public Mother {

public :

Son (int c) : Mother(c)

{cout<< “Son(int)\n”;}

Son () {cout<< “Son()\n”;}

};

main () {

Son son, son2(5);

Daughter daughter(3);

}

Keluarannya :

base constructor :Mother()

Son()

base constructor:Mother(5)

Son(int)

base constructor :Mother()

Daughter(int)

3. Sekarang tentang pointer.  Benarkah pernyataan2 ini ?

- Pointer ke kelas Base bisa menunjuk ke kelas Derived-nya

- Pointer ke kelas Derived bisa menunjuk ke kelas Base-nya

a. benar-benar              b. benar-salah

c. salah-benar               d. Dua-duanya kurang tepat

Selamat buat yang menjawab b… tapi nggak ada hadiahnya ya… ternyata coba2 dikit,, pernyataan pertama benar, tapi yang kedua kurang tepat.  Pointer ke kelas base bisa menunjuk ke derived-nya, kenapa ya?

Um,, dipikir,, mungkin karena kelas Derived itu kan turunan dari kelas base-nya, jadi scr nggak langsung derived punya sifat-sifatnya base.  Tapi,, kalau pointer ke kelas derived dipakai untuk menunjuk kelas base nya, ternyata nggak bisa. Alasannya mungkin karena derived itu (umumnya) lebih kaya (lebih banyak lagi/ditambah lagi fungsi2nya) daripada base,  jadi kalau pointer derived dipakai nunjuk ke base, mungkin ibaratnya pointer itu diminta menunjuk ke sesuatu secara nggak utuh (begitukah?), jadi ga bisa deh. Allohua’lam.

//POINTER KE DERIVED MEM-POINT KELAS BASE NYA

//BISA NGGAK YA?

#include <iostream>

using namespace std;

class Basis {

public :

void cet1(){cout<<”hai1\n”;}

};

class Turunan : public Basis  {

public :

void cet2(){cout<<”hai2\n”;}

};

main () {

Basis b;

Turunan *tp = &b;

tp->cet1();

getch();

}

4. Masih tentang pointer.  Misalkan kita punya suatu pointer kelas base yang menunjuk ke derived class nya.

class Basis {                       //base class

public :

void cet1(){cout<<”hai1\n”;}

};

class Turunan : public Basis  {     //derived class

public :

void cet2(){cout<<”hai2\n”;}

};

main () {

Turunan t;

Basis *bPtr = &t;  //bPtr point ke t(derived)

Apakah pointer tersebut memiliki fungsi-fungsi yang ada di derived class (dg kata lain, apakah bPtr memiliki fs. cet2()?

Yap… ternyata jawabannya bPtr ndak punya… ternyata pointer itu hanya memiliki fungsi2 dari kelas yang dia menunjuk kepadanya.  Jadi misalnya dia menunjuk ke objek derived nya,, fungsi2 yang ada di derived dia ndak punya…

Sebenrnya masih ada lanjutannya.. tapi, sptnya segini dulu aja.. oia harap merujuk lagi ke referensi2 yang lebih dipercaya (krn sy belum bc,, hanya coba2 kodenya)… kalau sempat, insyaa Alloh dilanjutkan.

Allohua’lam.

I(‘m trying to) Love SQL

Sepekan lebih sehari yang lalu, za dan temen2 sekelas ilkomerz 43 (plus minor juga ding) kuis basis data.  Praktikum dan ternyata kuliahnya juga…!

 

Malam sebelumnya za udah usahakan, tapi ternyata materi yang diujikan memang belum bener2 za ngerti.  Apa yang diujikan materinya ternyata lebih susyah dari yang dipelajarin (ya iyalah… secara (oi gunakan secara secara benar,,) za belajar dari contoh2 soal– kan buku rata2 kalau ngasi contoh soal mmg yang gampang2, secara tambah lagi nyiapinnya sks).

 

Akhirnya za harus siap mnerima kenyataan yang terjadi kemarin (saah…),, hik… nilainya jatoh banget.  jadi sebel penasaran dan merasa (lebih) tertantang (hoho…) untuk menguasai BasDat, spesifiknya SQL.

 

Jadilah semalam tadi za baca lagi materinya, coba-coba lagi setiap tools yang za punya di SQL (maksudnya tools : seperti COUNT, GRUOP BY, DESC LIMIT 1(errgh)) supaya lebih paham fungsi setiap tools, coba-coba soal yang kemarin,, dan.. coba tebak,,

 

AlhamduliLLaah… ternyata berhasil! baru no.5-9 ding no.10 nya masih belum benar2 berhasil (oya, za cm nyba 5 no. terakhir karena emang itu yang paling (minjem kata2nya teman) ‘suram’).  Sedihnya baru bisanya setelah selesai ujian ya.  Tapi gapapa lah.. (mungkin ini nguji juga, sebenernya yang kukejar dari kuliah ntu materinya apa nilainya)

 

oia  tapi za, jawabannya harus klarifikasi lagi sama temn2 yang lainnya, takutnya belum benar-benar benar. ini dia..

 

***

 

5. Tampilkan nama student dan  nama subject dari tabel enrolled :

            SELECT s.name, sb.name

            FROM student s, enrolled e, subject sb

            WHERE s.student_no = e.student_no AND

                        e.subject_no = sb.id;

 

//join 3 tabel, kemarin diterangin (lagi kah? Atau baru) sama Bapak Dosen

 

 

6. Tampilkan ID dan nama Dosen yang mengajar hari senin :

            SELECT c.lecturer, s.name

            FROM staff s JOIN class c ON s.staff_no = c.lecturer

            WHERE c.meetsAt LIKE ‘Senin%’;

 

7. Tampilkan jumlah student dan major dari major yang memiliki student terbanyak :

            SELECT major, COUNT(student_no)

            FROM student GROUP BY major

            ORDER BY COUNT(student_no) DESC LIMIT 1;

 

/*DESC LIMIT 1; urut dulu dari besar ke kecil, ambil yang ada di urutan pertama…(yah aku baru tahu kemarin, — mksh Rina..) kreatif juga (apa emang caranya gini) karena nggak bisa pakai MAX(COUNT(bla…)) ya. */

 

 

8. Tampilkan nama ruangan dan jumlah pemakaian untuk ruangan yang paling sering dipakai

            SELECT room, COUNT(room)

            FROM class GROUP BY room

            ORDER BY COUNT(room) DESC LIMIT 1;

 

9. Sebutkan ID dan nama Dosen yang mengajar lebih dari 1 subject :

            SELECT c.lecturer, s.name

            FROM staff s JOIN class c ON s.staff_no = c.lecturer

            GROUP BY c.lecturer HAVING COUNT(DISTINCT c.name)>1;

 

10. Tampilkan nama subject, ID subject, dan jumlah mhs yang enrolled untuk subject yang paling banyak dienrolled.

SELECT sb.name, sb.id, COUNT(e.student_no)

  FROM subject sb JOIN enrolled e ON sb.id = e.subject_no

  GROUP BY e.subject_nO

  ORDER BY COUNT(e.student_no) DESC LIMIT 1;

 

Catt: kalau querinya seperti yang di atas, yang muncul hanya kom341 di enrolled oleh 4 mhs, padahal m.k yang dienrolled oleh 4 mhs ntu ada banyak. Jadi…kalau mau nampilin semua yang diambil oleh 4 mhs coba siasatin dengan subqueri :

 

Kalau begini…

            SELECT sb.name, sb.id, COUNT(e.student_no)

             FROM subject sb JOIN enrolled e ON sb.id = e.subject_no

            GROUP BY e.subject_no

            HAVING COUNT(e.student_no)

                        IN(SELECT COUNT(student_no) FROM enrolled e

                                    GROUP BY subject_no

                                    ORDER BY COUNT(e.student_no) DESC LIMIT 1);

 

Yah.. ‘this query couldn’t be execute’, pesannya SQL :

            This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’

 

Yah… jadi ga bisa ada LIMIT di sub queri nya..  gimana yah..?

 

***

 

begitu ceritanya…

to be continued, insyaaAllah

 

Basprog Review 28-04-08

Bahasan praktikum dan kuliahnya mirip.  Kalau praktikum tadi awalnya review cara penulisan class, data dan method-method-nya.  Oia za baru tahu kemaren loh kalau ternyata nama lainnya prosedur (yang ada di class) itu adalah method.  Kemarin pas kumpul Java lebih banyak pakai kata2 method daripada prosedur.  Awalnya nggak nyambung, tapi nerka2 kynya maksudnya method teh prosedur. Eh bener ajah..

Menurut za, tahu istilah-istilah dan nama2 lainnya suatu istilah ntu penting, karena itu yang nentuin ntar kita nyambung atau engga.  Jadi tips nih dari za,, (ceille.. gaya euy!), kalau suatu saat Dosen menerangkan dan kita nggak mudeng dengan kata-kata yang beliau ucapkan, sebisa mungkin terkalah apa kira2 maksud yang mungkin dari kata2 itu.  Sok nyambung dulu aja, biasanya titik terang itu ada setelah kita dapet penjelasan menyeluruh.  Jadi andaikata pada menit-menit pertama pelajaran kepala kita udah tuing-tuing seraya berkata dalam hati ‘naon ieu yeuh!’;p, jangan nyerah dulu… just act like you know.. while guessing what He/She mean..

Kembali ke laptop praktikum. Jadi cerita reviewnya kita diminta menulis suatu kelas dengan nama Titik, yang memunyai data-data koordinat x, dan y, berupa integer.  Rentang nilai x antara (0 s.d 800) dan rentang nilai y antara (0 s.d 600).  Titik ini bermula di (0,0) ada di pojok kiri atas.

Titik tersebut memiliki fungsi2 : setTitik untuk ngeset titik itu mau ada di koordinat brp, geserKanan, geserKiri, geserAtas, geserBawah.  Oia perlu diingat, ini bukan koordinat karetesian, karena soal menyebutkan bahwa titik dimulai di pojok kiri atas,  jadi geser ke bawah artinya menambah nilai y, dan geser ke kanan artinya menambah nilai x.  Terus ada jg fs. getX dan getY, untuk mengembalikan nilai si X dan si Y (ups.. x dan y.

Ini hasil kodingan za :

Wah.. wah.. ternyata nggak ke save ke FD.. yah,, coba kita ulang..

class Titik {

protected :

int x, y;

public :

Titik () { x=y=0;}

void setTitik(int abs, int ord) {

x = abs;

y = ord;

}

void geserKanan(int n) {

x += n;

if (x>800) x=800;

}

Pit..! baris-baris program

x += n;

if (x>800) x=800;

ternyata bisa diganti dengan

x  = ((x+n)>800 ? 800 : x+n);

sebenrnya ini gak terlalu penting buat ditanyain,, [krn hemat za pertanyaan ini jawabannya : ga beda2 amat] tapi tadi sempet kepikiran..mana yang secara ’memori’ lebih hemat? Yang pertama atau yang kedua? Ayo ada yang bisa jawab..

selanjutnya untuk fungsi2 geserKiri, atas dan bawah tinggal ganti2 aja. Inget kalau batas bawah adalah 600, batas kanan 800, batas kiri dan atas 0. (the point start at left corner, rememba?)

//intermezzoo..  Ternyata OOP seru juga.

Fungsi getX mengembalikan nilai x dan fungsi getY mengembalikan nilai y.  Jadi tebak apa return type nya?? Yap benar sekali sodara-sodara … integer. Karena  tipe data x dan y adalah integer.

int getX () {return x;}

Bahasan selanjutnya rada2 lieur… operator overloading.  Kemaren kirain za yang namanya op. overloading itu bikin fungsi pake nama + – dkk.. sehingga dipanggilnya pun (misal) :

Titik t1;

t1+(4)

dan ternyata emang gitu, tapi ada catatan yang perlu ditambahin. Apa itu.. ? yap… ntar sambung lagi,, insyaa Alloh.

NB: um,, ternyata kalau ngereview ya begini agak lama juga ya.  Lain kali za akan tulis yang penting2 untuk diingat, dan apa2 yang ada elaboratornya aja kali ya…….