Google Website Translator Gadget

Sunday, March 27, 2011

Siri 3 : Mengenali Grails Data Sources dan Grails Object Relational Mapping (GORM)

Pada artikel sebelum ini, saya telah mula membina satu aplikasi mudah bagi merekod maklumat buku. Dengan hanya beberapa baris kod pada domain class dan controller sudah boleh ada fungsi CRUD (create-read-update-delete) bagi mengemaskini maklumat buku.

Bagi saya, yang pertama kali bersua dengan Grails, terasa hairan, "Bagaimana Grails menyimpan maklumat yang telah dikemaskini ?". Kebiasaannya bagi aplikasi sistem perlu ada perisian pangkalan data. Tetapi saya tidak membuat sebarang database atau tables atau fields. Dan kenapa apabila saya tutup aplikasi Grails saya pada Netbeans, data saya sudah tidak wujud bila dibuka kembali ?

Jawapannya terdapat pada Grails Data Source (sumber data) yang menjadi fail konfigurasi sebagai penghubung antara aplikasi dan pangkalan data. Pada fail ini terdapat maklumat berkaitan:
  1. Jenis pangkalan data (database) yang digunakan
  2. Nama pengguna (user name) kepada pangkalan data berkenaan
  3. Katalaluan (password) kepada pangkalan data berkenaan
  4. Jenis penggunaan (environment) pangkalan data samada
    1. pembangunan (development)
    2. ujian (test)
    3. produksi (production)
Melalui fail Data Source ini pula, Grails mempunyai komponen Grails Object Relational Mapping (GORM) dan Hibernate. Komponen ini akan membaca maklumat yang telah di senaraikan pada Domain Classes dan secara automatik mewujudkan table berdasarkan nama Domain Class dan table fields berdasarkan konfigurasi Domain Class berkenaan. Dan apabila aplikasi digunakan, komponen berkenaan akan melaksanakan kemaskini data kepada pangkalan data.

Dalam dunia Java, class merupakan satu bentuk object. Object melaksanakan fungsi-fungsi seperti pengiraan, pemprosesan dan paparan antaramuka. GORM dan Hibernate merupakan perantara (juga disebut sebagai satu bentuk middleware) bagi object dan pangkalan data. Saya cuba buat perkaitan yang mudah menggunakan MVC pattern:



Apabila object, sebagai contoh antaramuka Buku List, perlu memaparkan senarai buku, perantara ini akan membaca data dari pangkalan data dan disampaikan kepada object berkenaan, tanpa perlu ada SQL Statement "SELECT ... FROM ... WHERE ... ".

Sama juga apabila object, sebagai contoh antaramuka New Buku, perlu menyimpan data, perantara akan ambil data dari object berkenaan dan disimpan ke dalam pangkalan data, juga tanpa perlu ada SQL Statement "INSERT INTO ... VALUES ...". Perkara sama juga bagi pindaan UPDATE dan padam DELETE.

Hibernate juga dikenali sebagai satu jenis persistence framework. Kalau dialih bahasa bunyinya 'rangka kerja yang gigih'. Bagi saya terma-terma seperti ini yang menyebabkan keadaan menjadi dungu, membosankan untuk dipelajari dan akhirnya putus asa ! Jadi sekarang kita cuba sendiri.

  1. Fail konfigurasi Data Source boleh dibuka pada Netbeans melalui tab Projects > DemoBuku > Configuration > DataSource.groovy


  2. Perenggan pertama pada fail DataSource.groovy menyatakan jenis, nama pengguna dan katalaluan bagi pangkalan data yang digunakan.
    datasource {
         pooled = true
         driverClassName = "org.hsqldb.jdbcDriver"
         username = "sa"
         password = ""
    }
    Dari perenggan ini, saya dapat ketahui bahawa aplikasi DemoBuku saya menggunakan pangkalan data HSQLDB (HyperSQL Database).

  3. Perenggan kedua pada fail DataSource.groovy menyatakan bahawa Hibernate digunakan bersama dengan fungsinya untuk cache.
    hibernate {
        cache.use_second_level_cache = true
        cache.use_query_cache = true
        cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
    }
    Cache dapat melajukan proses paparan data dimana data yang pernah dibaca semasa sesi penggunaan tidak perlu dibaca berulang kali dari pangkalan data.

  4. Perenggan seterusnya pula adalah konfigurasi bagi jenis penggunaan environment (development, test dan production)
    environments {
        development {
            dataSource {
                dbCreate = "create-drop"
                url = "jdbc:hsqldb:mem:devDB"
            }
        }
        test {
            dataSource {
                dbCreate = "update"
                url = "jdbc:hsqldb:mem:testDb"
            }
        }
        production {
            dataSource {
                dbCreate = "update"
                url = "jdbc:hsqldb:file:prodDb;shutdown=true"
            }
        }
    }
    Perhatikan bahawa setiap jenis penggunaan environment menggunakan pangkalan data yang berlainan (devDB, testDB, dan prodDB) dan digunakan secara berlainan (create, create-drop dan update).

  5. Parameter create bermaksud gunakan pangkalan data yang sedia ada, jika ada, tetapi padam semua data; create-drop bermaksud, padamkan pangkalan data sedia ada kemudian bina semula pangkalan data dan apabila sesi dihentikan padamkan pangkalan data berkenaan; manakala update pula bermaksud guna pangkalan data dan data yang sedia ada.

  6. Sekarang saya pinda pada fail DataSources.groovy bagi penggunaan development environment kepada update dan simpan kepada file supaya data yang saya rekod semasa fasa pembangunan tidak hilang setiap kali sesi penggunaan.
    environments {
        development {
            dataSource {
                //ris 20110327 pinda create-drop ke update
                //dbCreate = "create-drop"
                dbCreate = "update"
                //ris 20110327 pinda mem ke file
                //url = "jdbc:hsqldb:mem:devDB"
                url = "jdbc:hsqldb:file:devDB"
            }
        }
        test {
            dataSource {
                dbCreate = "update"
                url = "jdbc:hsqldb:mem:testDb"
            }
        }
        production {
            dataSource {
                dbCreate = "update"
                url = "jdbc:hsqldb:file:prodDb;shutdown=true"
            }
        }
    }
    Perhatikan saya gunakan komen "//" pada barisan kod supaya kelak mudah untuk saya lihat pada pindaan yang saya telah buat. Tabiat komen adalah penting dalam pengaturcaraan.

  7. Simpankan pindaan yang dibuat pada Netbeans melalui menu File > Save All .

  8. Bina semula pindaan yang dibuat pada Netbeans melalui menu Run > Build Main Project .

  9. Mulakan projek DemoBuku pada Netbeans melalui menu Run > Run Main Project . Setelah 1 minit, pelayar web browser akan memaparkan muka utama DemoBuku pada http://localhost:8080/DemoBuku/

  10. Pada muka utama DemoBuku berkenaan, klik pada controller demobuku.BukuController, dan senarai rekod Buku List akan dipaparkan. Perhatikan senarai ini kosong walaupun pada sesi sebelum ini saya telah menyimpan rekod buku.

  11. Klik pada ikon New Buku untuk tambah rekod baru. Setelah maklumat rekod baru Buku diisi, klik pada butang Create untuk simpan rekod berkenaan.

  12. Klik pada ikon Buku List untuk paparkan senarai rekod Buku List. Senarai ini termasuk rekod baru yang telah disimpan.


  13. Hentikan projek DemoBuku pada Netbeans melalui tab Services di panel kiri : Servers > Jetty (Grails) > DemoBuku on 8080; klik-kanan dan pilih Stop.

  14. Setelah beberapa ketika, mulakan semula projek DemoBuku pada Netbeans melalui menu Run > Run Main Project . Setelah 1 minit, pelayar web browser akan memaparkan muka utama DemoBuku pada http://localhost:8080/DemoBuku/

  15. Pada muka utama DemoBuku berkenaan, klik pada controller demobuku.BukuController, dan senarai rekod Buku List akan dipaparkan. Perhatikan pada senarai ini terdapat rekod yang telah saya simpan sebelum ini.

  16. Klik pada Id bagi rekod buku; ini akan memaparkan maklumat buku bagi rekod berkenaan; kemudian klik pada ikon Edit untuk meminda maklumat berkaitan buku berkenaan.

  17. Setelah maklumat dipinda; klik pada ikon Update. Maklumat rekod berkenaan yang telah dikemaskini akan dipaparkan.

  18. Klik pada ikon Buku List, dan senarai rekod Buku List akan memaparkan senarai rekod termasuk rekod yang telah saya kemaskini.


  19. Hentikan projek DemoBuku pada Netbeans melalui tab Services di panel kiri : Servers > Jetty (Grails) > DemoBuku on 8080; klik-kanan dan pilih Stop.
Menakjubkan ! Dengan hanya meminda dua baris kod, saya boleh mengubah bagaimana untuk konfigurasi perantara GORM dan Hibernate. Pada minggu hadapan saya akan menulis bagaimana untuk konfigurasi menggunakan pangkalan data MySQL pula.

    Rujukan:
    1. http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html
    2. http://www.hibernate.org/
    3. http://en.wikipedia.org/wiki/Model-view-controller
    4. http://hsqldb.org/
    5. http://grails.org/doc/1.0.x/guide/3.%20Configuration.html

      1 comment:

      Seymour Cakes said...

      Amat menarik.
      Terima kasih atas sumbangan saudara. :-)