Wpis z mikrobloga

#programowanie #bazydanych #hibernate #mybatis #jdbc

Macie aplikację Javową (np. w Springu) i chcecie napisać do niej DAO do relacyjnej bazy danych (np. Oracle lub PostgreSQL). Zależy wam na wydajności i kontrolowaniu tabel/zapytań (w sensie, żeby samemu decydować kiedy ma się zrobić tabela, a nie automatycznie pod każdą klasę; żeby samemu decydować kiedy ma być join itd., bo jest to kosztowne).

Czego używacie?
- Spring Date,
- Hibernate (bez HQL, tylko konfiguracja w Javie),
- Hibernate z HQL,
- JPA bez Hibernate (np. na WebSphere),
- MyBatis,
- czyste SQL z JDBC (ewentualnie z Spring JdbcTemplate),
- coś innego?

Do wydajnego DAO używam:

  • Spring Data 39.4% (13)
  • Hibarnate (tylko Java) 21.2% (7)
  • Hibernate z HQL 6.1% (2)
  • JPA bez Hibernate 3.0% (1)
  • MyBatis 6.1% (2)
  • SQL + JDBC 21.2% (7)
  • Inne 3.0% (1)

Oddanych głosów: 33

  • 15
  • Odpowiedz
@mk321: Jeśli Ci zależy na wydajności a jednocześnie mapowaniu na encje to mybatis wydaje się najlepszy. Hibernate/Spring Data obniży wydajność i kontrolę nad zapytaniami. Przy MyBatis masz wsparcie klas, więc przewaga nad jdbc
  • Odpowiedz
zależy na wydajności a jednocześnie mapowaniu na encje


@ThePawel: dokładnie tak.

Serio MyBatis to jest najlepsze rozwiązanie w takim
  • Odpowiedz
@mk321: ehhh.. w aktualnym projekcie mam: JPA + Hibernate, HQL, MyBatis, SQL+jdbcTemplate.
I w kryzysowych sytuacjach ratuje nas SQL (jdbcTemplate).

PS. super zabawa zaczyna się jak trzeba zrobić transakcje na 2 baza przy wykorzystaniu 3 różnych podejść :)
  • Odpowiedz
@mk321: W 80% przypadków wystarcza ci Hibernate, jak masz miejsce gdzie baza cię dusi bo hibernate coś #!$%@? to zawsze możesz natywne zapytanie puścić. Czasami używa się też query builderów typu jOOQ (ten akurat ma też dodatkowe ficzery).
  • Odpowiedz
@mk321 w większości firm używasz prostego crud. Do zapisywania czy update encji spring data jest mega wygodny i super się w tym kodzi. Mybatis polecam używać jak masz skomplikowane query do pobierania z bazy
  • Odpowiedz
w aktualnym projekcie mam: JPA + Hibernate, HQL, MyBatis, SQL+jdbcTemplate.


@mccloud: o kurde, nieźle xD

I w kryzysowych sytuacjach ratuje nas SQL
  • Odpowiedz
@cxnmlhuipwetr: @ThePawel: mamy takie wielkie tabele, że czasem kilka dni zastanawiamy się czy możemy zrobić dodatkowego joina czy nie (czy nam to drastycznie nie wpłynie na wydajność albo nawet nie ubije bazy). W MyBatis wszystkie zapytania kontrolujemy.

Jeśli bym użył Hibernate, to musiałbym do wszystkiego i tak pisać HQL (i mam nadzieję, że pod spodem Hibernate by nie robił jakiś czarów). Miałoby to jakieś zalety nad MyBatisem?
  • Odpowiedz
@mk321: akurat MyBatis jest użyty tylko w malutkej części i raczej nie chcemy aby rozlazł się po całym projekcie (nie ze względu, że jest zły, tylko że i tam mamy wystarczająco innych rozwiązań).

W moim przypadku, gdy potrzebuję zapytania, które jest skomplikowane ale w miare stałe (zmieniają się parametry) - to sql + jdbcTemplate wystarcza.
Gdyby faktycznie, trzeba było bardziej skomplikowanych warunków (w zależności od X zmienia się częśc zapytania)
  • Odpowiedz
@mk321 zaleta hibernate nad mybatis to mapowanie na encje i łatwość w użyciu. Performance zawsze będzie gorszy więc jak macie takie problemy z Joinami to bym został przy my Batis ewentualnie delete update create I proste fetch Po id przenieść do spring data
  • Odpowiedz
@mk321:
Spring/Spring Data JPA jest z tego wszystkiego najbardziej uniwersalne. W prostych przypadkach opierasz sie na tym co wymyśli Hibernate. Jak potrzebujesz napisać proste zapytanie z palca to robisz Query albo Native Query. Potrzebujesz zapytania na 100 linii? Piszesz osobny plik sql i ładujesz go do JdbcTemplate. Potrzebujesz warunkowych zapytań składanych w runtimie? Dokładasz QueryDSL.
  • Odpowiedz