BAB III PEMBANGUNAN API MYSQL
Setelah dilakukan studi mendalam tentang hal-hal teknis yang berhubungan dengan pengerjaan Tugas Akhir ini maka langkah selanjutnya adalah membangun API MySQL dengan menggunakan metodologi Rational Unified Process (RUP) yang bersifat iteratif[BEN02]. Selanjutnya API MySQL ini akan disebut dengan MyME.
III.1 Deskripsi Umum MyME adalah sebuah API yang mengimplementasikan protokol MySQL dan memungkinkan aplikasi Java ME untuk berkomunikasi dengan MySQL Server. Sebuah aplikasi Java ME dapat menggunakan MyME untuk melakukan komunikasi dengan MySQL Server pada jaringan wireless.
Gambar III-1 - Gambaran global MyME
MyME pada versi ini tidak akan mengimplementasikan semua protokol MySQL sehingga tidak semua fitur dari MySQL Server dapat digunakan. Salah satu fitur protokol MySQL yang tidak diimplementasikan adalah protokol untuk menangani Prepared Statement. Pembatasan implementasi ini dilakukan karena protokol MySQL yang utuh memiliki tingkat kompleksitas yang tinggi sehingga tidak cocok untuk diimplementasikan pada mobile device yang mempunyai banyak keterbatasan.
III-1
III-2
III.2 Pengumpulan Kebutuhan MyME Untuk dapat mendefinisikan kebutuhan MyME, dilakukan eksplorasi pada package JDBC pada Java SE dan driver JDBC MySQL. Selanjutnya hasil dari eksplorasi disesuaikan dengan kemampuan mobile device dan platform Java ME yang memiliki banyak keterbatasan. Berikut adalah kebutuhan fungsional dari MyME: 1. Mampu melakukan proses otentikasi dengan MySQL Server versi 4.1.1 atau yang lebih baru. 2. Mampu mengirim perintah (Command Packet) kepada MySQL Server. 3. Mampu menerima hasil query (Result Set Packet) yang dikirimkan oleh MySQL Server. 4. Mampu mengakomodasi tipe data MySQL yang terdiri dari: •
Numeric Types, yang meliputi: a. BIT b. BOOLEAN c. TINYINT d. SMALLINT e. INT f.
MEDIUMINT
g. BIGINT h. FLOAT
•
i.
DOUBLE
j.
DECIMAL
Date and Time Types, yang meliputi: a. DATE b. DATETIME c. TIMESTAMP d. TIME e. YEAR
•
String Types, yang meliputi: a. CHAR b. VARCHAR c. TINYTEXT d. MEDIUMTEXT e. LONGTEXT f.
TEXT
g. ENUM h. SET 5. Mampu menerima paket Error.
III-3 Selain kebutuhan fungsional di atas, terdapat juga kebutuhan nonfungsional sebagai berikut: 1. Memiliki cara penggunaan yang mirip dengan cara penggunaan dari JDBC sehingga mudah untuk dipelajari dan digunakan. 2. Memiliki ukuran file yang sekecil mungkin. 3. Menggunakan memori seefektif dan seefisien mungkin. 4. Mudah untuk dikembangkan lebih lanjut.
III.3 Diagram Use Case
Gambar III-2 - Use Case Diagram MyME
Gambar III-2 adalah diagram use case dari MyME. Diagram use case ini menggambarkan tingkah laku dari MyME dan hubungannya dengan pengguna. Use case yang didefinisikan adalah: 1. Melakukan otentikasi MySQL API membuka koneksi socket ke MySQL Server yang dispesifikasikan dan melakukan sesi Handshake dengan MySQL Server. Pengguna API akan mendapatkan suatu objek yang merepresentasikan koneksi yang terbentuk jika proses otentikasi berhasil atau sebuah exception jika proses otentikasi gagal. 2. Mengirim perintah MySQL dan menerima responnya Dengan objek koneksi yang didapatkan, pengguna API dapat mengirimkan perintah berupa Command Packet kepada MySQL Server. Jika terjadi error dalam pemrosesan perintah, pengguna akan menerima exception. Perintah yang dapat dikirimkan dapat dilihat pada Tabel A-3 Lampiran A.
III-4 3. Mengirim statement SQL dan menerima hasilnya Dengan objek koneksi yang didapatkan, pengguna API dapat mengirimkan statement SQL kepada MySQL Server. Jika hasilnya berupa result set, pengguna akan menerima objek result set tersebut. Dan jika terjadi error pengguna akan menerima exception.
III.4 Diagram Sekuens Pada bagian ini akan dilakukan perancangan diagram sekuens berdasarkan use case yang telah didefinisikan. III.4.1 Melakukan Otentikasi MySQL Proses ini akan melibatkan tiga bagian, yaitu MyME yang merepresentasikan kelas DriverManager pada JDBC, MySQLConnection yang merepresentasikan kelas Connection pada JDBC, dan MySQLIO yang bertanggung jawab dalam penerimaan dan pengiriman paket dari dan ke MySQL
Server melalui koneksi socket.
Gambar III-3 - Diagram sekuens proses otentikasi MySQL
Pertama-tama aplikasi harus melakukan instansiasi MyME terlebih dahulu.
Langkah selanjutnya
adalah mendapatkan MySQLConnection dengan memanggil fungsi connect() pada objek MyME dengan parameter string URL. Dalam string URL ini, aplikasi dapat menspesifikasikan alamat host MySQL Server beserta nomor port-nya, username, password, dan properti-properti lainnya yang diinginkan. Kemudian MySQLConnection akan melakukan proses otentikasi menggunakan MySQLIO untuk mengirimkan paket Handshake. Bila terjadi exception dalam proses otentikasi, aplikasi akan
III-5 menerima MySQLException. Berikut ini adalah diagram sekuens yang memperlihatkan proses otentikasi ke MySQL Server. III.4.2 Mengirim Perintah MySQL dan Menerima Responnya Berikut ini adalah diagram sekuens yang menggambarkan proses pengiriman perintah MySQL kepada MySQL Server.
Gambar III-4 - Diagram sekuens mengirim perintah MySQL dan menerima responnya
Proses ini melibatkan MySQLConnection dan MySQLIO. Setelah aplikasi melakukan proses otentikasi, aplikasi dapat mengirimkan perintah MySQL kepada MySQL Server. Aplikasi dapat mengirimkan perintah MySQL dengan memanggil fungsi-fungsi yang ada pada MySQLConnection. Selanjutnya MySQLConnection akan menggunakan MySQLIO untuk mengirimkan paket Command kepada MySQLServer. Respon dari pengiriman perintah tersebut akan diteruskan kepada aplikasi yang memanggilnya. Bila terjadi exception dalam proses pengiriman perintah MySQL, aplikasi akan menerima MySQLException. III.4.3 Mengirim Statement SQL dan Menerima Hasilnya Selain MySQLConnection dan MySQLIO, proses ini juga melibatkan Statement yang merepresentasikan kelas Statement pada JDBC, dan ResultSet yang merepresentasikan kelas ResultSet pada JDBC. Setelah aplikasi melakukan proses otentikasi, aplikasi dapat mengirimkan
statement SQL kepada MySQL Server. Berikut ini adalah diagram sekuens yang menggambarkan proses pengiriman statement SQL kepada MySQL Server.
III-6
Gambar III-5 - Diagram sekuens proses mengirim statement SQL dan menerima hasilnya
Untuk dapat mengirimkan statement SQL, aplikasi harus mendapatkan Statement dengan memanggil fungsi createStatement() pada MySQLConnection. Selanjutnya aplikasi dapat mengirimkan statement SQL dengan menggunakan fungsi execute atau executeQuery pada Statement. Kemudian objek MySQLIO akan mengirimkan paket statement SQL tersebut kepada
MySQLServer. Respon dari pengiriman statement SQL tersebut akan diteruskan kepada aplikasi yang memanggilnya. Bila respon berupa result set, aplikasi akan menerima ResultSet sebagai representasi result set tersebut. Dan bila terjadi exception dalam proses pengiriman statement SQL, aplikasi akan menerima MySQLException.
III.5 Arsitektur dan Package MyME Dari analisis yang telah dilakukan, selanjutnya dapat dipetakan kapabilitas-kapabilitas MyME ke package yang bersesuaian. MyME terdiri dari 2 subsistem. Subsistem pertama merupakan pembungkus fungsi-fungsi yang berhubungan dengan protokol MySQL dan komunikasi dengan MySQL Server. Subsistem ini terdiri dari package MySQLIO dan Types. Package-package ini tidak diakses secara langsung oleh aplikasi pengguna API MyME. Sedangkan subsistem kedua merupakan pembungkus fungsi-fungsi yang akan dipakai secara langsung oleh aplikasi pengguna API MyME. Subsistem ini terdiri dari package MySQLConnection, Statement, ResultSet, dan Exceptions.
III-7 Tabel III-1 memuat package-package yang akan dikembangkan sebagai bagian dari API MyME. Package-package tersebut dapat berupa sebuah kelas ataupun lebih dari satu buah kelas. Tabel III-1 – Package-package pada MyME
No. 1
Nama Package MySQLIO
2
Types
3
MySQLConnection
4
Statement
5
ResultSet
6
Exceptions
Keterangan Package yang bertanggung jawab mengirim dan menerima data berupa sekumpulan byte melalui layanan TCP/IP dan bertugas juga memantau kegagalan yang terjadi pada proses transfer data menjadi suatu kelas exception. Package yang bertanggung jawab untuk menerjemahkan tipe data MySQL menjadi tipe data Java ME dan juga sebaliknya. Package yang merepresentasikan sebuah koneksi ke suatu MySQL Server. Modul ini mempunyai fungsi untuk melakukan proses otentikasi dan mengirimkan perintah kepada MySQL Server. Package yang berfungsi untuk mengeksekusi statement SQL dan kemudian mengembalikan hasilnya. Hasil dari ekseskusi statement SQL dapat berupa laporan keberhasilan pengeksekusian, result set hasil query, ataupun laporan SQL Error jika terjadi suatu kesalahan. Package yang merepresentasikan sebuah result set basisdata yang biasanya adalah hasil dari pengeksekusian query ke basisdata. Result set memiliki bentuk sebuah tabel yang terdiri dari kolom dan baris. Bertugas membungkus semua kegagalan pada proses pemakaian API MyME. Kegagalan yang didukung antara lain: gagal mengirim/menerima data, gagal mengeksekusi statement atau query, gagal mengalokasikan memori, gagal melakukan proses otentikasi, dan lain-lain.
Gambar III-6 - Arsitektur MyME
III-8
III.6 Diagram Kelas Analisis Pada Subbab ini akan dilakukan perancangan diagram kelas analisis dari kebutuhan-kebutuhan yang telah dibahas sebelumnya.
Gambar III-7 - Diagram kelas analisis MyME
III-9 Untuk dapat menggunakan API MyME, pengguna harus membuat sebuah instan dari kelas MyME dan kemudian memanggil fungsi connect() untuk mendapatkan sebuah objek
dari kelas
MySQLConnection. Kelas MySQLConnection adalah representasi dari sebuah koneksi ke suatu
MySQL Server. MySQLConnection menggunakan kelas MySQLIO untuk melakukan komunikasi dengan MySQL Server melalui socket. Untuk dapat mengirimkan statement SQL, pengguna harus memanggil fungsi createStatement pada kelas MySQLConnection untuk mendapatkan objek Statement. Kemudian pengguna dapat memanggil fungsi execute() atau executeQuery() untuk mengirimkan statement SQL kepada MySQL Server. Jika hasil dari eksekusi tersebut berupa result set, fungsi akan mengembalikan objek ResultSet sebagai representasi dari result set tersebut. Kelas Types digunakan untuk
menerjemahkan tipe data MySQL menjadi tipe data Java ME. Jika terjadi suatu exception, API akan menggunakan kelas SQLError untuk membungkus exception tersebut dan melemparkannya sebagai objek SQLException.
III.7 Kelas Perancangan MyME Terdapat sedikit perbedaan antara kelas-kelas analisis dengan kelas-kelas perancangan. Perbedaan tersebut adalah ditambahkannya beberapa kelas lain untuk mendukung implementasi API ini. Pemetaan kelas analisis ke kelas perancangan dapat dilihat pada Tabel III-2. Tabel III-2 - Pemetaan kelas analisis ke kelas perancangan
No. 1
Kelas Analisis MySQLConnection
2
MySQLIO
3 4
MyME ResultSet
5 6 7 8
SQLError SQLException Statement Types
9
Utils
Kelas Perancangan MySQLConnection DatabaseMetaData MySQLIO Buffer MyME ResultSet Field ResultSetMetaData SQLError SQLExceptions Statement Types BigDecimal BigInteger Date Time Timestamp Util SQLDefs
III-10 MyME dibagi menjadi 2 subsistem yang terdiri dari subsistem Internal dan subsistem Eksternal. Subsistem Internal terdiri dari kelas-kelas yang tidak digunakan secara langsung oleh aplikasi pengguna MyME. Sedangkan Subsistem Eksternal terdiri dari kelas-kelas yang dapat digunakan secara langsung oleh aplikasi pengguna MyME. Komponen-komponen utama dari subsistem Internal adalah MySQLIO dan Types. Sedangkan komponen-komponen utama dari subsistem Eksternal adalah Statement,
ResultSet,
dan
MySQLConnection.
Masing-masing
komponen
tersebut
diimplementasikan menjadi sebuah kelas. Terdapat juga beberapa kelas tambahan yang diimplementasikan untuk mendukung implementasi kelas-kelas yang telah dirancang sebelumnya. Daftar kelas pada subsistem Internal dapat dilihat pada Tabel III-3 dan daftar kelas subsistem Eksternal dapat dilihat pada Tabel III-4. Tabel III-3 – Daftar kelas dari MyME subsistem Internal
No. 1 2 3
Nama Kelas Buffer Field MySQLIO
4 5 6 7
SQLDefs SQLError Types Util
Keterangan Kelas ini merepresentasikan paket data dalam protokol MySQL. Kelas ini merepresentasikan kolom table dari MySQL Kelas yang bertanggung jawab mengirim dan menerima data yang dibungkus dalam objek kelas Buffer. Kelas ini juga melakukan proses otentikasi ke MySQL Server. Kelas ini memetakan konstanta yang ada pada MySQL Kelas ini memetakan jenis kesalahan pada MySQL Kelas yang memetakan tipe data MySQL Kelas ini menyediakan fungsi-fungsi tertentu yang digunakan untuk membantu kelas-kelas lainnya. Tabel III-4 – Daftar kelas dari MyME subsistem Eksternal
No. 1 2 3 4
Nama Kelas BigDecimal BigInteger DatabaseMetaData Date
5
MyME
6
MySQLConnection
7
ResultSet
8 9
ResultSetMetaData SQLExceptions
10
Statement
11
Time
12
Timestamp
Keterangan Kelas ini merepresentasikan tipe data big decimal. Kelas ini merepresentasikan tipe data big integer. Kelas ini menyediakan informasi mengenai database yang sedang diakses. Kelas ini merepresentasikan tipe data date yang terdiri dari tanggal, bulan, dan tahun dengan format ‘yyyy-mm-dd’. Kelas ini menyediakan fungsi untuk membuka koneksi ke MySQL Server dan mengembalikan objek kelas MySQLConnection. Kelas yang merepresentasikan sebuah koneksi ke suatu MySQL Server. Kelas ini digunakan untuk menghasilkan objek kelas Statement, mendapatkan objek kelas DatabaseMetaData, dan menutup koneksi. Kelas yang merepresentasikan sebuah result set yang biasanya adalah hasil dari pengeksekusian query ke basisdata. Pengguna kelas ini dapat mengambil nilai dari tiap kolom tabel atau mendapatkan objek kelas ResultSetMetaData. Kelas ini menyediakan berbagai informasi mengenai result set yang diterima. Kelas ini bertugas membungkus semua kegagalan pada proses pemakaian API MyME. Kelas ini berfungsi untuk mengeksekusi statement SQL dan mengembalikan hasilnya. Hasil tersebut dapat berupa laporan keberhasilan pengeksekusian, objek kelas ResultSet, ataupun SQLException jika terjadi suatu kesalahan. Kelas ini merepresentasikan tipe data time yang terdiri dari jam, menit, dan detik dengan format ‘hh:MM:ss’. Kelas ini merepresentasikan tipe data timestamp yang terdiri dari tanggal, bulan, tahun, jam, menit, detik, dan nanodetik dengan format ‘yyyy-mm-dd hh:MM:ss.fffffffff’.
III-11
III.8 Implementasi MyME Setelah melakukan berbagai analisis terhadap MyME yang kemudian diikuti proses perancangan MyME, maka pada Subbab ini akan dijelaskan proses implementasi dari MyME. III.8.1 Lingkungan Implementasi Lingkungan implementasi MyME adalah sebagai berikut: 1. Sistem Operasi: Apple Macintosh Tiger OSX 10.4.8 2. Perangkat Lunak Utama: a. VMWare Fusion 1.0 b. Microsoft Windows XP Professional Service Pack 2 c. Java Development Kit (JDK) 1.5 d. J2ME Wireless Tool Kit (WTK) 2.2 e. SonyEricsson J2ME SDK f.
Eclipse 3.2 dengan obfuscator Proguard 3.10
3. Perangkat Keras Utama: Notebook Sony VAIO SZ-220 B dengan spesifikasi: a. Processor Intel Core Duo CPU T2400 1,83 GHz b. Memory DDR2 SDRAM 1GB c. Harddisk 120 GB Agar hasil kompilasi memiliki ukuran file yang lebih kecil, Proguard digunakan sebagai obfuscator Java ME. III.8.2 Batasan Implementasi Batasan implementasi MyME adalah sebagai berikut: 1. Tidak semua tipe data MySQL diimplementasikan. Tipe data yang diimplementasikan dapat dilihat pada Subbab III.2. 2. Menggunakan kerangka API yang mirip dengan JDBC tetapi tidak semua fungsi dan kelas JDBC diimplementasikan. 3. Tidak semua ponsel mendukung pemakaian API ini dan pada Tugas Akhir ini tidak dibahas mengenai incompatibility perangkat keras. Perangkat keras yang mendukung API ini adalah perangkat keras yang mendukung Java dengan spesifikasi profil MIDP 2.0 dan konfigurasi CLDC 1.1. 4. Tidak mendukung transaksi MySQL. 5. Tidak mendukung koneksi yang terkompresi. 6. Tidak mendukung koneksi SSL. 7. MySQL Server yang didukung adalah MySQL versi 4.1.1 ke atas.
III-12 III.8.3 Penggunaan MyME Untuk melakukan komunikasi dengan MySQL Server, MyME menggunakan socket TCP/IP. Spesifikasi koneksi diberikan oleh pengguna MyME dalam bentuk String dengan format “myme:mysql://host[:port]/[database]?[property]=[value]”.
Setelah
koneksi
terbangun dan proses otentikasi berhasil dilakukan, pengguna MyME dapat mengeksekusi query dengan cara memanggil fungsi createStatement() pada objek MySQLConnection untuk mendapatkan objek Statement. Dengan objek Statement tersebut, pengguna dapat memanggil fungsi execute() dengan parameter String query yang diinginkan. Jika hasil eksekusi query tersebut adalah sebuah result set, maka pengguna MyME dapat memanggil fungsi getResultSet() pada objek Statement untuk mendapatkan objek ResultSet. Dengan objek ResultSet tersebut maka nilai dari setiap kolom pada tabel result set dapat diambil. Cara penggunaan dari MyME ini mirip dengan cara penggunaan JDBC. Contoh source code dari penggunaan MyME dapat dilihat pada Kode III-1. import org.myme.*; ... MyME myme = new MyME(); try { MySQLConnection conn = myme.connect(“myme:mysql://if.itb.ac.id:3306/user=root&pass=123”); Statement stmt = conn.createStatement(); if (stmt.execute(“SELECT * FROM tab”)) { ResultSet rs = stmt.getResultSet(); while (rs.next()) { System.out.println(rs.getString(1)); } } conn.close(); } catch (SQLException e) { } Kode III-1 - Contoh penggunaan MyME