Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="body">
2
<!-- $Id $ -->
3
 
4
<h1 id="140062">Pemeta Data</h1>
5
<com:SinceVersion Version="3.1a" />
6
<p id="700505" class="block-content">Pemeta Data memindahkan data antara obyek dan database sementara memeliharanya berdiri sendiri satu sama lain dan pemetanya sendiri. Jika Anda mulai dengan
7
    <a href="?page=Database.ActiveRecord">Active Records</a>, mungkin nantinya Anda dihadapkan dengan obyek bisnis lebih kompleks seiring denga kemajuan proyek Anda. Ketika Anda membangun model obyek dengan banyak logika bisnis, sangat berharga untuk memakai mekanisme ini untuk mengatur data lebih baik dan perilaku bersamanya. Melakukan itu menyebabkan skema varian; yakni skema obyek dan skema relasional tidak sama.
8
</p>
9
 
10
<p id="700506" class="block-content">Pemeta Data memisahkan obyek dalam-memori dari database. Tanggung jawabnya adalah mentransfer data diantara keduanya dan juga saling mengisolasinya.
11
    Dengan Pemeta Data obyek dalam-memori tidak perlu mengetahui meskipun ada sebuah database; tidak perlu kode antarmuka SQL, dan tentunya tidak mengetahui skema database. (Skema database selalu diabaikan dari obyek yang memakainya.)
12
</p>
13
 
14
<h2 id="140063">Kapan Menggunakannya</h2>
15
<p id="700507" class="block-content">Tujuan utama menggunakan Pemeta Data ialah ketika Anda menginginkan skema database dan model obyek tumbuh secara independen. Keuntungan utama dari Pemeta Data adalah bahwa saat bekerja pada obyek bisnis (atau domain) Anda bisa mengabaikan database, baik dalam desain maupun pembangunan propes pengujian. Obyek domain tidak mengetahui struktur databasenya karena semua ini dikerjakan oleh pemeta.
16
</p>
17
 
18
<p id="700508" class="block-content">Ini membantu Anda dalam kode karena Anda bisa mengerti serta bekerja dengan obyek domain tanpa harus mengerti bagaimana ia disimpan dalam. Anda bisa memodifikasi model bisnis atau database tanpa harus mengubahnya. Dengan pemetaan rumit, terutama yang menyangkut <b>database yang sudah ada</b>, ini sangat berharga.
19
</p>
20
 
21
<p id="700509" class="block-content">Harga tentunya merupakan lapisan ekstra yang tidak Anda peroleh dengan <a href="?page=Database.ActiveRecord">Rekaman Aktif</a>, maka pengujian menggunakan pola ini adalah kompleksitas dari logika bisnis. Jika Anda memiliki logika bisa cukup sederhana, <a href="?page=Database.ActiveRecord">Rekaman Aktif</a> mungkin akan mencukupi.
22
Untuk logika yang lebih rumit, Pemeta Data mungkin lebih cocok.
23
</p>
24
 
25
<h2 id="140064">Pemeta Data SqlMap</h2>
26
<p id="700510" class="block-content">Kerangka kerja Pemeta Data SqlMap memudahkan untuk menggunakan database dengan aplikasi PHP.
27
    PemetaData SqlMap memasangkan obyek dengan prosedur tersimpan atau pernyataan SQL menggunakan deskriptor XML. Kesederhanaan adalah keuntungan terbesar dari PemetaData SqlMap di atas piranti pemetaan relasional obyek. Untuk menggunakan PemetaData SqlMap Anda bergantung pada obyek Anda sendiri,
28
    XML, dan SQL. Anda sedikit yang harus mempelajari yang belum Anda ketahui.
29
    Dengan Pemeta Data SqlMap Anda mempunyai tenaga penuh pada SQL dan prosedur tersimpan di tangan Anda.
30
</p>
31
 
32
<p id="700511" class="block-content">
33
    <img src=<%~ diagram.png %> alt="Tinjauan Pemeta Data SqlMap" id="fig:sqlmap.png" class="figure"/>
34
 
35
    Ini adalah penjelasan tingkat tinggi atas alur kerja yang dilukiskan pada gambar di atas.
36
    Menyediakan parameter, baik sebagai obyek ataupun tipe primitif. Parameter bisa dipakai untuk menyetel nilai runtime dalam pernyataan SQL atau prosedur. Jika nilai runtime tidak diperlukan, parameter dapat diabaikan.
37
</p>
38
<p id="700512" class="block-content">Menjalankan pemetaan dengan mengirimkan parameter dan nama yang Anda berikan pada deskriptor XML Anda. Langkah ini adalah saat di mana keajaiban terjadi. Kerangka kerja akan menyiapkan pernyataan SQL atau prosedur tersimpan, menyetel setiap nilai runtime menggunakan parameter Anda, menjalankan prosedur atau pernyataan, dan mengembalikan hasil.
39
</p>
40
 
41
<p id="700513" class="block-content">Dalam hal pemutakhiran, jumlah baris yang dipengaruhi dikembalikan. Dalam hal query, obyek tunggal, atau koleksi obyek dikembalikan. Seperti parameter, obyek hasil, atau koleksi obyek, bisa berupa obyek biasa ataupun tipe PHP primitif.
42
</p>
43
 
44
<h2 id="140065">Menyiapkan koneksi database dan menginisialisasi SqlMap</h2>
45
<p id="700514" class="block-content">
46
    Koneksi database untuk SqlMap dapat disetel seperti berikut.
47
    Lihat <a href="?page=Database.DAO">Menetapkan Koneksi Database</a> untuk lebih jelasnya mengenai pembuatan koneksi database secara umum.
48
<com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700166">
49
//buat koneksi dan berikan ke manajer SqlMap.
50
$dsn = 'pgsql:host=localhost;dbname=test'; //Postgres SQL
51
$conn = new TDbConnection($dsn, 'dbuser','dbpass');
52
$manager = new TSqlMapManager($conn);
53
$manager->configureXml('my-sqlmap.xml');
54
$sqlmap = $manager->getSqlMapGateway();
55
</com:TTextHighlighter>
56
</p>
57
 
58
<p id="700515" class="block-content">
59
    <tt>TSqlMapManager</tt> bertanggung jawab untuk menyiapkan koneksi database dan mengkonfigurasi SqlMap dengan file XML yang diberikan. metode <tt>configureXml()</tt> menerima string yang merujuk ke file konfigurasi XML SqlMap. Sekali dikonfigurasi, panggil metode <tt>getSqlMapGateway()</tt> untuk memperoleh turunan dari antarmuka gateway SqlMap (pakai obyek ini untuk menyisipkan/menghapus/mencari rekaman).
60
</p>
61
 
62
<p id="700516" class="block-content">
63
    Koneksi database SqlMap juga bisa dikonfigurasi menggunakan tag <tt>&lt;module&gt;</tt> dalam <a href="?page=Configurations.AppConfig">application.xml</a> atau
64
    <a href="?page=Configurations.PageConfig">config.xml</a> seperti berikut.
65
<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_700167">
66
<modules>
67
  <module id="my-sqlmap" class="System.Data.SqlMap.TSqlMapConfig"
68
        EnableCache="true" ConfigFile="my-sqlmap.xml" >
69
    <database ConnectionString="pgsql:host=localhost;dbname=test"
70
        Username="dbuser" Password="dbpass" />
71
  </module>
72
</modules>
73
</com:TTextHighlighter>
74
</p>
75
 
76
<p id="700517" class="block-content">
77
    Atribut <tt>ConfigFile</tt> harus menunjuk ke file konfigurasi SqlMap     (dijelaskan nanti) baik menggunakan path absolut, path relatif ataupun path notasi titik namespace Prado (harus mengabaikan ekstensi ".xml").
78
 
79
    <div class="tip"><b class="note">Tip:</b>
80
        Atribut <tt>EnableCache</tt> saat disetel "true" akan men-cache
81
        konfigurasi yang diurai. Anda harus membersihkan atau menghapus cache jika Anda mengubah file konfigurasinya.
82
        <a href="?page=Advanced.Performance#6402">modul cache</a> juga harus didefinisikan agar cache berfungsi.
83
    </div>
84
</p>
85
 
86
<p id="700518" class="block-content">Untuk mendapatkan antarmuka gateway SqlMap dari konfigurasi &lt;module&gt;, cukup lakukan misalnya
87
<com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700168">
88
class MyPage extends TPage
89
{
90
    public function onLoad($param)
91
    {
92
        parent::onLoad($param);
93
        $sqlmap = $this->Application->Modules['my-sqlmap']->Client;
94
        $sqlmap->queryForObject(...); //query beberapa obyek
95
    }
96
}
97
</com:TTextHighlighter>
98
</p>
99
 
100
<h2 id="140066">Contoh cepat</h2>
101
<p id="700519" class="block-content">Mari kita anggap tabel "users" berikut yang berisi dua kolom bernama "username" dan "email", di mana "username" juga merupakan kunci primer.
102
<com:TTextHighlighter Language="sql" CssClass="source block-content" id="code_700169">
103
CREATE TABLE users
104
(
105
    username VARCHAR( 20 ) NOT NULL ,
106
    email VARCHAR( 200 ) ,
107
    PRIMARY KEY ( username )
108
);
109
</com:TTextHighlighter>
110
</p>
111
<p id="700520" class="block-content">Kemudian kita mendefinisikan kelas <tt>User</tt> biasa seperti berikut. Perhatikan bahwa <tt>User</tt> sangat sederhana.
112
<com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700170">
113
class User
114
{
115
    public $username;
116
    public $email;
117
}
118
</com:TTextHighlighter>
119
</p>
120
</p>
121
 
122
<p id="700521" class="block-content">Selanjutnya, kita perlu mendefinisikan file konfigurasi XML SqlMap, mari namai file sebagai <tt>my-sqlmap.xml</tt>.
123
<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_700171">
124
<?xml version="1.0" encoding="utf-8" ?>
125
<sqlMapConfig>
126
    <select id="SelectUsers" resultClass="User">
127
        SELECT username, email FROM users
128
    </select>
129
</sqlMapConfig>
130
</com:TTextHighlighter>
131
</p>
132
<p id="700522" class="block-content">Tag &lt;select&gt; mengembalikan definisi pernyataan SQL. Atribut <tt>id</tt> akan dipakai sebagai pengenal untuk query. Nilai atribut <tt>resultClass</tt> adalah nama kelas obyek yang dikembalikan.
133
    Sekarang kita dapat melakukan query obyek sebagai berikut:
134
 
135
<com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700172">
136
//anggap bahwa $sqlmap adalah turunan TSqlMapGateway
137
$userList = $sqlmap->queryForList("SelectUsers");
138
 
139
//Atau hanya satu, jika hanya itu yang Anda butuhkan:
140
$user = $sqlmap->queryForObject("SelectUsers");
141
</com:TTextHighlighter>
142
</p>
143
 
144
<p id="700523" class="block-content">Contoh di atas hanya menampilkan demonstrasi sedikit kemampuan Pemeta Data SqlMap. Rincian selanjutnya dapat ditemukan dalam
145
    <a href="http://www.pradosoft.com/demo/sqlamp/">SqlMap Manual</a>.
146
</p>
147
 
148
<h2 id="140067">Menggabung SqlMap dengan Rekaman Aktif</h2>
149
<p id="700524" class="block-content">Contoh di atas nampaknya seperti sepele dan ia juga seperti banyak pekerjaan hanya untuk mengambil data. Akan tetapi, perhatikan bahwa kelas <tt>User</tt> sama sekali tidak mengetahui telah disimpan dalam database, dan database tidak mengetahui kelas <tt>User</tt>.
150
</p>
151
<p id="700525" class="block-content">
152
    Salah satu keuntungan dari SqlMap adalah kemampuan memetakan hubungan
153
    obyek yang kompleks, koleksi dari datbase yang sudah ada. Dilain pihak,
154
    <a href="?page=Database.ActiveRecord">Rekaman Aktif</a> menyediakan cara
155
    yang sangat sederhana untuk berinteraksi dengan database tapi tidak bisa
156
    melakukan hubungan atau koleksi yang lebih rumit. Kompromi yang baik adalah
157
    menggunakan SqlMap untuk mengambil hubungan dan koleksi rumit sebagai
158
    obyek Rekaman Aktif dan kemudian menggunakan Rekaman Aktif ini untuk memutakhirkan, menyisipkan dan menghapus.
159
</p>
160
<p id="700526" class="block-content">Melanjutkan contoh sebelumnya, kita mengubah definisi kelas <tt>User</tt> menjadi sebuah Rekaman Aktif.
161
<com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700173">
162
class UserRecord extends TActiveRecord
163
{
164
	const TABLE='users'; //nama tabel
165
 
166
    public $username; //kolom bernama "username" dalam tabel "users"
167
    public $email;
168
 
169
    /**
170
     * @return TActiveRecord active record finder instance
171
     */
172
    public static function finder($className=__CLASS__)
173
    {
174
        return parent::finder($className);
175
    }
176
}
177
</com:TTextHighlighter>
178
</p>
179
 
180
<p id="700527" class="block-content">Kita juga perlu mengubah definisi dari konfigurasi XML SqlMap XML configuration. Kita cukup perlu mengubah nilai atribut <tt>resultClass</tt> ke <tt>UserRecord</tt>.
181
<com:TTextHighlighter Language="xml" CssClass="source block-content" id="code_700174">
182
<?xml version="1.0" encoding="utf-8" ?>
183
<sqlMapConfig>
184
    <select id="SelectUsers" resultClass="UserRecord">
185
        SELECT username, email FROM users
186
    </select>
187
</sqlMapConfig>
188
</com:TTextHighlighter>
189
</p>
190
 
191
 
192
<p id="700528" class="block-content">Kode PHP untuk mengambil pengguna tetap sama, tapi sebaliknya SqlMap mengembalikan Rekaman Aktif, dan kita bisa mengambil keuntungan dari metode Rekaman Aktif.
193
 
194
<com:TTextHighlighter Language="php" CssClass="source block-content" id="code_700175">
195
//anggap bahwa $sqlmap adalah turunan TSqlMapGateway
196
$user = $sqlmap->queryForObject("SelectUsers");
197
 
198
$user->email = 'test@example.com'; //ubah data
199
$user->save(); //simpan menggunakan Rekaman Aktif
200
</com:TTextHighlighter>
201
</p>
202
 
203
<h2 id="140068">Referensi</h2>
204
<ul id="u1" class="block-content">
205
    <li>Fowler et. al. <i>Patterns of Enterprise Application Architecture</i>,
206
    Addison Wesley, 2002.</li>
207
    <li>iBatis Team. <i>iBatis Data Mapper</i>,
208
    <a href="http://ibatis.apache.org">http://ibatis.apache.org</a>.</li>
209
</ul>
210
 
211
<div class="last-modified">$Id: SqlMap.page 1846 2007-04-07 10:35:16Z wei $</div></com:TContent>