Apa kelebihan myBatis dibanding Hibernate? [Tutup]

33

Saya sudah melakukan riset sendiri dan memahami konsep dasar. Tetapi beberapa wawasan hanya dapat diperoleh melalui pengalaman nyata.

Apa kelebihan myBatis yang membuatnya berharga untuk belajar kerangka kerja baru?
Dalam hal apa Anda akan menghindari menggunakannya?

Kshitiz Sharma
sumber
3
Saya menguji keduanya dan akhirnya menggunakan Cayenne.
deadalnix

Jawaban:

38

Pertimbangkan apa yang ingin Anda capai. Biasanya, model Segregasi Respons Kueri Perintah berfungsi dengan baik untuk domain yang kompleks.

Alasannya adalah Anda mencoba melakukan salah satu dari dua hal yang biasanya:

  1. Buat / Perbarui / Hapus beberapa entitas domain yang kompleks
  2. Jalankan kueri pengambilan analitik (yaitu kueri penjumlahan / agregasi)

Hibernate berfungsi dengan baik untuk case 1 memungkinkan Anda untuk hanya membuat POJO dan bertahan / memperbaruinya. Ini juga melakukan ini dengan cepat, kecuali domain Anda cukup besar.

myBatis bagus untuk mengambil kueri (kasus 2) di mana Anda hanya ingin jawaban. Hibernate akan mencoba memuat seluruh grafik objek dan Anda harus mulai menyetel kueri dengan trik LazyLoading agar tetap berfungsi pada domain besar. Ini penting ketika menjalankan kueri analitik kompleks yang bahkan tidak mengembalikan objek entitas. Hibernate hanya menawarkan SqlQuery dan bean Transformers dalam hal ini dengan tipe standar besar seperti BigDecimal, sementara myBatis dapat dengan mudah memetakan ke POJO non-entitas sederhana.

Dua kasus ini adalah perbedaan antara Perintah di mana Anda ingin mengubah data domain dan Respons di mana Anda hanya ingin mengambil beberapa data.

Jadi, pertimbangkan dua kasus ini dan apa yang dilakukan aplikasi Anda. Jika Anda memiliki domain sederhana dan hanya mengambil informasi, gunakan myBatis. Jika Anda memiliki domain yang kompleks dan entitas yang bertahan, gunakan Hibernate. Jika Anda melakukan keduanya, pertimbangkan pendekatan hybrid. Itulah yang kami gunakan pada proyek kami yang memiliki ribuan entitas untuk mengendalikannya. ;)

Joseph Lust
sumber
2
Hibernate juga berfungsi dengan baik pada case 2 Anda. Untuk contoh sederhana, lihat: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge
3
"Hibernate akan berusaha memuat seluruh grafik objek" ini terdengar seperti kesalahan konfigurasi. "Perlu mulai menyetel kueri dengan trik LazyLoading" terdengar seperti Anda telah mengatur fetch = bersemangat di suatu tempat. JPA memiliki JPQL yang praktis SQL, namun terintegrasi dengan baik dengan Hibernate / JPA. Saya pikir itu # 2 dengan sangat baik. Sudah biasa bagi orang untuk menjalankan produksi selama satu tahun atau lebih sebelum ORM dikonfigurasi 100% dengan benar. Saya tidak meminimalkan ketika saya mengatakan bahwa ini adalah kesalahan konfigurasi - konfigurasi dengan alat-alat ini bisa sangat memakan waktu dan sulit!
GlenPeterson
3
@ GlenPeterson Saya tidak mengatakan Hibernate tidak dapat dijinakkan, tetapi bagi kebanyakan orang, di luar kotak, entitas domain yang kompleks akan dimuat perlahan kecuali jika optimasi dilakukan, seperti yang Anda kutip. Kueri analitik yang kompleks lebih mudah dengan myBatis untuk sebagian besar pengguna, meskipun hal yang sama memang dapat dicapai dengan ORM. Pertanyaan bagi banyak orang adalah apakah mereka membutuhkan independensi vendor ORM untuk produk mereka.
Joseph Lust
10
Hibernate jenis berpura-pura tidak ada DB di bawahnya dan Anda hanya memperlakukan model data Anda seolah-olah itu dirancang menggunakan koleksi Java. Yang sangat sering tidak terjadi. Pada level DB, representasi data mungkin sangat berbeda dan mencoba memetakannya secara otomatis ke dalam koleksi Java tidak selalu masuk akal. Inilah sebabnya mengapa Hibernate adalah contoh sempurna dari "abstraksi Leaky". MyBatis jauh lebih sederhana, mudah dipahami, tidak ada keajaiban dan .. ya, ada SQL yang saya temukan hal yang baik karena tidak ada yang salah dengan menggunakan SQL untuk database berbasis SQL.
Marcin
2
@Marcin poin bagus. Saya telah melihat terlalu banyak masalah dengan emulasi koleksi di Hibernate. Misalnya beberapa kode memanggil myBag.size () dan Hibernate mencoba memuat 750K objek ke dalam memori sebelum menghitungnya. Jika Anda hanya perlu SQL, gunakan SQL.
Joseph Lust
19

MyBatis adalah SQL centric. Ini membuat Anda memanggil pernyataan SQL dan hasil pemetaan (tabel) ke objek pohon.

Manfaat utama adalah bahwa itu bukan ORM. Itu tidak memetakan tabel ke objek sehingga tidak menderita ketidakcocokan impedansi orm. Cocok untuk basis data yang kompleks atau lawas atau untuk menggunakan fitur db seperti prosedur tersimpan, tampilan, dan sebagainya.

Ini cukup sederhana dan mudah dipelajari sehingga cocok juga untuk tim dengan keterampilan rendah karena tidak perlu memiliki guru hibernasi di antara mereka.

Lihat di jpetstore 6 http://mybatis.org/spring/sample.html

Diego
sumber
2
"Tim-tim dengan keterampilan rendah" itu masih perlu tahu SQL.
pelaku
Jawaban singkat yang bagus, dua perbedaan utama adalah: db centric + kurva pembelajaran dangkal. Tapi saya tidak sepenuhnya setuju dengan "Cocok untuk basis data yang kompleks atau warisan". Keuntungan menjadi db centric menjadi lebih jelas ketika Anda memiliki kontrol lebih besar atas desain db.
DPM
5

Karena pertanyaan mengacu pada komentar saya , inilah yang ada dalam pikiran saya untuk menulisnya.

Pertama-tama, ini berasal dari konteks pertanyaan awal Anda. Dalam keadaan lain saya bisa memberikan saran yang berbeda. Poin yang membuat saya menyarankan MyBatis adalah ini:

... kami mengalami beberapa masalah kinerja.

Kami memutuskan untuk berhenti hibernasi demi Jdbc biasa untuk mendapatkan kinerja basis data ...

Dalam salah satu proyek sebelumnya, tim kami telah mempertimbangkan untuk pindah dari Hibernate dengan alasan seperti yang Anda jelaskan. Mirip dengan Anda, kami akan beralih ke JDBC, tetapi kolega dari proyek lain merekomendasikan kami MyBatis. Tim memutuskan untuk mencobanya, sambil menjaga JDBC sebagai opsi mundur jika ada masalah.

Pada saat itu, saya tidak tahu apa-apa tentang MyBatis tetapi memiliki pengalaman yang cukup dengan JDBC untuk memastikan itu akan melakukan pekerjaan. Meskipun demikian, saya telah sangat mendukung ide untuk mencoba MyBatis, alasan utama adalah bahwa berdasarkan pengalaman saya sebelumnya, jumlah kode boilerplate yang harus kita tulis dengan JDBC akan sangat menakutkan.

  • Agar adil, saya suka JDBC karena itu mudah dimengerti, dapat diandalkan dan untuk memberikan rasa kontrol yang baik atas interaksi basis data, tetapi harga yang harus dibayar untuk itu sangat tinggi. Jari-jariku mulai terasa sakit setiap kali aku mengingat berapa banyak boilerplate yang harus aku ketik dengan JDBC.

Lagi pula, kami mencoba MyBatis dan berfungsi seperti yang diiklankan. Itu sebabnya saya menulis komentar yang Anda tanyakan.

Jika Anda mengharapkan saya untuk memberikan gambaran terperinci tentang teknologi, atau entah bagaimana memuji keunggulannya - maaf saya tidak bisa melakukan itu. Jika saya bisa - saya sudah menulis itu dalam jawaban terpisah untuk pertanyaan awal Anda, daripada memberikan komentar singkat. Saya sebutkan bahwa saya tidak tahu apa-apa tentang MyBatis saat itu - yah saya masih memiliki sedikit pengetahuan tentang hal itu maaf. Transisi dari Hibernate dilakukan oleh anggota tim lain dan itu tidak berdampak pada kode yang telah saya kerjakan. Saya hanya mengingat takeaways kunci (berdasarkan yang saya buat komentar saya), yaitu bahwa 1) MyBatis menyelesaikan masalah yang kami miliki dengan Hibernate, 2) itu tidak memperkenalkan masalah sendiri dan 3) itu memungkinkan kami untuk menghindari menulis kode boilerplate I mengharapkan kalau-kalau kita beralih ke JDBC. Itu saja.

agas
sumber
3

Hibernate sangat tahu banyak sihir , perilaku tak terduga dan kurva belajar yang besar. Ada kerangka kerja lain di luar sana yang lebih fokus pada kesederhanaan dan akan membuat Anda memegang kendali.

myBatis adalah salah satunya, proyek saya MentaBean adalah proyek lain. Saya sudah menulis posting blog tentang itu yang mungkin bisa membantu.

Sergio Oliveira Jr.
sumber
6
Hai Sergio dan selamat datang. Komunitas kami umumnya tidak menyukai promosi diri yang terang-terangan, dan kami meminta Anda untuk secara jelas mengungkapkan afiliasi Anda dalam jawaban Anda. Saya telah mengedit jawaban Anda untuk menunjukkan bahwa MentaBean adalah proyek yang Anda ikuti, dan bahwa Anda telah menulis posting blog yang Anda tuju, jika Anda tidak suka frasa tersebut, bebas untuk mengubahnya, tetapi tolong pertahankan beberapa jenis pengungkapan bahwa Anda terlibat dengan MentaBean. Baca bagian yang relevan di FAQ kami untuk lebih jelasnya.
yannis
Hai Yannis. Saya akan melakukan itu. Terimakasih atas peringatannya. :)
Sergio Oliveira Jr
-1

Saya menggunakan Hibernate untuk pemuatan data dan proyek transformasi data 5 tahun yang lalu menggunakan Hibernate 3 dan saya pikir itu luar biasa. Saya sedang melakukan aplikasi e-commerce kecil dan saya mencoba menggunakan Hibernate 4 dan saya sangat kecewa. Mereka telah menghapus alat dan terintegrasi dengan IDE. Saya mencoba MyBatis dan saya bekerja semuanya dalam satu malam dan saya sangat senang dengan betapa mudahnya untuk mengintegrasikan ke dalam aplikasi. Saya pikir Hibernate telah menjadi terlalu kembung dan saya akan menggunakan EJB 3 di atas Hibernate pada saat ini.

marland
sumber
1
Bagaimana EJB 3 dan Hibernate dibandingkan ???
Jose