Quali sono i vantaggi di myBatis su Hibernate? [chiuso]


33

Ho svolto alcune ricerche da solo e ho compreso il concetto di base. Ma alcune intuizioni possono essere acquisite solo attraverso l'esperienza reale.

Quali sono i vantaggi di myBatis che valgono la pena imparare un nuovo framework?
In quale caso eviteresti di usarlo?


3
Ho provato entrambi e ho finito con Cayenne.
deadalnix,

Risposte:


38

Considera cosa stai cercando di ottenere. In genere, il modello Segregazione risposta query comando funziona bene per domini complessi.

Il motivo è che stai cercando di fare una delle due cose in genere:

  1. Crea / Aggiorna / Elimina alcune entità di dominio complesse
  2. Esegui query di recupero analitico (ad es. Query di riepilogo / aggregazione)

Hibernate funziona bene per il caso 1, consentendoti di creare un POJO e di persistere / aggiornarlo. Lo fa anche rapidamente, a meno che il tuo dominio non sia abbastanza grande.

myBatis è ottimo per le query di recupero (caso 2) in cui desideri solo una risposta. Hibernate tenterebbe di caricare l'intero grafico degli oggetti e avresti bisogno di iniziare a ottimizzare le query con i trucchi LazyLoading per farlo funzionare su un dominio di grandi dimensioni. Questo è importante quando si eseguono query analitiche complesse che non restituiscono nemmeno oggetti entità. Hibernate offre solo trasformatori SqlQuery e bean in questo caso con enormi tipi predefiniti come BigDecimal, mentre myBatis potrebbe facilmente mappare su una semplice non-entità POJO.

Questi due casi sono la differenza tra Comandi in cui si desidera modificare i dati del dominio e Risposte in cui si desidera solo recuperare alcuni dati.

Quindi, considera questi due casi e cosa fa la tua applicazione. Se hai un dominio semplice e recuperi solo informazioni, usa myBatis. Se si dispone di un dominio complesso e le entità persistenti, utilizzare l'ibernazione. Se fai entrambe le cose, considera un approccio ibrido. Questo è ciò che utilizziamo nel nostro progetto che ha migliaia di entità per tenerlo sotto controllo. ;)


2
Hibernate funziona bene anche con il tuo caso 2. Per un semplice esempio, vedere: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge

3
"Hibernate tenterebbe di caricare l'intero grafico dell'oggetto" sembra un errore di configurazione. "È necessario iniziare a sintonizzare le query con i trucchi LazyLoading" suona come se avessi impostato fetch = desideroso da qualche parte. JPA ha JPQL che è praticamente SQL, ma ben integrato con Hibernate / JPA. Penso che vada bene # 2. È comune per le persone correre in produzione per un anno o più prima di avere un ORM configurato correttamente al 100%. Non sto minimizzando quando dico che è un errore di configurazione: la configurazione con questi strumenti può richiedere molto tempo e difficoltà!
GlenPeterson,

3
@GlenPeterson Non sto dicendo che Hibernate non possa essere domato, ma per la maggior parte delle persone, le entità di dominio complesse verranno caricate lentamente a meno che non vengano fatte ottimizzazioni, come hai citato. Le query analitiche complesse sono più semplici con myBatis per la maggior parte degli utenti, anche se lo stesso può essere effettivamente ottenuto con un ORM. La domanda per molti è se hanno bisogno dell'indipendenza del fornitore di ORM per il loro prodotto.
Joseph Lust,

10
Hibernate fa finta che non ci sia DB al di sotto e tratti semplicemente il tuo modello di dati come se fosse stato progettato usando raccolte Java. Il che spesso non è il caso. A livello di DB la rappresentazione dei dati può essere molto diversa e provare a mapparla automaticamente nelle raccolte Java non ha necessariamente senso. Questo è il motivo per cui Hibernate è un perfetto esempio di "astrazione che perde". MyBatis è molto più semplice, facile da comprendere, non c'è magia e ... sì, c'è SQL che trovo positivo perché non c'è niente di sbagliato nell'usare SQL per database basati su SQL.
Marcin

2
@Marcino ottimo punto. Ho visto troppi problemi con l'emulazione delle raccolte in Hibernate. Ad esempio, alcuni codici chiamano myBag.size () e Hibernate tenta di caricare in memoria 750.000 oggetti prima di contarli. Se hai solo bisogno di SQL, usa SQL.
Joseph Lust,

19

MyBatis è incentrato su SQL. Ti aiuta a chiamare le istruzioni SQL e mappare i risultati (tabelle) sugli alberi degli oggetti.

Il vantaggio principale è che non è un ORM. Non associa le tabelle agli oggetti, quindi non subisce la mancata corrispondenza dell'orm impedenza. Adatto per database complessi o legacy o per utilizzare funzionalità db come stored procedure, viste e così via.

È abbastanza semplice e facile da imparare, quindi si adatta anche a squadre scarsamente qualificate perché non è necessario avere un guru in letargo tra di loro.

Dai un'occhiata a jpetstore 6 http://mybatis.org/spring/sample.html


2
Quei "team poco qualificati" devono ancora conoscere SQL.
perp

Buona risposta concisa, le due differenze principali sono quelle: db centric + curva di apprendimento superficiale. Ma non sono totalmente d'accordo con "Adatto per database complessi o legacy". Il vantaggio di essere db centric diventa più evidente quando si ha un maggiore controllo sulla progettazione di db.
DPM,

5

Poiché la domanda si riferisce al mio commento , ecco cosa avevo in mente di scriverlo.

Prima di tutto, deriva dal contesto della tua domanda originale. In altre circostanze potrei dare un consiglio diverso. Il punto che mi ha fatto suggerire MyBatis è questo:

... abbiamo riscontrato alcuni problemi di prestazioni.

Abbiamo deciso di abbandonare l'ibernazione a favore del semplice Jdbc per ottenere prestazioni del database ...

In uno dei progetti passati, il nostro team ha preso in considerazione il passaggio da Hibernate per i motivi che descrivi. Simile a te, stavamo per passare a JDBC, ma i colleghi di un altro progetto ci hanno consigliato MyBatis. Il team ha deciso di provarlo, mantenendo JDBC come opzione di fallback nel caso in cui le cose vadano male.

In quel momento, non sapevo nulla di MyBatis ma avevo abbastanza esperienza con JDBC per essere sicuro che avrebbe fatto il suo lavoro. Nonostante ciò, avevo fortemente sostenuto l'idea di provare MyBatis, il motivo principale è che, per la mia esperienza passata, la quantità di codice del boilerplate che dovremmo scrivere con JDBC sarebbe semplicemente scoraggiante.

  • Ad essere onesti, mi piace JDBC per essere semplice da capire, affidabile e per dare una buona sensazione di controllo sull'interazione con il database, ma il prezzo che si paga è davvero alto. Mi fanno male le dita ogni volta che ricordo quanta piastra ho dovuto scrivere con JDBC.

Comunque, abbiamo provato MyBatis e ha funzionato come pubblicizzato. Ecco perché ho scritto il commento che chiedi.

Nel caso in cui ti aspetti che io dia una panoramica dettagliata della tecnologia, o in qualche modo elogi la sua superiorità, mi dispiace non poterlo fare. Se potessi, lo scriverei già in una risposta separata alla tua domanda originale, invece di fare un breve commento. Ho detto che all'epoca non sapevo nulla di MyBatis - beh, mi dispiace ancora poco. La transizione da Hibernate è stata effettuata da altri membri del team e non ha avuto alcun impatto sul codice su cui stavo lavorando. Ho solo ricordato i punti da asporto chiave (sulla base dei quali ho fatto il mio commento), vale a dire che 1) MyBatis ha risolto i problemi che avevamo con Hibernate, 2) non ha introdotto problemi propri e 3) ci ha permesso di evitare di scrivere codice bollettino I mi aspettavo nel caso in cui passassimo a JDBC. È tutto.


3

L'ibernazione è ben nota per troppa magia , comportamento inaspettato e grande curva di apprendimento. Ci sono altri framework là fuori che sono più focalizzati sulla semplicità e ti permetteranno di avere il controllo.

myBatis è uno di questi, il mio progetto MentaBean è un altro. Ho scritto un post sul blog che potrebbe aiutare.


6
Ciao Sergio e benvenuto. La nostra comunità generalmente disapprova apertamente l'autopromozione e abbiamo bisogno che tu sveli chiaramente la tua affiliazione nelle tue risposte. Ho modificato la tua risposta per sottolineare che MentaBean è un progetto a cui sei coinvolto e che hai scritto il post sul blog a cui fai riferimento, se non ti piace il fraseggio sentiti libero di cambiarlo, ma per favore mantieni alcuni tipi di divulgazione che sei coinvolto con MentaBean. Leggi la sezione pertinente nelle nostre FAQ per maggiori dettagli.
yannis,

Ciao Yannis Lo farò. Grazie per il testa a testa. :)
Sergio Oliveira Jr.,

-1

Ho usato Hibernate per un progetto di caricamento e trasformazione dei dati 5 anni fa usando Hibernate 3 e ho pensato che fosse meraviglioso. Sto facendo una piccola applicazione di e-commerce e ho provato a utilizzare Hibernate 4 e sono rimasto estremamente deluso. Hanno rimosso gli strumenti e sono strettamente integrati nell'IDE. Ho provato MyBatis e vado a lavorare tutto in una sola notte e sono molto contento di quanto sia facile integrarsi in un'applicazione. Penso che Hibernate sia diventato troppo gonfio e avrei usato EJB 3 su Hibernate a questo punto.


1
Come si confronta EJB 3 e Hibernate ???
Jose
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.