MyBatis'in Hibernate'e göre avantajları nelerdir? [kapalı]


33

Kendi başıma biraz araştırma yaptım ve temel kavramı anladım. Ancak bazı görüşler ancak gerçek deneyimlerle elde edilebilir.

MyBatis'in yeni bir çerçeveyi öğrenmeye değecek avantajları nelerdir?
Hangi durumda kullanmaktan kaçının?


3
İkisini de test ettim ve Cayenne'i kullandım.
deadalnix

Yanıtlar:


38

Neyi başarmaya çalıştığınızı düşünün. Tipik olarak, Komut Sorgu Yanıtı Ayrıştırma modeli, karmaşık alanlar için iyi çalışır.

Bunun nedeni, tipik olarak iki şeyden birini yapmaya çalışmanızdır:

  1. Bazı karmaşık etki alanı varlıkları oluşturma / güncelleme / silme
  2. Analitik getirme sorgularını çalıştır (örneğin, toplama / toplama sorguları)

Hazırda Bekletme durumu yalnızca bir POJO yapmanıza ve devam ettirmenize / güncellemenize izin veren birinci vaka için iyi çalışır. Etki alanınız oldukça geniş değilse, bu işlemi hızlı bir şekilde yapar.

myBatis , sadece bir cevap almak istediğiniz sorguları (durum 2) getirmek için mükemmeldir. Hazırda Bekletme, nesne grafiğinin tamamını yüklemeyi dener ve geniş bir alanda çalışmaya devam etmesi için LazyLoading hileleriyle sorgu ayarlamaya başlamanız gerekir. Varlık nesnelerini bile döndürmeyen karmaşık analitik sorguları çalıştırırken bu önemlidir. Hibernate, SqlQuery ve bean Transformers'ı bu durumda BigDecimal gibi büyük varsayılan türlerde sunarken, myBatis basit bir POJO varlığına kolayca eşlenebilir.

Bu iki durum , etki alanı verilerini değiştirmek istediğiniz Komutlar ile yalnızca bazı verileri almak istediğiniz Yanıtlar arasındaki farktır .

Bu nedenle, bu iki durumu ve başvurunuzun ne yaptığını göz önünde bulundurun. Basit bir etki alanınız varsa ve yalnızca bilgi alırsanız, myBatis kullanın. Karmaşık bir etki alanınız ve kalıcı varlıklarınız varsa, Hazırda Beklet'i kullanın. İkisini birden yaparsanız karma bir yaklaşımı düşünün. Projede kontrol altında tutabilmek için binlerce varlığa sahip olan budur. ;)


2
Hazırda Bekletme durumunuz 2 ile de iyi çalışır. Basit bir örnek için bakınız: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge

3
"Hazırda Beklet tüm nesne grafiğini yüklemeye çalışır" bu bir yapılandırma hatası gibi geliyor. "Sorguları LazyLoading hileleriyle ayarlamaya başlamanız gerekiyor" gibi sesler, fetch = bir yerde istekliymiş gibi geliyor. JPA, pratik olarak SQL olan ve Hibernate / JPA ile iyi bir şekilde bütünleştirilen bir JPQL'e sahiptir. Bence 2 numarayı çok iyi yapıyor. Bir ORM'yi% 100 doğru yapılandırılmadan önce insanların bir yıl veya daha fazla üretimde çalışması yaygındır. Bir yapılandırma hatası olduğunu söylediğimde simge durumuna küçültmeyeceğim - bu araçlarla yapılandırma gerçekten zaman alıcı ve zor olabilir!
GlenPeterson

3
@GlenPeterson Hazırda Bekletme uygulamasının evcilleştirilemediğini söylemiyorum, ancak çoğu kişi için, kutunun dışındaki karmaşık etki alanı varlıkları, belirttiğiniz gibi optimizasyonlar yapılmadıkça yavaş yüklenecek. Karmaşık analitik sorgular çoğu kullanıcı için myBatis ile daha kolay olsa da, aynısı bir ORM ile de sağlanabilir. Pek çok kişi için soru, ORM'nin ürünleri için satıcı bağımsızlığına ihtiyaç duyup duymadıklarıdır.
Joseph Lust

10
Hazırda bekletme türünün altında bir DB yokmuş gibi davranırsınız ve sadece veri modelinize Java koleksiyonları kullanılarak tasarlanmış gibi davranırsınız. Hangisi durum böyle değil. DB düzeyinde veri sunumu çok farklı olabilir ve otomatik olarak Java koleksiyonlarına eşlemeye çalışmak kesinlikle bir anlam ifade etmiyor. Bu nedenle Hazırda Bekletme “Sızdıran soyutlamanın” mükemmel bir örneğidir. MyBatis çok daha basit, anlaşılması kolay, sihir yok ve .. evet, iyi bir şey bulduğum SQL var çünkü SQL tabanlı veritabanları için SQL kullanmakta yanlış bir şey yok.
Marcin

2
@Marcin harika bir nokta. Hibernate'de koleksiyon öykünme ile ilgili çok fazla sorun gördüm. Örneğin, bazı kodlar myBag.size () öğesini çağırır ve Hazırda Bekletme, sayılmadan önce 750K nesnelerini belleğe yüklemeye çalışır. Yalnızca SQL'e ihtiyacınız varsa, SQL kullanın.
Joseph Lust

19

MyBatis, SQL merkezlidir. SQL deyimlerini çağırmayı ve sonuçları (tabloları) nesne ağaçlarına eşlemenizi sağlar.

Asıl yararı bunun bir ORM olmamasıdır. Tabloları nesneye eşleştirmez, bu yüzden orm empedans uyumsuzluğuna maruz kalmaz. Karmaşık veya eski veritabanları için uygundur veya saklı yordamlar, görünümler vb. Gibi db özelliklerini kullanmak için uygundur.

Öğrenmesi oldukça basit ve kolaydır, bu yüzden düşük yetenekli takımlar için de çok uygundur, çünkü aralarında kış uykusunda bir guruya gerek yoktur.

Jpetstore 6'ya bir göz atın http://mybatis.org/spring/sample.html


2
Bu "düşük vasıflı ekipler" hala SQL'i bilmeli.
Suçlu

Kısa ve öz cevap iyi, iki ana fark şudur: db merkezli + sığ öğrenme eğrisi. Ancak, "Karmaşık veya eski veritabanları için uygun" ile tamamen aynı fikirde değilim. Db merkezli olma avantajı, db tasarımı üzerinde daha fazla kontrol sahibi olduğunuzda daha belirgin hale gelir.
DPM

5

Yana soru atıfta için benim yorumum , burada bunu yazarken aklında buydu.

Her şeyden önce, asıl sorunuzun bağlamından türetilmiştir. Diğer durumlarda farklı bir tavsiye verebilirim. Bana MyBatis'i önerttiği nokta şudur:

... bazı performans problemleriyle karşılaştık.

Veri tabanı performansı elde etmek için kış uykusunu basit Jdbc lehine bırakmaya karar verdik ...

Geçtiğimiz projelerden birinde, ekibimiz sizin açıkladığınız nedenlerden dolayı Hazırda Bekletme'den taşınmayı düşünüyor. Size benzer şekilde, JDBC'ye geçecektik, ancak başka bir projeden gelen meslektaşlar bize MyBatis'i tavsiye etti. Ekip denemeye karar verirken, JDBC'de işler ters giderse bir geri dönüş seçeneği olarak kalmaya devam etti.

O anda, MyBatis hakkında hiçbir şey bilmiyordum, ancak işi yapacağından emin olmak için JDBC'de yeterince tecrübem oldu. Buna rağmen, MyBatis'i deneme fikrimi güçlü bir şekilde destekliyordum. Bunun sebebi, geçmiş deneyimlerime göre, JDBC ile yazmak zorunda kalacağımız boyunduruk kodunun miktarının göz korkutucu olmasıydı.

  • Adil olmak gerekirse, JDBC'nin anlaşılması basit, güvenilir olması ve veritabanı etkileşimi üzerinde iyi bir kontrol hissi vermesi nedeniyle hoşuma gidiyor, ancak bunun için ödediği bedel çok yüksek. JDBC ile ne kadar yazı yazmam gerektiğini hatırladığımda parmaklarım ağrıyor.

Neyse, MyBatis'i denedik ve reklamı yapıldı. Bu yüzden sorduğun yorumu yazdım.

Teknolojiye ayrıntılı bir genel bakış sunmamı beklerseniz veya bir şekilde üstünlüğünü övmeyi beklerseniz - üzgünüm bunu yapamam. Yapabilseydim - Kısa yorum yapmak yerine bunu asıl sorunuza ayrı bir cevap olarak yazdım. O zamanlar MyBatiler hakkında hiçbir şey bilmediğimden bahsettim - peki hala üzgünüm hakkında çok az bilgim var. Hazırda Bekletme modundan geçiş, diğer ekip üyeleri tarafından yapıldı ve üzerinde çalıştığım kodu etkilemedi. Sadece anahtar teslim alımları hatırladım (yorumuma dayanarak), yani 1) MyBatis, Hazırda Bekletme ile ilgili sorunlarımızı çözdü, 2) kendi sorunlarını çıkarmadı ve 3) kazan kodunu yazmaktan kaçınmamıza izin verdi. JDBC'ye geçersek diye bekliyorduk. Bu kadar.


3

Hazırda Bekletme çok fazla büyü , beklenmedik davranış ve büyük öğrenme eğrisi için iyi biliyor . Dışarıda basitliğe daha fazla odaklanan ve kontrolün altında kalmanıza izin verecek başka çerçeveler var.

myBatiler onlardan biri, benim projem MentaBean başka biri. Bu konuda yardımcı olabilecek bir blog yazısı yazdım .


6
Selam Sergio ve hoşgeldin. Topluluğumuz genellikle kendi kendini terfi ettirmekten korkar ve sizin cevabınızı açık bir şekilde ifşa etmenizi istiyoruz. MentaBean'in dahil olduğunuz bir proje olduğunu ve işaretlemekten hoşlanmıyorsanız, işaretlemekten hoşlanmayacağınızı düşündüğünüz blog gönderisini yazdığınızı belirtmek için cevabınızı değiştirdim ancak lütfen MentaBean ile ilgili olduğunuz bazı açıklamalar. Daha fazla bilgi için SSS bölümümüzdeki ilgili bölümü okuyun .
yannis

Selam Yannis. Yapacağım. Başınız için teşekkürler. :)
Sergio Oliveira Jr.

-1

Hibernate'i 5 yıl önce Hibernate 3'ü kullanarak veri yükleme ve veri dönüştürme projesi için kullandım ve harika olduğunu düşündüm. Küçük bir e-ticaret uygulaması yapıyorum ve Hibernate 4'ü kullanmayı denedim ve son derece hayal kırıklığına uğradım. Aletleri çıkardılar ve IDE'ye sıkıca entegre ettiler. MyBatis'i denedim ve tek bir gecede çalışan her şeye gidiyorum ve bir uygulamaya entegre olmanın ne kadar kolay olduğunu çok mutluyum. Hazırda Bekletme'nin çok şişirilmiş olduğunu düşünüyorum ve bu noktada EJB 3'ü Hazırda Bekletme üzerinden kullanırdım.


1
EJB 3 ve Hibernate nasıl karşılaştırılır ???
Jose
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.