Selasa, 02 Desember 2008

Object Database Perst


Apa itu Perst?

Perst merupakan Sistem Object Oriented Database sederhana untuk Java/.Net. Object Oriented disini maksudnya bahwa Perst dapat melakukan store/load object secara langsung. Sasaran dari Perst adalah menyediakan bagi programmer suatu mekanisme yang sesuai dan powerful terhadap data yang dalam jumlah besar. Beberapa asumsi dasar yang menentukan desain dari Perst, antara lain:

  1. Object persistent dapat diakses dalam cara yang sama sebagai object sementara

  2. Engine database dapat lebih mudah dikelola secara efisien untuk data yang banyak dan dapat sesuai di memori utama

  3. tidak perlu preprocessor yang khusus, compiler, virtual machine atau tools lainnya yang seharusnya diperlukan pada database dan untuk mengembangkan aplikasi yang menggunakannya.



Menyimpan Object ke dalam database

Sasaran utama dari Perst adalah memandu programmer untuk bekerja dengan object persistent dengan cara yang dimungkinkan sama dengan object sementara secara normal. Bagaimanapun, persistensi memiliki aspek yang tidak dapat disembunyikan bagi programmer. Sebagai contoh, suatu penyimpanan Perst dimana object-object akan disimpan perlu dispesifikasikan, dan konsistensi data perlu disediakan. Dengan Perst, task-task tersebut dilakukan oleh class Storage. Class ini merupakan class abstract dan programmer wajib menggunakan class storageFactory untuk membuat instance storage.


  1

2


// get instance of the storage
Storage db = StorageFactory.getInstance().createStorage();



Jika instance storage sudah dibuat, maka storage dapat di-Open:


// open the database

db.open("test.dbs", pagePoolSize);



Dapat dimungkinkan penggunaan Perst sebagai memori internal database, di mana semua data disimpan dan dikelola pada memori utama. Hal ini memerlukan penggunaan class stub NullFile dan menspesifikasikan INFINITE_PAGE_POOL sebagai pagepoolsize.


db.open(new NullFile(),Storage.INFINITE_PAGE_POOL);


Jika aplikasi menggunakan suatu database Perst diakhiri, database tersebut perlu ditutup menggunakan method Storage.close()


// get instance of the storage

Storage db = StorageFactory.getInstance().createStorage();

db.open("test.dbs", pagePoolSize); // Open the database

// do something with the database

db.close(); // ... and close it



Root Object

Setelah instance storage dibuka, database dapat diakses object persistentnya. Ketika aplikasi mengakses object secara normal, aplikasi menggunakan referensi agar object tetap berada pada variable program atau dalam field-field dari object lain. Tetapi jika embuka suatu database yang terdiri dari object persistent, aplikasi tidak akan mereferensi ke object tersebut.


Suatu mekanisme diperlukan untuk mendapatkan referensi dan Perst menyediakannya untuk dapat digunakan yang disebut root object. Suatu storage hanya memiliki satu root object. Untuk membuat root object digunakan method Storage.getRoot.


MyRootClass root = (MyRootClass)db.getRoot();// get storage root

if (root == null) {

// Root is not yet defined: storage is not initialized

root = new MyRootClass(db); // create root object

db.setRoot(root); // register root object

}


Contoh Program menggunakan Object Database Perst


Class Barang.java


package coba01;
import org.garret.perst.*;
public class Barang extends Persistent {
String KodeBarang;
String NamaBarang;
String Jenis;
double HargaSatuan;
String Supplier;

public Barang(String kd,String nm, String jns, double hrg, String sup){
this.KodeBarang = kd;

this.NamaBarang = nm;

this.Jenis =jns;

this.HargaSatuan =hrg;

this.Supplier = sup;

}

public String getKodeBarang(){

return KodeBarang;

}

public String getNamaBarang(){

return NamaBarang;

}

public String getJenis(){

return Jenis;

}

public double getHarga(){

return HargaSatuan;

}

public String getSupplier(){

return Supplier;

}

public String toString(){

return KodeBarang+"/"+NamaBarang+"/"+Jenis+"/"+

String.valueOf(HargaSatuan)+"/"+Supplier;

}

}


Class Main.java


package coba01;


import java.io.File;

import org.garret.perst.*;

import java.util.*;



/**

*

* @author Team_dakoop

*/



public class Main {

public static void main(String[] args) {

new File("Barang.dbs").delete();

Storage db = StorageFactory.getInstance().createStorage();

db.open("Barang.dbs");


IPersistentSet root = (IPersistentSet)db.getRoot();

if (root == null) {

root = db.createSet();

db.setRoot(root);

}

root.add(new Barang("M33",

"Mie Goreng Ayam","Mie",1200,"Fastfood"));

root.add(new Barang("S03",

"Sun Silk","Shampo",6500,"UniClean"));

root.add(new Barang("M11",

"Mie Goreng Ayam","Mie",1000,"FlyFood"));

root.add(new Barang("K31",

"Kopi cap API","Kopi",2700,"Obor"));

root.add(new Barang("T01",

"Teh Aroma Wangi","Teh",4500,"UniClean"));

root.add(new Barang("M02",

"Soto Mie","Mie",1100,"Fastfood"));

root.add(new Barang("M51",

"Mie Kari","Mie",1300,"FlyFood"));

root.add(new Barang("K21",

"Kopi cap Wangi","Kopi",7500,"Uniclean"));

root.add(new Barang("T05",

"Teh T-Melati","Teh",5500,"Obor"));

root.add(new Barang("M82",

"Mie Bakso","Mie",1200,"Fastfood"));


System.out.println("Object sudah persistent dalam Database");

Iterator iterator = root.iterator();


while (iterator.hasNext()) {

System.out.println(iterator.next());

}

db.close();

}

}



Hasil :


Object sudah persistent dalam Database

M33/Mie Goreng Ayam/Mie/1200.0/Fastfood

S03/Sun Silk/Shampo/6500.0/UniClean

M11/Mie Goreng Ayam/Mie/1000.0/FlyFood

K31/Kopi cap API/Kopi/2700.0/Obor

T01/Teh Aroma Wangi/Teh/4500.0/UniClean

M02/Soto Mie/Mie/1100.0/Fastfood

M51/Mie Kari/Mie/1300.0/FlyFood

K21/Kopi cap Wangi/Kopi/7500.0/Uniclean

T05/Teh T-Melati/Teh/5500.0/Obor

M82/Mie Bakso/Mie/1200.0/Fastfood




Resources:

Download Perst from McObject's Web site : www.mcobject.com/perst.




Referensi


Perst TM Introduction and Tutorial, McObject, 2008







Native Query pada DB4O

Native query merupakan pengembangan dari Object Query sebelumnya. Di mana object query sebelumnya memiliki banyak kekurangan diantaranya pengecekan kesalahan dan keamanan dari query.


Dimisalkan ada relationship antar object, yaitu:




Diasumsikan bahwa seorang Person memiliki suatu Account di suatu bank. Maka relationship yang akan dibuat akan membentuk dua class dengan attribute seperti berikut:



Class Account

public class Account {
private double amount;
private double credit;
}



Class Person

  1. public class Person {
  2. private Account account;
  3. private String name;
  4. private int age;
  5. }


Misalkan Object Personnya sebagai berikut:





Dari data table tersebut, Tuliskan Query di bawah ini dengan perintah SQL (untuk DBMS) dan Native Query (Object Database Db4o):

  1. Tampilkan semua kolom dari Tabel tersebut
  2. Tampilkan jumlah amount dan credit dari accountnya Linda.
  3. Tampilkan nama serta jumlah credit yang kurang dari 100.
  4. Tampilkan nama serta jumlah amount atau credit yang kurang dari 100.
  5. Tampilkan nama yang umurnya antara 40-50 dan creditnya diatas 1000
  6. Tampilkan nama serta umurnya yang Amount sama dengan nasabah Heinz.


Karena kita menggunakan Object Database Db4o maka tabel tersebut dibuat sebagai suatu Class.


Berikut ini kode program dari Class Person:


  1. package bank;
  2. /**
  3. *
  4. * @author Team_dakoop
  5. */
  6. public class Person {
  7. private Account account;
  8. private String Name;
  9. private int Age;
  10. public Person(String name, int age){
  11. this.Name = name;
  12. this.Age = age;
  13. this.account=null;
  14. }
  15. public String getName(){
  16. return Name;
  17. }
  18. public int getAge(){
  19. return Age;
  20. }
  21. public void setAccount(Account account){
  22. this.account = account;
  23. }
  24. public Account getAccount(){
  25. return account;
  26. }
  27. public String toString(){
  28. return Name+"/"+Age+"/"+account;
  29. }
  30. }


Berikut ini kode program dari Class Account:


  1. package bank;
  2. /**
  3. *
  4. * @author Team_dakoop
  5. */
  6. public class Account {
  7. private double Amount;
  8. private double Credit;
  9. public Account(double amount, double credit){
  10. this.Amount=amount;
  11. this.Credit = credit;
  12. }
  13. public double getAmount(){
  14. return Amount;
  15. }
  16. public double getCredit(){
  17. return Credit;
  18. }
  19. public String toString(){
  20. return Amount+"/"+Credit;
  21. }
  22. }


Solusi Query ke-1

Tampilkan semua kolom dari Tabel tersebut

Perintah SQL dalam DBMS:

SELECT *
FROM Person;


Object Query dalam Db4o:

  1. ObjectSet persons = db.query(new Predicate()
  2. {
  3. public boolean match(Person person) {
  4. return true;
  5. }
  6. });


Hasil Query ke-1

  1. Query 1 : SELECT * FROM Person;
  2. Hasil : 6
  3. Rossi/28/1500.0/500.0
  4. Tony/35/2500.0/300.0
  5. James/42/1250.0/50.0
  6. Heinz/20/1500.0/500.0
  7. Eric/22/150.0/0.0
  8. Linda/45/5000.0/1500.0


Solusi Query ke-2

Tampilkan jumlah amount dan credit dari accountnya Linda.


Perintah SQL dalam DBMS:

SELECT Amount, Credit
FROM Person
WHERE Name = ‘Linda’;


Object Query dalam Db4o:

  1. ObjectSet persons = db.query(new Predicate()
  2. {
  3. public boolean match(Person person) {
  4. return person.getName().equals("Linda");
  5. }
  6. });

Hasil Query ke-2

Query 2 : SELECT Amount,Credit FROM Person WHERE Name = 'Linda';
Hasil : 1 record
5000.0/1500.0



Solusi Query ke-3

Tampilkan nama serta jumlah credit yang kurang dari 100.


Perintah SQL dalam DBMS:

SELECT Name, Credit
FROM Person
WHERE Credit <>


Object Query dalam Db4o:


  1. ObjectSet persons = db.query(new Predicate()
  2. {
  3. public boolean match(Person person) {
  4. return person.getAccount().getCredit() <>
  5. }
  6. });


Hasil Query ke-3

Query 3 : SELECT Name, Credit FROM Person WHERE Credit <>


Solusi Query ke-4

Tampilkan nama serta jumlah amount atau credit yang kurang dari 100.


Perintah SQL dalam DBMS:

SELECT Name, Amount, Credit
FROM Person
WHERE Amount <>


Object Query dalam Db4o:


  1. ObjectSet persons = db.query(new Predicate()
  2. {
  3. public boolean match(Person person) {
  4. return person.getAccount().getAmount() <>
  5. person.getAccount().getCredit() <>
  6. }
  7. });



Hasil Query ke-4

Query 4 : SELECT Name, Amount, Credit FROM Person WHERE Amount <>

Solusi Query ke-5

Tampilkan nama yang umurnya antara 40-50 dan creditnya diatas 1000


Perintah SQL dalam DBMS:

SELECT Name
FROM Person
WHERE (Age between 40 AND 50) AND (Credit > 1000);


Object Query dalam Db4o:

  1. ObjectSet persons = db.query(new Predicate()
  2. {
  3. public boolean match(Person person) {
  4. return person.getAge() >= 40
  5. && person.getAge() <= 50
  6. && person.getAccount().getCredit() > 1000.0;
  7. }
  8. });


Hasil Query ke-5

Query 5 : SELECT Name FROM Person WHERE (Age Between 40 AND 50) AND (Credit > 1000);
Hasil : 1 record
Linda



Solusi Query ke-6

Tampilkan nama serta umurnya yang Amount sama dengan nasabah Heinz.


Perintah SQL dalam DBMS:

SELECT Name, Age
FROM Person
WHERE Not( Name = ‘Heinz’) AND Amount IN (
SELECT Amount
FROM Person
WHERE Name = ‘Heinz’);


Object Query dalam Db4o:

  1. ObjectSet Subpersons = db.query(new Predicate()
  2. {
  3. public boolean match(Person person) {
  4. return person.getName().equals("Rossi");
  5. }
  6. });
  7. while (Subpersons.hasNext())
  8. {
  9. final Person persons = (Person)Subpersons.next();
  10. ObjectSet Objperson = db.query(new Predicate()
  11. {
  12. public boolean match(Person p) {
  13. return p.getAccount().getAmount() ==
  14. persons.getAccount().getAmount()
  15. && p.getName() != "Heinz" ;
  16. }
  17. });
  18. }



Hasil Query ke-6

Query 6 :
SELECT Name, Age
FROM Person
WHERE Not( Name = ‘Heinz’) AND Amount IN (
SELECT Amount
FROM Person
WHERE Name = ‘Heinz’);
Hasil : 1 record
Rossi




Full Source Code

  1. package bank;

  2. /**
  3. *
  4. * @author Team_dakoop
  5. */
  6. import com.db4o.*;
  7. import com.db4o.query.*;
  8. import java.io.File;

  9. public class Main {

  10. /**
  11. * @param args the command line arguments
  12. */
  13. public static void main(String[] args) {
  14. // TODO code application logic here
  15. InsertData();
  16. Query1();
  17. Query2();
  18. Query3();
  19. Query4();
  20. Query5();
  21. Query6();
  22. }
  23. public static void InsertData(){
  24. new File("Person.yap").delete();
  25. ObjectContainer db = Db4o.openFile("Person.yap");
  26. Account a1 = new Account(1500, 500);
  27. Person p1 = new Person("Heinz", 20);
  28. p1.setAccount(a1);
  29. Account a2 = new Account(5000, 1500);
  30. Person p2 = new Person("Linda", 45);
  31. p2.setAccount(a2);
  32. Person p3 = new Person("Eric", 22);
  33. Account a3 = new Account(150, 0);
  34. p3.setAccount(a3);
  35. Person p4 = new Person("James", 42);
  36. Account a4 = new Account(1250, 50);
  37. p4.setAccount(a4);
  38. Person p5 = new Person("Tony", 35);
  39. Account a5 = new Account(2500, 300);
  40. p5.setAccount(a5);
  41. Person p6 = new Person("Rossi", 28);
  42. Account a6 = new Account(1500, 500);
  43. p6.setAccount(a6);
  44. db.set(p1);db.set(p2);db.set(p3);db.set(p4);db.set(p5);db.set(p6);
  45. db.close();
  46. System.out.println("Data Person sudah tersimpan");
  47. }
  48. public static void Query1(){
  49. ObjectContainer db = Db4o.openFile("Person.yap");
  50. ObjectSet persons = db.query(new Predicate()
  51. {
  52. public boolean match(Person person) {
  53. return true;
  54. }
  55. });
  56. System.out.println("Query 1 : SELECT * FROM Person;");
  57. System.out.println("Hasil : " + persons.size());
  58. while (persons.hasNext()){
  59. System.out.println(persons.next());
  60. }
  61. db.close();
  62. }

  63. public static void Query2(){
  64. ObjectContainer db = Db4o.openFile("Person.yap");
  65. ObjectSet persons = db.query(new Predicate()
  66. {
  67. public boolean match(Person person) {
  68. return person.getName().equals("Linda");
  69. }
  70. });
  71. System.out.println("Query 2 : SELECT Amount,Credit FROM Person WHERE Name = 'Linda';");
  72. System.out.println("Hasil : " + persons.size()+" record");
  73. while (persons.hasNext()){
  74. Person person = (Person)persons.next();
  75. System.out.println(person.getAccount());
  76. }
  77. db.close();
  78. }


  79. public static void Query3(){
  80. ObjectContainer db = Db4o.openFile("Person.yap");
  81. ObjectSet persons = db.query(new Predicate()
  82. {
  83. public boolean match(Person person) {
  84. return person.getAccount().getCredit() <>
  85. }
  86. });
  87. System.out.println("Query 3 : SELECT Name, Credit FROM Person WHERE Credit <>
  88. System.out.println("Hasil : " + persons.size()+" record");
  89. while (persons.hasNext()){
  90. Person person = (Person)persons.next();
  91. System.out.println(person.getName()+"/"+ person.getAccount().getCredit());
  92. }
  93. db.close();
  94. }
  95. public static void Query4(){
  96. ObjectContainer db = Db4o.openFile("Person.yap");
  97. ObjectSet persons = db.query(new Predicate()
  98. {
  99. public boolean match(Person person) {
  100. return person.getAccount().getAmount() <>
  101. }
  102. });
  103. System.out.println("Query 4 : SELECT Name, Amount, Credit FROM Person WHERE Amount <>
  104. System.out.println("Hasil : " + persons.size()+" record");
  105. while (persons.hasNext()){
  106. Person person = (Person)persons.next();
  107. System.out.println(person.getName()+"/"+ person.getAccount());
  108. }
  109. db.close();
  110. }

  111. public static void Query5(){
  112. ObjectContainer db = Db4o.openFile("Person.yap");
  113. ObjectSet persons = db.query(new Predicate()
  114. {
  115. public boolean match(Person person) {
  116. return person.getAge() >= 40
  117. && person.getAge() <= 50
  118. && person.getAccount().getCredit() > 1000.0;
  119. }
  120. });
  121. System.out.println("Query 5 : SELECT Name FROM Person WHERE (Age Between 40 AND 50) AND (Credit > 1000);");
  122. System.out.println("Hasil : " + persons.size()+" record");
  123. while (persons.hasNext()){
  124. Person person = (Person)persons.next();
  125. System.out.println(person.getName());
  126. }
  127. db.close();
  128. }
  129. public static void Query6(){
  130. ObjectContainer db = Db4o.openFile("Person.yap");
  131. ObjectSet Subpersons = db.query(new Predicate()
  132. {
  133. public boolean match(Person person) {
  134. return person.getName().equals("Rossi");
  135. }
  136. });
  137. while (Subpersons.hasNext())
  138. {
  139. final Person persons = (Person)Subpersons.next();
  140. ObjectSet Objperson = db.query(new Predicate()
  141. {
  142. public boolean match(Person p) {
  143. return p.getAccount().getAmount() == persons.getAccount().getAmount()
  144. && p.getName() != "Heinz" ;
  145. }
  146. });
  147. System.out.println("Query 6 :");
  148. System.out.println("SELECT Name, Age");
  149. System.out.println("FROM Person");
  150. System.out.println("WHERE Not( Name = ‘Heinz’) AND Amount IN (");
  151. System.out.println(" SELECT Amount");
  152. System.out.println(" FROM Person");
  153. System.out.println(" WHERE Name = ‘Heinz’);");
  154. System.out.println("Hasil : " + Objperson.size()+" record");
  155. while (Objperson.hasNext()){
  156. Person person = (Person)Objperson.next();
  157. System.out.println(person.getName());
  158. }
  159. }
  160. db.close();
  161. }
  162. }


Referensi

Db4o-5.2 Tutorial, db4objects Inc., USA


Irwanto, Djon., 2007, Membangun Object Oriented Software dengan Java dan Object Database, PT Elex Media Komputindo, Jakarta