Posts Tagged ‘Database’
Hibernate: no int please
Salah satu hal yang sering tidak terasa tapi sering menyulitkan. Menggunakan int dalam POJO pada hibernate. seperti:
@Entity
@Table(name = "TABLE_NAME")
public class Table implements Serializable {
private int id;
@Id
@Column(name="Id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Mengapa ? karena nilai default int adalah 0, maka setiap kali menggunakan Criteria, setiap attribute dengan tipe data int akan ikut dalam where clause. Untuk lebih amannya pakai saja Integer.
Tags: Database, Hibernate, Java
Pentingnya index pada query
Minggu kemarin saya diminta tolong oleh boss untuk tune query yang dia bikin. Query pada database oracle. Dia bilang sudah empat dijalankan dan hasilnya masih belum dapat juga. Jadi query-nya dikirim ke mail saya dan setelah saya lihat-lihat dan sedikit dimodifikasi, saya jalankan query tersebut dan hasilnya hanya 0.6 detik kemudian.
Perbedaan waktu yang amat sangat besar. Perbedaan itu saya dapatkan dengan menambahkan hint index agar oracle mengeksekusi query dengan menggunakan index. Sebelum itu saya lihat dulu execution plan dari query tersebut, yang ternyata mengakses salah satu table besar yang tidak memiliki index, jadi table tersebut diakses secara full scan. Baru kemudian table dengan index di akses.
Karena saya lihat bahwa salah satu table yang memiliki index dapat digunakan sebagai titik awal query, maka hint yang ditambahkan adalah
select /*+ ordered index ( dc dialingcode$n ) */
yang akan membuat oracle mendahulukan table dialingcode sebelum yang lain. And it works!.
Hal seperti inilah yang membuktikan bahwa design database yang baik akan selalu menyertakan index pada setiap tablenya dan query yang baik akan menggunakan index sebagai salah satu optimizer. Memang memerlukan waktu yang lebih untuk memikirkan index apa yang dipakai dan metode path findingnya, jika database bukan kita sendiri yang design, tapi waktu untuk berpikir itu akan sangat berharga jika dibandingkan dengan waktu menunggu query selesai.
JDBC + Common DbUtils
Kalau masih seneng menggunakan JBDC, ada tools yang bisa mempermudah hidup. Pengguna JBDC pasti paham hehehe.. Most annoyinh thing about JBDC is writing SQL statement. Iya kan? So, untuk mempermudah hidup, bisa memakai library DBUtils dari Apache Common.
Penggunaannya juga sangat mudah kok. contohnya seperti dibawah ini
1. Buat class untuk menampung data.
public class Account {
private int id;
private String name;
public void setId(int id) {
this.id = id;
}
public int getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
2. Querynya cukup seperti
public Account selectAccount(int id) {
Connection connection = null;
Account account = null;
QueryRunner run = new QueryRunner();
try {
connection = DbUtil.getConnection();
ResultSetHandler rs = new BeanHandler(Account.class);
account = (Account) run.query(connection, "SELECT *" +
" FROM ACCOUNT WHERE ID = ?", id, rs);
} catch (Exception e) {
e.printStackTrace();
} finally {
DbUtil.close(connection);
}
return account;
}
Voila.. beres deh ![]()
Tanpa harus capek-capek ngetik accoun.setId(resultSet.getInt(”ID”))
Secara otomatis ResultSetHandler akan map nama kolom dan property dari class. Jadi jika query kita sama persis dengan class, maka secara otomatis class kita akan di populate.
Kayaknya ganti iBatis nih..
IBatis dan Hibernate adalah dua hal yang sama tapi berbeda. Keduanya dipakai sebagai tool dan library pengembangan aplikasi, dengan dua sudut pandang yang berbeda. Gampangnya hibernate itu top down dan ibatis itu bottom up, dari sudut pandang java.
Development dengan menggunakan hibernate akan lebih efektif kalau dimulai dari domain model baru kemudian diturunkan ke database, dalam bentuk table-table. Jadi class dan table sinkron. Pada kondisi seperti inilah hibernate digunakan.
Sementara iBatis menghasilkan mapping dari query ke java class, bukan table, jadi pada saat development table didefiniskan terlebih dahulu, berbeda dengan hibernate yang akan membuat table dari classnya.
Dari sudut pandang saya sendiri sih, dari dulu saya tidak menyukai hibernate karena harus menggunakan mapping dalam bentuk xml yang menurut saya pribadi kok ribetnya sama saja dengan menggunakan jdbc. JDBC lebih mudah untuk dilihat dan jika modularitasnya jelas, gampang juga untuk di maintain. Dan setelah hibernate 3 support annotation, tertarik juga untuk mempelajari.
Tapi setelah beberapa hari mempelajari, ternyata memang tidak cocok dengan bagaimana saya membangun sistem yang sangat database sentris. Saya lebih suka memecahkan masalah dengan mendesign database terlebih dahulu sebelum aplikasinya. It is database based application.. jadi database dulu yang menjadi prioritas.
Dan yang seperti saya ini lebih cocok menggunakan ibatis. Walaupun dengan design yang teliti bisa juga menggunakan hibernate, tapi sifat saya yang lain, yang sangat nyaman menggunakan JDBC nampaknya juga menjadi sebab mengapa hibernate 3 ini juga tidak menarik.
So iBatis it is..
