Jakie są zalety myBatis w porównaniu z Hibernacją? [Zamknięte]

33

Przeprowadziłem własne badania i zrozumiałem podstawową koncepcję. Ale niektóre spostrzeżenia można uzyskać jedynie poprzez rzeczywiste doświadczenie.

Jakie zalety myBatis sprawiłyby, że warto nauczyć się nowych ram?
W jakim przypadku uniknąłbyś go?

Kshitiz Sharma
źródło
3
Przetestowałem oba i skończyło się na Cayenne.
deadalnix

Odpowiedzi:

38

Zastanów się, co próbujesz osiągnąć. Zazwyczaj model segregacji odpowiedzi na komendy poleceń działa dobrze w przypadku złożonych domen.

Powodem jest to, że zazwyczaj próbujesz zrobić jedną z dwóch rzeczy:

  1. Utwórz / zaktualizuj / usuń niektóre złożone podmioty domeny
  2. Uruchom analityczne zapytania pobierania (tj. Zapytania sumowania / agregacji)

Hibernacja działa dobrze w przypadku 1, umożliwiając wykonanie POJO i utrwalenie / zaktualizowanie go. Robi to również szybko, chyba że Twoja domena jest dość duża.

myBatis jest świetny do pobierania zapytań (przypadek 2), w których potrzebujesz odpowiedzi. Hibernacja spróbowałaby załadować cały wykres obiektu i trzeba by zacząć strojenie zapytań za pomocą sztuczek LazyLoading, aby działało ono w dużej domenie. Jest to ważne przy uruchamianiu złożonych zapytań analitycznych, które nawet nie zwracają obiektów encji. Hibernacja oferuje tylko SqlQuery i transformatory fasoli w tym przypadku z dużymi domyślnymi typami, takimi jak BigDecimal, podczas gdy myBatis może łatwo mapować na prosty nie-byt POJO.

Te dwa przypadki różnią się między poleceniami, w których chcesz zmienić dane domeny, a odpowiedziami, w których chcesz tylko pobrać niektóre dane.

Rozważ te dwa przypadki i to, co robi twoja aplikacja. Jeśli masz prostą domenę i po prostu pobierasz informacje, użyj myBatis. Jeśli masz złożoną domenę i trwałe obiekty, użyj Hibernacji. Jeśli zrobisz oba, rozważ podejście hybrydowe. Tego używamy w naszym projekcie, który ma tysiące podmiotów, aby utrzymać go pod kontrolą. ;)

Joseph Lust
źródło
2
Hibernacja działa dobrze również w przypadku 2. Prosty przykład: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge
3
„Hibernacja próbuje załadować cały wykres obiektów”. Brzmi to jak błąd konfiguracji. „Musisz zacząć dostrajać zapytania za pomocą sztuczek LazyLoading” brzmi, jakbyś ustawił gdzieś fetch = chętnie. JPA ma JPQL, który jest praktycznie SQL, ale dobrze zintegrowany z Hibernate / JPA. Myślę, że robi to bardzo dobrze. Ludzie często uruchamiają produkcję przez rok lub dłużej, zanim ORM zostanie poprawnie skonfigurowany w 100%. Nie minimalizuję, gdy mówię, że to błąd konfiguracji - konfiguracja za pomocą tych narzędzi może być naprawdę czasochłonna i trudna!
GlenPeterson
3
@GlenPeterson Nie mówię, że hibernacji nie da się oswoić, ale dla większości osób od samego początku złożone jednostki domeny będą ładowane powoli, chyba że dokonano optymalizacji, jak to cytowałeś. Złożone zapytania analityczne są prostsze w myBatis dla większości użytkowników, chociaż to samo można osiągnąć za pomocą ORM. Pytanie dla wielu dotyczy tego, czy potrzebują niezależności tego dostawcy ORM dla swoich produktów.
Joseph Lust
10
Hibernacja udaje, że nie ma DB, a ty traktujesz model danych tak, jakby został zaprojektowany przy użyciu kolekcji Java. Co często nie jest prawdą. Na poziomie DB reprezentacja danych może być bardzo różna, a próba automatycznego mapowania na kolekcje Java niekoniecznie ma sens. Właśnie dlatego Hibernacja jest doskonałym przykładem „Przeciekającej abstrakcji”. MyBatis jest znacznie prostszy, łatwy do zrozumienia, nie ma magii i .. tak, jest SQL, co uważam za dobrą rzecz, ponieważ nie ma nic złego w korzystaniu z SQL dla baz danych opartych na SQL.
Marcin
2
@Marcin świetny punkt. W Hibernacji widziałem zbyt wiele problemów z emulacją kolekcji. Na przykład niektóre kody wywołują myBag.size (), a Hibernate próbuje załadować do pamięci obiekty 750K przed ich zliczeniem. Jeśli potrzebujesz tylko SQL, użyj SQL.
Joseph Lust,
19

MyBatis jest zorientowane na SQL. Pomaga ci wywoływać instrukcje SQL i wyniki mapowania (tabele) do obiektów obiektów.

Główną zaletą jest to, że nie jest to ORM. Nie odwzorowuje tabel na obiekty, więc nie występuje niedopasowanie impedancji orm. Dobrze pasuje do złożonych lub starszych baz danych lub do korzystania z funkcji db, takich jak procedury składowane, widoki i tak dalej.

Jest dość prosty i łatwy do nauczenia, więc pasuje również do drużyn o niskich umiejętnościach, ponieważ nie ma potrzeby posiadania hibernacji wśród guru.

Zajrzyj na stronę jpetstore 6 http://mybatis.org/spring/sample.html

Diego
źródło
2
Te „nisko wykwalifikowane zespoły” nadal muszą znać SQL.
Sprawca
Dobra zwięzła odpowiedź, dwie główne różnice to: db centric + płytka krzywa uczenia się. Ale nie do końca zgadzam się z „Pasuje dobrze do złożonych lub starszych baz danych”. Przewaga bycia centrycznym staje się bardziej widoczna, gdy masz większą kontrolę nad projektem db.
DPM,
5

Ponieważ pytanie odnosi się do mojego komentarza , oto co miałem na myśli pisząc to.

Przede wszystkim pochodzi z kontekstu twojego pierwotnego pytania. W innych okolicznościach mógłbym udzielić innej porady. To, co skłoniło mnie do zasugerowania MyBatis, to:

... napotkaliśmy pewne problemy z wydajnością.

Zdecydowaliśmy się porzucić hibernację na rzecz zwykłego Jdbc, aby uzyskać wydajność bazy danych ...

W jednym z poprzednich projektów nasz zespół rozważał przejście z Hibernacji z powodów, które opisałeś. Podobnie jak Ty, zamierzaliśmy przejść na JDBC, ale koledzy z innego projektu polecili nam MyBatis. Zespół postanowił spróbować, zachowując JDBC jako opcję awaryjną w przypadku, gdyby coś poszło nie tak.

W tym momencie nie wiedziałem nic o MyBatis, ale miałem wystarczająco dużo doświadczenia z JDBC, aby mieć pewność, że wykona to zadanie. Mimo to zdecydowanie popierałem pomysł wypróbowania MyBatis, głównie dlatego, że zgodnie z moim przeszłym doświadczeniem, ilość kodu, który musielibyśmy napisać za pomocą JDBC, byłaby po prostu zniechęcająca.

  • Szczerze mówiąc, podoba mi się JDBC, ponieważ jest łatwy do zrozumienia, niezawodny i daje poczucie kontroli nad interakcją z bazą danych, ale cena, którą się za to płaci, jest naprawdę wysoka. Moje palce zaczynają boleć za każdym razem, gdy przypominam sobie, ile płyt grzewczych musiałem napisać w JDBC.

W każdym razie wypróbowaliśmy MyBatis i działało ono zgodnie z reklamą. Dlatego napisałem komentarz, o który pytasz.

W przypadku, gdy oczekujesz ode mnie szczegółowego przeglądu technologii lub w jakiś sposób chwalę jej wyższość - przepraszam, że nie mogę tego zrobić. Gdybym mógł - napisałbym to już w osobnej odpowiedzi na twoje pierwotne pytanie zamiast krótkiego komentarza. Wspomniałem, że wtedy nic nie wiedziałem o MyBatis - cóż, wciąż mam dość małą wiedzę na ten temat, przepraszam. Przejście z Hibernacji zostało wykonane przez innych członków zespołu i nie wpłynęło to na kod, nad którym pracowałem. Przypomniałem sobie tylko kluczowe rzeczy na wynos (na podstawie których skomentowałem), a mianowicie, że 1) MyBatis rozwiązało problemy, które mieliśmy z Hibernacją, 2) nie wprowadziło własnych problemów i 3) pozwoliło nam uniknąć pisania kodu I oczekiwał na wypadek, gdybyśmy przestawili się na JDBC. To wszystko.

komar
źródło
3

Hibernacja jest znana ze zbyt dużej ilości magii , nieoczekiwanego zachowania i dużej krzywej uczenia się. Istnieją inne frameworki, które są bardziej skoncentrowane na prostocie i pozwolą ci kontrolować.

myBatis jest jednym z nich, mój projekt MentaBean jest kolejnym. Napisałem o tym post na blogu , który może pomóc.

Sergio Oliveira Jr.
źródło
6
Cześć Sergio i witam. Nasza społeczność na ogół marszczy brwi z powodu jawnej autopromocji i wymagamy od ciebie wyraźnego ujawnienia swojej przynależności w swoich odpowiedziach. Zredagowałem twoją odpowiedź, aby wskazać, że MentaBean to projekt, w który jesteś zaangażowany i że napisałeś post na blogu, na który wskazujesz, jeśli nie podoba ci się frazowanie, możesz go zmienić, ale proszę, kontynuuj niektóre ujawnienia, że ​​jesteś zaangażowany w MentaBean. Przeczytaj odpowiednią sekcję w naszym FAQ, aby uzyskać więcej informacji.
yannis
Cześć Yannis. Zrobię to. Dzięki za heads-upy. :)
Sergio Oliveira Jr.
-1

Użyłem Hibernacji do projektu ładowania i transformacji danych 5 lat temu przy użyciu Hibernacji 3 i pomyślałem, że to cudowne. Robię małą aplikację e-commerce, próbowałem użyć Hibernacji 4 i byłem bardzo rozczarowany. Usunęli narzędzia i ściśle zintegrowali z IDE. Wypróbowałem MyBatis i wszystko działam w ciągu jednej nocy i jestem bardzo zadowolony z tego, jak łatwo można zintegrować z aplikacją. Myślę, że Hibernacja stała się zbyt rozdęta i w tym momencie użyłbym EJB 3 zamiast Hibernacji.

marland
źródło
1
Jak wypada porównanie EJB 3 i Hibernacji ???
Jose