ORM Part 1: Intro to Object-Relational Mapping

Oke, tugas Layanan dan Aplikasi Web gw yang mengganggu kenyamanan gw menulis tugas akhir sebenernya cukup membuka wawasan gw tentang teknologi Object-Relational Mapping (ORM) yang digunakan di masyarakat IT. ORM adalah pemetaan antara data skalar terstruktur ke data berbentuk object-oriented. Data skalar terstruktur adalah bentuk data yang tersimpan pada sistem database relasional (relational database).

Perkembangan paradigma Object Oriented membuat cara penggunaan DBMS pada program berevolusi. Sebelum ORM berkembang, kita menggunakan query SQL untuk mengambil data dari satu atau lebih tabel pada database. Setiap query menghasilkan struktur data linier berbentuk tabel di mana setiap row dari tabel tersebut merepresentasikan satu data yang tersimpan.

Terkadang kita perlu melakukan query yang menggabungkan (join) antara dua tabel atau lebih. Terkadang pula kolom-kolom dari query kita menggabungkan kolom-kolom dari dua tabel atau lebih. Kasus-kasus ini cukup menyulitkan kita dalam menulis program karena query-query seperti itu tidak memberikan struktur data yang konsisten. Mari kita simak contoh kasus berikut ini:

Gambar1

Terdapat dua buah tabel Blog dan Comment yang saling berelasi, di mana satu comment memiliki satu blog yang terhubung dan satu blog memiliki banyak comment. Misalkan kita mau melakukan query yang memperoleh daftar pengomentar serta judul blog yang dikomentari oleh komentar tersebut, maka kita menulisnya:

[sourcecode language=”sql”] SELECT b.BlogId, b.Title, c.CommentId, c.SenderName
FROM Blog b, Comment c
WHERE b.BlogId = c.BlogId
[/sourcecode]

Dan bentuk struktur tabel (view) hasil dari query tersebut adalah:

Gambar2

Nah ketika kita ingin menyimpan data tersebut sementara pada program, maka kita harus mendefinisikan struktur data dari query tersebut tersendiri. Misalnya di Java, kita mungkin akan membuat class yang serupa dengan berikut ini:

[sourcecode language=”java”] class BlogCommentator {
public int blogId;
public String title;
public int commentId;
public String sender;
}
[/sourcecode]

Bayangkan jika pada sistem yang ingin kita buat terdapat puluhan tabel serta puluhan query yang berbeda-beda. Maka kita harus satu per satu membuat kelas yang terpisah jika ingin menyimpan data tersebut sementara di memori. Belum lagi kita harus menuliskan querynya satu per satu, dan melakukan fetch (pengambilan) data secara manual dengan method-method akses data. Bayangkan kita menulis ratusan baris kode program untuk query sederhana seperti ini:

[sourcecode language=”java”] // connect to database
Connection connection = DriverManager.getConnection(DATABASE_URL, DATABASE_USERNAME, DATABASE_PASSWORD);
Statement st = connection.createStatement();

String query = "SELECT b.BlogId, b.Title, c.CommentId, c.SenderName" +
"FROM Blog b, Comment c" +
"WHERE b.BlogId = c.BlogId";

// Fetch publisher list
ResultSet titleResult = st.executeQuery(query);

ArrayList<BlogCommentator> arr = new ArrayList&lt;BlogCommentator&gt;();

while(result.next()) {
BlogCommentator bc = new BlogCommentator();
bc.blogId = result.getInt("BlogId");
bc.title = result.getString("Title");
bc.commentId = result.getInt("CommentId");
bc.sender = result.getString("SenderName");
arr.add(bc);
}
[/sourcecode]

Itu contoh di Java dan di PHP alur algoritmanya pun sama persis. Bikin koneksi, lakukan query, ambil hasil query, iterasi setiap row, ambil setiap kolom pada setiap row satu per satu. Kalau gw memang paling kesal menulis baris-baris program monoton seperti itu berulang-ulang. Selain capek mengetiknya, kode seperti itu rentan kesalahan setiap kali ada sedikit saja perubahan. Belum lagi setiap basis data memiliki karakteristik masing-masing. Mungkin kalau di Java, fungsi-fungsi akses ke DBMS sudah terstandarisasi dengan JDBC. Tapi kalau di PHP? Jangankan standar antar DBMS, fungsi-fungsi untuk akses ke basis data MySQL saja ada dua jenis yang berbeda.

Dari situlah terpikirkan untuk mempersingkat dan mempermudah penulisan akses-akses data ke suatu basis data pada program kita. Object-Relational Mapping merupakan salah satu solusi di mana setiap objek pada basis data dipetakan ke objek-objek pada program kita. Dengan pemetaan tersebut, diharapkan tidak diperlukan lagi menuliskan operasi fetch setiap kali mengambil query, tidak diperlukan lagi menulis ulang query-query join yang sederhana, dan abstraksi akses ke DBMS sehingga mempermudahkan kita untuk mengganti DBMS setiap kali diinginkan tanpa perlu perubahan besar pada program.

Bayangkan di program kita terdapat class berikut ini yang merepresentasikan setiap objek dalam basis data kita yang tadi:

[sourcecode language=”java”] class Blog {
private int blogId;
private String title;
private Date date;
private String content;
private List<Comment> commentCollection;
// Method accessor dan mutator…
}

class Comment {
private int commentId;
private Blog blog;
private String sender;
private String email;
private String message;
// Method accessor dan mutator…
}
[/sourcecode]

Dan ketika kita ingin melakukan query yang sebelumnya disebutkan di atas secara garis besar kita cukup menuliskan:

[sourcecode language=”java”] EntityManager en = getEntityManager();
List<Blog> blocColl = en.findAllBlog();

for(Blog b : blogColl) {
System.out.println("Blog: " + b. getTitle());
// Mencetak semua komentar di suatu blog
for(Comment c : b.getCommentCollection()) {
System.out.println(c.getSender());
}
}
[/sourcecode]

Dengan pemetaan tersebut, objek-objek di basis data dapat diakses lebih mudah tanpa perlu melakukan query-query yang tivial untuk dilakukan. Objek-objek di basis data tersebut disebut sebagai entity (entitas). Setiap entitas tersinkronisasi dengan basis data. Sehingga setiap perubahan yang dilakukan pada entitas tersebut akan juga disimpan di basis data secara otomatis. Tidak perlu lagi melakukan query UPDATE, INSERT, atau DELETE secara manual untuk melakukan perubahan data-data di basis data.

ORM memungkinkan menghilangkan boundary atau batas penghalang antara program kita dengan sistem basis data yang terpisah. Sehingga data-data di basis data dapat diakses dan di-coding dengan lebih mudah dalam program kita. Semua akses-akses ke basis data sepenuhnya dikendalikan oleh ORM, sehingga baris-baris program kita tidak perlu lagi memanggil method-method yang berhubungan dengan koneksi program kita ke basis data.

Pada tulisan selanjutnya, gw bakal ngebahas fitur-fitur yang disediakan oleh salah satu teknologi ORM: Java Persistence API. Stay tuned. 🙂

Mungkin Anda juga menyukai

2 Respon

  1. Randy berkata:

    Nice post, Gilang!

    Salah satu contoh ORM itu LINQ to SQL bukan?
    Tapi ternyata banyak ORM2 lainnya, NHibernate, DataObjects.net, dsb.

    Menurut lu kenapa kita pakai 3rd party ORM dibandingin Entity Framework / LINQ to SQL yang udah native di C#?

    Thanks!

  2. Gilang berkata:

    Thanks Ran. 🙂

    Iya salah satu contohnya itu LINQ to SQL dan Entity Framework kalau di .NET. Nanti gw sih mencoba ngebandingin ORM di Java yang pakai Java Persistence API dan yang di .NET pakai Entity Framework. Gw sendiri belum pernah mencoba 3rd party ORM untuk saat ini. Nanti kalau udah pernah nyoba, gw bakal coba share di sini. 😀

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *