Pull to refresh

Comments 39

Меня в Java всегда отталкивала ее многословность, если можно так выразиться. Я понимаю, что это расплата за статичную типизацию и возможность контроля на этапе компиляции. Но созерцание таких xml-конфигураций несколько угнетает.

Сам сейчас пытаюсь перейти на Java, как основной язык для заработка. И это — один из моментов, которые меня напрягают больше всего. Я сам стороннок статичной типизации, но всего должно быть в меру.

В этом плане Scala выглядит попривлекательнее из-за автоматического выведения типов и автогенерации геттеров и сеттеров по анотациям. Но от подобных конфигов она все равно не спасает.

Простите, накипело.

А статья хорошая. Действительно, в подавляющем большинстве учебных материалов, которые я читал рассказывалось о Hibernate, а про альтернативы ни слова. Новичку в разнообразии библиотек, которые есть для Java сориентироваться очень сложно. Тем более не зная, что искать.

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

Хотя, в статье вроде как не про Java, а конкретно про громоздкость и медленность Hibernate речь идёт )
Hibernate сконфигурировать можно и программно

MyBatis тоже, доки. Лично я не понимаю желание автора использовать XML там, где у него абсолютно нет преимуществ.
Если делать программно, то для изменения конфигурации необходимо перекомпилить приложение?
Вот вам вопросы:
1. Часто ли вы подсовываете xml в jar?
2. Что мешает скомпилировать класс с зависимостями(обычно 1, Idea к примеру хорошо определяет что-компилировать)?
Эта статья не претендовала на исчерпывающий мануал по MBatis, а для того что бы показать общие идеи MyBatis, XML подходит как нельзя лучше.
У каждого из методов конфигурации есть свои плюсы и минусы, что у xml, аннотаций или программной реализации.

В данном случае плюсами и смыслом xml в том что:
во-первых, она (конфигурация) находится в одном месте (в не скольких xml-файлах), а не размазана по десяткам классов
во-вторых, если xml вынести за пределы ear/war/jar, то появляется возможность менять конфигурацию
Почитайте про Spring Data. Там просто объявляется интерфейс, а Spring по названию метода может сам сгенерировать запросы. В случае сложных запросов — можно написать их на JPQL. github.com/spring-projects/spring-data-jpa-examples/blob/master/spring-data-jpa-example/src/main/java/org/springframework/data/jpa/example/repository/simple/SimpleUserRepository.java
буквально сорвали с языка про Spring Data, а в частности, про Spring Data JPA
Пожалуйста, аргументируйте свои минуса. Я же не призываю использовать только kotlin, у каждого есть свое мнения и свой выбор, я просто предложил как вариант и все.
Сам сейчас пытаюсь перейти на Java, как основной язык для заработка.


Планируете стать Java-заработчиком?
автогенерации геттеров и сеттеров по анотациям

какой такой анатация? их компилятор без анотаций выводит
Статья как руководство к MyBatis довольно неплохая, автору спасибо! Но не могу таки согласиться, что MyBatis это альтернатива Hibernate. Альтернативы Hibernate это EclipseLink, DataNucleus, а MyBatis это таки своеобразная библиотека для маппинга объектов.
Вычеркните EclipseLink, с ним с завидной периодичностью возникают разнообразные проблемы.
Тоже накипело, как у автора первого комментария.
Хотелось бы реально бенчмарки увидеть и услышать про проекты, где всё упёрлось именно в «медленность» Hibernate. Я не спорю, что у него оверхед есть, но не сталкивался с ситуации, когда это становилось слабым звеном в системе.

btw, если уж у вас проблема именно со скоростью Hibernate, то используйте чистый JDBC )
Автор скорее всего имел ввиду тюннинг SQL запросов
Это как раз странно, так как Hibernate вполне себе поддерживает и нативные запросы и HQL — обтюнингуйся в узких местах.
Ситуаций когда Hibernate становится слишком меделнным — вполне достаточно. Например если вам нужно работаеть не с парой-десятком объектов, а с «пачками» на много тысяч. И использовать DB-specific SQL. Но обычно если такие ситуации и возникают, то от ORM чаще всего отказываются совсем и спользуют либо чистый SQL, либо что-то вроде JOOQ.
Ответ на ваш вопрос есть в докладе
1. youtu.be/1KphwODu1gg
2. youtu.be/YzOTZTt-PR0

Overhead у него значительный все же.
Я вообще практикую использование dto c чистым sql, на мой взгляд это более правильное решение если система нагруженная.
Использовали MyBatis на несколько больших проектов. Только хорошие впечатления.

Из того что не указал автор — возможность создание TypeHandler'ов. Простой пример — в Java есть Enum со списком значений и нужно его замапить на значения из колонки. Создаётся TypeHandler — класс, который отвечает за преобразования этого объекта из Java в СУБД и наоборот, прописывается в маппинге запроса и всё. Дальше при выполнении запроса получает типизированные объекты. Мы использовали TypeHandler'ы для структур, списка структур, Enum'ов (шаблонный TypeHandler).

Также маппинги можно прописывать в интерфейсе (не скажу что это всегда удобно, но по крайней мере есть возможность не использовать xml).

Так же для IDEA есть отличный плагин по работе с MyBatis — plugins.jetbrains.com/plugin/7293. Я пробовал разные плагины для MyBatis, но этот оказался самый лучший. Из плюсов — подсветка синтаксиса в xml, autocomlite в xml, автопроверка соответствия интерфейса xml маппингу и наоборот, связывание методов интерфейса с маппингом (можно просто перейти в реализацию метода из интерфейса в xml — как к реализации метода интерфейса в классе). Также если настроить подключение к СУБД в IDEA, работает autocomplite по SQL запросам в xml (Например, если у нас в СУБД есть таблица students то если пишем в xml маппинге SELECT * FROM st и нажимаем Ctrl+Space IDEA подскажет, что можно выбрать таблицу students)

P.S. Работали с СУБД Oracle. В основном был вызов хранимых процедур и функций. Но были и select, и update.
вы же про @javax.persistence.Enumerated и org.hibernate.type.EnumType знаете, да? ну, т.е. как бы у MyBatis тут нет преимуществ перед прочими. Так же, есть пакет org.hibernate.usertype, в котором есть не только org.hibernate.usertype.UserType
и поддержка Hibernate изначально из коробки в IDEA в плане озвученных плюсов к плагину MyBatis
А еще автор не написал, что можно в MyBatis`е использовать аннотации, с которыми написание запросов становится просто удовольствием.

Выглядит примерно так:

public interface EmployeeMapper {

Select(«SELECT * FROM employee WHERE id = #{id}»)
@ResultMap(«employeeResultMap»)
Employee findById(long id);

}

нужен только один XML-файл для конфига, и все!
В Hibernate вроде как тоже можно запросы аннотациями:

@NamedNativeQueries({
	@NamedNativeQuery(
	name = "findEmployeeCodeNativeSQL",
	query = "select * from employee e where e.id = :id",
        resultClass = Employee.class
	)
})

@Entity
@Table(name = "employee", catalog = "my")
public class Employee implements java.io.Serializable {
...


Query query = session.getNamedQuery("findEmployeeCodeNativeSQL").setString("id", "666");
Ну кстати симпатично, а это какая версия Хибернейта?
Любая, поддерживающая JPA 1.0 — это оттуда аннотация.
Это вообще JPA спецификация. А на JPA уже версия 2.1 во все поля.
Без бенчмарков все это как-то голословно.
Советую также посмотреть в сторону Apache Cayenne. Среди плюсов по сравнению с MyBatis можно назвать построение конечных sql запросов к БД через шаблонизатор Velocity. Получается минимум xml и максимум гибкости.
Все сказанное в статье про Hibernate — чушь, больше всего доставляет заголовок — «MyBatis как более быстрая альтернатива Hibernate». Нет опыта работы с Hibernate — не пишите про него, зачем портить неплохую статью ничем не подтвержденными сравнениями?! Hibernate может и сам генерировать SQL, а может предоставить это разработчику. Если у автора нет достаточного опыта работы с Hibernate, зачем писать о том, что он медленнее?

«MyBatis мапится не на таблицы, а на SQL запросы»
Hibernate тоже так умеет, но почему-то в статье эта возможность — прерогатива только MyBatis-а

MyBatis при разумном использовании может дать ощутимый прирост в скорости работы приложения
А Hibernate при таком же разумном использовании не может, не?

MyBatis можно использовать совместно с Hibernate там где это действительно нужно
Да ладно, серьезно? Будете на одном проекте два ORM-а разворачивать?
Из всех ORM больше всего понравилась Avaje Ebean (используется в Play Framework) — простая в использовании, минимум оверхеда, JPA
Всё остальное (тем более Hibernate) показалось слишком громоздким и неудобным.
К вопросам по ужасным xml, громоздкости, мапингу без xml:

Mybatis поддерживает программное конфигурирование, можно с помощью аннотаций запихнуть весь запрос в интерфейсы. Но есть как минимум две причины по которой мне не очень нравиться использовать аннотации в Mybatis
  • Сам sql становиться менее читаемым, аннотация становится мостроподобной. А в xml файле все аккуратно лежит, подсвечивается.
  • В интерфейсе было проблематично указать ResultMap для запроса. Когда я только начал использовать аннотации, пришлось несколько раз продублировать ResultMap для каждого метода. Решение было не явным и в документации нигде не описано, что можно использовать уже объявленный ResultMap по имени метода в котором он был объявлен, с суффиксом “-void”(Если ResultMap был объявлен для метода getUsers, дальше данный ResultMap можно будет использовать по имени “getUsers-void”

Использовать или не использовать аннотации и отказываться от xml — это дело вкуса, мне не понравилось писать sql запросы в аннотации.
К мнению о том, что Hibernate оклеветали, я не компетентен и тп

От части в этом есть смысл. Знания и опыт по Hibernate — у мня не глубоки и подозревал что будет такое мнение. Начал я эту статью писать с того, что необходимо было определить что быстрее и целесообразно ли использовать MyBatis. Я проводил тестирование с помощью labs.carrotsearch.com/junit-benchmarks.html, да и опыта такого не было. Посмотрев на скудность данных и не было уверенности что я все делаю правильно — сравнивать две ORM без большого опыта использования обоих не верно, но на тех тестах которые мной были проведенный(выборка элементарных объектов со связью один к одному и один к многим), показали что Hibernate процентов на 10 уступает MyBatis со Spring (на аннотациях), а если использовать стандартные механизмы мапинга MyBatis то разрыв становится больше.

Использовать можно и две ORM на проекте — MyBatis для работы с сложными запросами, т.к. он обрабатывает запросы быстрее, а Hibernate использовать для CRUD(без Read) он прекрасно с этим справляется. — IMHO

Если есть опыт проведения сравнений ORM и других библиотек. прошу поделиться опытом.
Использовать можно и две ORM на проекте


Вы рискуете не помирить их по транзакциям. Либо же цена этому мирению будет запредел.
Скажите пожалуйста, а в 2015 году Hibernate все еще желает mutable POJO's? Какие вообще Java ORM фрэймворки поддерживают immutability?
Sign up to leave a comment.

Articles