Каковы преимущества myBatis перед Hibernate? [закрыто]

33

Я провел некоторые исследования самостоятельно и понял основную концепцию. Но некоторые идеи могут быть получены только через реальный опыт.

Каковы преимущества myBatis, которые делают его полезным для изучения новой платформы?
В каком случае вы бы не использовали его?

Кшитиз Шарма
источник
3
Я проверил оба и в конечном итоге использовал Cayenne.
Deadalnix

Ответы:

38

Подумайте, чего вы пытаетесь достичь. Как правило, модель разделения ответа на командный запрос хорошо работает для сложных доменов.

Причина в том, что вы пытаетесь сделать одну из двух вещей:

  1. Создать / обновить / удалить некоторые сложные доменные объекты
  2. Запускать аналитические запросы выборки (т.е. запросы суммирования / агрегации)

Hibernate хорошо работает для случая 1, позволяя вам просто сделать POJO и сохранить / обновить его. Это также делает это быстро, если ваш домен не очень большой.

myBatis отлично подходит для выборочных запросов (случай 2), где вы просто хотите получить ответ. Hibernate попытается загрузить весь граф объектов, и вам нужно будет начать настройку запросов с помощью трюков LazyLoading, чтобы он работал на большом домене. Это важно при выполнении сложных аналитических запросов, которые даже не возвращают объектные объекты. В этом случае Hibernate предлагает только SqlQuery и бобовые трансформеры с огромными типами по умолчанию, такими как BigDecimal, в то время как myBatis может легко отображаться в простой не-сущности POJO.

Эти два случая представляют собой разницу между командами, в которых вы хотите изменить данные домена, и ответами, в которых вы просто хотите получить некоторые данные.

Итак, рассмотрим эти два случая и то, что делает ваше приложение. Если у вас простой домен и вы просто получаете информацию, используйте myBatis. Если у вас сложный домен и сохраняются сущности, используйте Hibernate. Если вы делаете оба, рассмотрите гибридный подход. Это то, что мы используем в нашем проекте, который имеет тысячи объектов, чтобы держать его под контролем. ;)

Джозеф Люст
источник
2
Hibernate хорошо работает с вашим делом 2. Простой пример см .: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Майк Партридж,
3
«Hibernate попытается загрузить весь граф объекта», это звучит как ошибка конфигурации. «Необходимо начать настройку запросов с помощью трюков LazyLoading» звучит так, как будто вы где-то установили fetch = eager. JPA имеет JPQL, который является практически SQL, но хорошо интегрирован с Hibernate / JPA. Я думаю, что это # ​​2 очень хорошо. Люди обычно работают в течение года или более, прежде чем ORM будет настроен на 100% правильно. Я не минимизирую, когда говорю, что это ошибка конфигурации - конфигурация с этими инструментами может быть очень трудоемкой и сложной!
ГленПетерсон
3
@GlenPeterson Я не говорю, что Hibernate не может быть приручен, но для большинства пользователей сложные доменные объекты будут загружаться медленно, если не будут выполнены оптимизации, как вы цитировали. Сложные аналитические запросы более просты с myBatis для большинства пользователей, хотя на самом деле этого можно достичь с помощью ORM. Вопрос для многих заключается в том, нужна ли им независимость поставщика ORM для своего продукта.
Джозеф Луст
10
Hibernate делает вид, что под ними нет БД, и вы просто относитесь к своей модели данных, как если бы она была разработана с использованием коллекций Java. Что очень часто не так. На уровне БД представление данных может сильно отличаться, и попытка автоматически отобразить его в коллекции Java не обязательно имеет какой-либо смысл. Вот почему Hibernate является прекрасным примером «Leaky abstraction». MyBatis намного проще, его легко понять, в нем нет магии и ... да, есть SQL, который я считаю хорошим, потому что нет ничего плохого в использовании SQL для баз данных на основе SQL.
Марцин
2
@ Марчин замечательный момент. Я видел слишком много проблем с эмуляцией коллекций в Hibernate. Например, некоторый код вызывает myBag.size (), и Hibernate пытается загрузить 750К объектов в память перед их подсчетом. Если вам нужен только SQL, используйте SQL.
Джозеф Ласт
19

MyBatis ориентирован на SQL. Это помогает вам вызывать операторы SQL и отображать результаты (таблицы) в деревья объектов.

Основным преимуществом является то, что это не ORM. Он не отображает таблицы на объект, поэтому не страдает несоответствием импеданса orm. Хорошо подходит для сложных или устаревших баз данных или для использования функций БД, таких как хранимые процедуры, представления и т. Д.

Он довольно прост и легок в освоении, поэтому подходит и для команд с низкой квалификацией, потому что в них нет необходимости иметь спящего гуру.

Посмотрите на jpetstore 6 http://mybatis.org/spring/sample.html

Диего
источник
2
Эти «низкоквалифицированные команды» все еще должны знать SQL.
преступник
Хороший краткий ответ, два основных отличия таковы: db centric + малая кривая обучения. Но я не совсем согласен с «Подходит для сложных или устаревших баз данных». Преимущество центрирования дб становится более очевидным, когда вы имеете больший контроль над дизайном дб.
DPM
5

Поскольку вопрос относится к моему комментарию , вот что я хотел написать.

Прежде всего, это происходит из контекста вашего исходного вопроса. В других обстоятельствах я мог бы дать другой совет. Дело в том, что я предложил MyBatis:

... мы столкнулись с некоторыми проблемами с производительностью.

Мы решили отказаться от hibernate в пользу простого Jdbc для повышения производительности базы данных ...

В одном из прошлых проектов наша команда рассматривала возможность перехода из Hibernate по причинам, которые вы описали. Как и вы, мы собирались перейти на JDBC, но коллеги из другого проекта рекомендовали нам MyBatis. Команда решила попробовать, сохранив JDBC как запасной вариант на случай, если что-то пойдет не так.

В тот момент я ничего не знал о MyBatis, но имел достаточно опыта работы с JDBC, чтобы быть уверенным, что он справится со своей задачей. Несмотря на это, я решительно поддерживал идею попробовать MyBatis, главная причина в том, что, согласно моему прошлому опыту, объем стандартного кода, который мы должны были бы написать с JDBC, был бы просто пугающим.

  • Честно говоря, мне нравится JDBC за то, что он прост для понимания, надежен и дает хорошее ощущение контроля над взаимодействием с базой данных, но цена, которую за него платят, действительно высока. Мои пальцы начинают болеть каждый раз, когда я вспоминаю, сколько шаблонов мне пришлось набрать при помощи JDBC.

Во всяком случае, мы попробовали MyBatis, и он работал как рекламируется. Вот почему я написал комментарий, о котором вы спрашиваете.

В случае, если вы ожидаете, что я дам подробный обзор технологии или как-то похвалим ее превосходство - извините, я не могу этого сделать Если бы я мог - я бы уже написал это в отдельном ответе на ваш первоначальный вопрос вместо краткого комментария. Я упомянул, что ничего не знал о MyBatis в то время - ну, я все еще очень мало знаю об этом, извините. Переход из Hibernate был сделан другими членами команды, и это не повлияло на код, над которым я работал. Я вспомнил только ключевые выводы (на основании которых я сделал свой комментарий), а именно: 1) MyBatis решил проблемы, которые у нас были с Hibernate, 2) он не представлял собственных проблем и 3) он позволил нам избежать написания стандартного кода I ожидал в случае, если мы переключимся на JDBC. Вот и все.

комар
источник
3

Hibernate хорошо известен своей магией , неожиданным поведением и большим обучением. Существуют и другие фреймворки, которые больше ориентированы на простоту и позволят вам контролировать ситуацию.

myBatis - один из них, мой проект MentaBean - другой. Я написал в блоге об этом, что может помочь.

Серхио Оливейра младший
источник
6
Привет Серхио и добро пожаловать. Наше сообщество, как правило, осуждает саморекламу, и мы требуем, чтобы вы четко указывали свою принадлежность в своих ответах. Я отредактировал ваш ответ, чтобы указать, что MentaBean - это проект, с которым вы связаны, и что вы написали сообщение в блоге, на которое вы указываете, если вам не нравится формулировка, не стесняйтесь ее менять, но, пожалуйста, продолжайте некоторые виды раскрытия, что вы связаны с MentaBean. Прочитайте соответствующий раздел в нашем FAQ для более подробной информации.
Яннис
Привет Яннис. Я сделаю это. Спасибо за внимание. :)
Серхио Оливейра младший
-1

Я использовал Hibernate для проекта загрузки и преобразования данных 5 лет назад, используя Hibernate 3, и я подумал, что это замечательно. Я делаю небольшое приложение для электронной коммерции, пробовал использовать Hibernate 4, и я был очень разочарован. Они удалили инструменты и тесно интегрированы в IDE. Я попробовал MyBatis, и все работало за одну ночь, и я очень рад тому, как легко интегрироваться в приложение. Я думаю, что Hibernate стал слишком раздутым, и я бы использовал EJB 3 вместо Hibernate на этом этапе.

Марланд
источник
1
Как EJB 3 и Hibernate сравниваются ???
Хосе