Комментарии 39
Меня в Java всегда отталкивала ее многословность, если можно так выразиться. Я понимаю, что это расплата за статичную типизацию и возможность контроля на этапе компиляции. Но созерцание таких xml-конфигураций несколько угнетает.
Сам сейчас пытаюсь перейти на Java, как основной язык для заработка. И это — один из моментов, которые меня напрягают больше всего. Я сам стороннок статичной типизации, но всего должно быть в меру.
В этом плане Scala выглядит попривлекательнее из-за автоматического выведения типов и автогенерации геттеров и сеттеров по анотациям. Но от подобных конфигов она все равно не спасает.
Простите, накипело.
А статья хорошая. Действительно, в подавляющем большинстве учебных материалов, которые я читал рассказывалось о Hibernate, а про альтернативы ни слова. Новичку в разнообразии библиотек, которые есть для Java сориентироваться очень сложно. Тем более не зная, что искать.
Спасибо автору, будет чем заняться на выходных.
Сам сейчас пытаюсь перейти на Java, как основной язык для заработка. И это — один из моментов, которые меня напрягают больше всего. Я сам стороннок статичной типизации, но всего должно быть в меру.
В этом плане Scala выглядит попривлекательнее из-за автоматического выведения типов и автогенерации геттеров и сеттеров по анотациям. Но от подобных конфигов она все равно не спасает.
Простите, накипело.
А статья хорошая. Действительно, в подавляющем большинстве учебных материалов, которые я читал рассказывалось о Hibernate, а про альтернативы ни слова. Новичку в разнообразии библиотек, которые есть для Java сориентироваться очень сложно. Тем более не зная, что искать.
Спасибо автору, будет чем заняться на выходных.
+2
Но созерцание таких xml-конфигураций несколько угнетает.Hibernate сконфигурировать можно и программно.
автогенерации геттеров и сеттеров по анотациямДля java есть такие плюшки для этого.
Хотя, в статье вроде как не про Java, а конкретно про громоздкость и медленность Hibernate речь идёт )
+3
Если делать программно, то для изменения конфигурации необходимо перекомпилить приложение?
-4
-
0
Эта статья не претендовала на исчерпывающий мануал по MBatis, а для того что бы показать общие идеи MyBatis, XML подходит как нельзя лучше.
0
У каждого из методов конфигурации есть свои плюсы и минусы, что у xml, аннотаций или программной реализации.
В данном случае плюсами и смыслом xml в том что:
во-первых, она (конфигурация) находится в одном месте (в не скольких xml-файлах), а не размазана по десяткам классов
во-вторых, если xml вынести за пределы ear/war/jar, то появляется возможность менять конфигурацию
В данном случае плюсами и смыслом xml в том что:
во-первых, она (конфигурация) находится в одном месте (в не скольких xml-файлах), а не размазана по десяткам классов
во-вторых, если xml вынести за пределы ear/war/jar, то появляется возможность менять конфигурацию
-1
Почитайте про 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
+5
Попробуйте kotlin.
-1
Сам сейчас пытаюсь перейти на Java, как основной язык для заработка.
Планируете стать Java-заработчиком?
+2
автогенерации геттеров и сеттеров по анотациям
какой такой анатация? их компилятор без анотаций выводит
0
Статья как руководство к MyBatis довольно неплохая, автору спасибо! Но не могу таки согласиться, что MyBatis это альтернатива Hibernate. Альтернативы Hibernate это EclipseLink, DataNucleus, а MyBatis это таки своеобразная библиотека для маппинга объектов.
+5
Хотелось бы реально бенчмарки увидеть и услышать про проекты, где всё упёрлось именно в «медленность» Hibernate. Я не спорю, что у него оверхед есть, но не сталкивался с ситуации, когда это становилось слабым звеном в системе.
btw, если уж у вас проблема именно со скоростью Hibernate, то используйте чистый JDBC )
btw, если уж у вас проблема именно со скоростью Hibernate, то используйте чистый JDBC )
+4
Автор скорее всего имел ввиду тюннинг SQL запросов
0
Ситуаций когда Hibernate становится слишком меделнным — вполне достаточно. Например если вам нужно работаеть не с парой-десятком объектов, а с «пачками» на много тысяч. И использовать DB-specific SQL. Но обычно если такие ситуации и возникают, то от ORM чаще всего отказываются совсем и спользуют либо чистый SQL, либо что-то вроде JOOQ.
-2
НЛО прилетело и опубликовало эту надпись здесь
Использовали 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.
Из того что не указал автор — возможность создание 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.
+1
вы же про
и поддержка Hibernate изначально из коробки в IDEA в плане озвученных плюсов к плагину MyBatis
@javax.persistence.Enumerated
и org.hibernate.type.EnumType
знаете, да? ну, т.е. как бы у MyBatis тут нет преимуществ перед прочими. Так же, есть пакет org.hibernate.usertype
, в котором есть не только org.hibernate.usertype.UserType
и поддержка Hibernate изначально из коробки в IDEA в плане озвученных плюсов к плагину MyBatis
0
А еще автор не написал, что можно в MyBatis`е использовать аннотации, с которыми написание запросов становится просто удовольствием.
Выглядит примерно так:
public interface EmployeeMapper {
Select(«SELECT * FROM employee WHERE id = #{id}»)
@ResultMap(«employeeResultMap»)
Employee findById(long id);
}
нужен только один XML-файл для конфига, и все!
Выглядит примерно так:
public interface EmployeeMapper {
Select(«SELECT * FROM employee WHERE id = #{id}»)
@ResultMap(«employeeResultMap»)
Employee findById(long id);
}
нужен только один XML-файл для конфига, и все!
0
В 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");
0
НЛО прилетело и опубликовало эту надпись здесь
Советую также посмотреть в сторону Apache Cayenne. Среди плюсов по сравнению с MyBatis можно назвать построение конечных sql запросов к БД через шаблонизатор Velocity. Получается минимум xml и максимум гибкости.
0
Все сказанное в статье про Hibernate — чушь, больше всего доставляет заголовок — «MyBatis как более быстрая альтернатива Hibernate». Нет опыта работы с Hibernate — не пишите про него, зачем портить неплохую статью ничем не подтвержденными сравнениями?! Hibernate может и сам генерировать SQL, а может предоставить это разработчику. Если у автора нет достаточного опыта работы с Hibernate, зачем писать о том, что он медленнее?
«MyBatis мапится не на таблицы, а на SQL запросы»Hibernate тоже так умеет, но почему-то в статье эта возможность — прерогатива только MyBatis-а
MyBatis при разумном использовании может дать ощутимый прирост в скорости работы приложенияА Hibernate при таком же разумном использовании не может, не?
MyBatis можно использовать совместно с Hibernate там где это действительно нужноДа ладно, серьезно? Будете на одном проекте два ORM-а разворачивать?
-1
Из всех ORM больше всего понравилась Avaje Ebean (используется в Play Framework) — простая в использовании, минимум оверхеда, JPA
Всё остальное (тем более Hibernate) показалось слишком громоздким и неудобным.
Всё остальное (тем более Hibernate) показалось слишком громоздким и неудобным.
0
К вопросам по ужасным xml, громоздкости, мапингу без xml:
Mybatis поддерживает программное конфигурирование, можно с помощью аннотаций запихнуть весь запрос в интерфейсы. Но есть как минимум две причины по которой мне не очень нравиться использовать аннотации в Mybatis
Использовать или не использовать аннотации и отказываться от xml — это дело вкуса, мне не понравилось писать sql запросы в аннотации.
Mybatis поддерживает программное конфигурирование, можно с помощью аннотаций запихнуть весь запрос в интерфейсы. Но есть как минимум две причины по которой мне не очень нравиться использовать аннотации в Mybatis
- Сам sql становиться менее читаемым, аннотация становится мостроподобной. А в xml файле все аккуратно лежит, подсвечивается.
- В интерфейсе было проблематично указать ResultMap для запроса. Когда я только начал использовать аннотации, пришлось несколько раз продублировать ResultMap для каждого метода. Решение было не явным и в документации нигде не описано, что можно использовать уже объявленный ResultMap по имени метода в котором он был объявлен, с суффиксом “-void”(Если ResultMap был объявлен для метода getUsers, дальше данный ResultMap можно будет использовать по имени “getUsers-void”
Использовать или не использовать аннотации и отказываться от xml — это дело вкуса, мне не понравилось писать sql запросы в аннотации.
0
К мнению о том, что Hibernate оклеветали, я не компетентен и тп
От части в этом есть смысл. Знания и опыт по Hibernate — у мня не глубоки и подозревал что будет такое мнение. Начал я эту статью писать с того, что необходимо было определить что быстрее и целесообразно ли использовать MyBatis. Я проводил тестирование с помощью labs.carrotsearch.com/junit-benchmarks.html, да и опыта такого не было. Посмотрев на скудность данных и не было уверенности что я все делаю правильно — сравнивать две ORM без большого опыта использования обоих не верно, но на тех тестах которые мной были проведенный(выборка элементарных объектов со связью один к одному и один к многим), показали что Hibernate процентов на 10 уступает MyBatis со Spring (на аннотациях), а если использовать стандартные механизмы мапинга MyBatis то разрыв становится больше.
Использовать можно и две ORM на проекте — MyBatis для работы с сложными запросами, т.к. он обрабатывает запросы быстрее, а Hibernate использовать для CRUD(без Read) он прекрасно с этим справляется. — IMHO
Если есть опыт проведения сравнений ORM и других библиотек. прошу поделиться опытом.
От части в этом есть смысл. Знания и опыт по Hibernate — у мня не глубоки и подозревал что будет такое мнение. Начал я эту статью писать с того, что необходимо было определить что быстрее и целесообразно ли использовать MyBatis. Я проводил тестирование с помощью labs.carrotsearch.com/junit-benchmarks.html, да и опыта такого не было. Посмотрев на скудность данных и не было уверенности что я все делаю правильно — сравнивать две ORM без большого опыта использования обоих не верно, но на тех тестах которые мной были проведенный(выборка элементарных объектов со связью один к одному и один к многим), показали что Hibernate процентов на 10 уступает MyBatis со Spring (на аннотациях), а если использовать стандартные механизмы мапинга MyBatis то разрыв становится больше.
Использовать можно и две ORM на проекте — MyBatis для работы с сложными запросами, т.к. он обрабатывает запросы быстрее, а Hibernate использовать для CRUD(без Read) он прекрасно с этим справляется. — IMHO
Если есть опыт проведения сравнений ORM и других библиотек. прошу поделиться опытом.
0
Скажите пожалуйста, а в 2015 году Hibernate все еще желает mutable POJO's? Какие вообще Java ORM фрэймворки поддерживают immutability?
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
MyBatis как более быстрая альтернатива Hibernate