Инструменты разработчика на Java: Spring, Hibernate, MyBatis и другие

В статье наши Java-разработчики рассказали про основные фреймворки и библиотеки, которые пригодятся в работе как тем, кто только приступает к изучению языка или уже давно разрабатывает на нем.

Spring Framework / ярослав

Что это такое

Начнем с главного: что такое Spring Framework? Это сервер приложений, то есть платформа (фреймворк), на основе которой разрабатываются приложения и которая предоставляет интерфейс для взаимодействия с внешними ресурсами, повышая уровень абстракции. Это позволяет разработчику приложения не задумываться над техническими деталями и сфокусироваться только на бизнес-логике.

Простым языком: есть сервер приложений — с одной стороны он работает с БД, с другой с фронтом, по середине ваше приложение, которое с помощью удобного интерфейса получает запросы от фронта и что-то пишет/читает из БД.

В каком случае использовать

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

Основное выгодное отличие Spring в том, что можно использовать библиотеку Spring Data. Это крутая абстракция над Hibernate, которая значительно упрощает жизнь разработчика: быстрее и удобнее аналогичных решений. К тому же у нее есть несколько киллер фич. Первая — управления транзакциями через аннотации и область видимости метода. Вторая — работа с БД через «репозитории», что позволяет за 5 минут создать интерфейс с правильно названными методами, а дальше Spring сгенерирует реализацию для CRUD-операций с данными.

Когда не подходит

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

Альтернативы

Помимо Spring есть и другие сервера приложений. Например, WildFly от RedHat, WebSphere от IBM, GlassFish, поддерживаемый Oracle, и тому подобное. Их всех можно поделить на сам Spring и реализации JakartaEE.

JakartaEE — это спецификация, которая дает архитектурные рекомендации по тому, как осуществлять взаимодействия приложения, например, с БД. Spring тоже можно косвенно отнести к одной из таких реализаций, но он реализует те же вещи по-своему, далеко не всегда следуя этим рекомендациям.

Советы в работе

В работе с Spring я бы посоветовал использовать Spring Boot. Это автоконфигурация для Spring, которая позволяет буквально в 3 клика запустить приложение без дополнительных настроек. Если нужно, она с легкостью перекрывается ручной конфигурацией, поэтому дилеммы «использовать или нет» не возникает.

Если вы хотите изучить все тонкости работы с фреймворком, рекомендуем наш курс разработки на Spring. Старт занятий 20 сентября, обучение бесплатное. Программа и регистрация по ссылке.

Hibernate / Иван 

Что это такое

Hibernate — библиотека для Java, предназначенная для решение задач объектно-реляционного отображения. В своем начальном выпуске, в раннем 2001 году, Hibernate решал задачи ORM фреймворка, не имея даже реализации такого инструмента как Criteria API. Как бы то ни было Hibernate является реализацией спецификации JPA, которая в свою очередь является частью набора спецификаций Java EE (в современной манере Jakarta EE).

На текущее время, Hibernate решает не только задачи объектно-реляционного отображения (как и от SQL к Java-типам, так и наоборот), но и расширяет множество иных возможностей. Например:

  • Использование в приложениях с Java SE, Jakarta EE, Enterprise OSGi;
  • Доступность и легкость описания сущностей, связанных с таблицами в ООП стилистике;
  • Возможность использования наследования, полиморфизма, абстракции и инкапсуляции, а также коллекций и так далее без необходимости что-то дополнительно подключать и настраивать:
  • Высокая продуктивность. Поддержка так называемой «ленивой» инициализации, множество иных стратегий выборки данных, поддержка блокировок, автоматического версионирования и генерации временных меток;
  • Масштабируемость. Позволяет безболезненно применяться в кластере серверов, в случае расширения архитектуры и так далее.

В каком случае использовать

В основе своей для разработчика Hibernate решает проблему рутинного описания собственной логики работы с SQL, однако при всем при этом, он не ограничивает вас от использования всех мощностей SQL.

Hibernate прекрасно подходит для использования в бизнес-слое приложения, избавляя от необходимости использования хранимых процедур или написания нативного SQL. Поддерживает автоматический маппинг и генерацию сущностей (Entity), представляющих собой объектное отображение реляционных таблиц. Собственно, Hibernate может применяться не только для для реляционных СУБД, но и NoSQL.

Так называемый Hibernate OGM (Object/Grid Maper — инструмент для работы с NoSQL базами) может применятся с такими NoSQL, как Cassandra, CouchDB, EhCache, Apache Ignite, и даже Redis. В том случае, если вы используете Spring Framework, он предоставляет возможность использовать Spring Data для NoSQL (Spring Data Redis, Mongo, Cassandra и другие).

Как и следует ожидать, доступ к NoSQL-базам данных осуществляется с помощью все тех же инструментов, что и с реляционными базами — в них входит концепция «репозиторий» и derived query. Однако следует учитывать, что применять JPA-концепции, относящиеся к принципам работы с реляционными СУБД, на концепцию NoSQL — очень ресурсозатратно и не всегда оправдывает такую необходимость.

Часто NoSQL применяют для быстрых и легковесных операций в том числе и распределенных операций, в таких случая важна скорость работы, чего JPA-спецификация не может гарантировать для работы с NoSQL-базами данных ввиду ее специфики (потому как JPA specification написана исключительно для реляционных СУБД — RDBMS). В первую очередь, инструменты подобные Hibernate OGM и Spring Data предназначены для удобства разработки и легкого перехода с одной базы данных на другую, даже если этот переход с SQL на NoSQL. Более подробнее ознакомиться с семейством Spring Data можно на их сайте.

Помимо всего прочего, часто Hibernate используют в связке с Spring Data JPA, понятное дело, если ваш проект — это spring-приложение. Это очень удобная и сильная связка. Spring Data JPA представляет собой слой абстракции базы данных, при этом предоставляет инструменты генерации запросов по имени метода (derived query), применяя концепцию «репозиторий» вместо устаревшей «DAO». Со стороны Spring Data JPA применяются различного рода «репозитории» — интерфейсы, предоставляющие базовые методы работы с БД, derived query, modifying query, JPQL, Criteria Api динамическое построение запросов и их выполнение в рантайме (runtime), в довесок к ним Hibernate предоставляет свой язык написания запросов HQL, а также Entity Graphs, инструменты работы с транзакциями и так далее. Так что их связка — это сила и мощь классической разработки.

Когда не подходит

Как было сказано выше, Hibernate решает проблему рутинного описания, и ORM-отображения. Отбросив весь пафос в сторону, скажем прямо, Hibernate за вас формирует запросы к базе. И так иногда получается, что запросы эти, прямо скажем, не очень. Часто возникают проблема из-за незнания специфик работы фреймворка, появляются просадки в скорости работы приложения, и хуже того, утечки памяти (например, известная проблема Eager fetch).

Так что, если вам важна скорость работы с базой, Hibernate станет не всегда вашим выбором, с учетом его persistence context, L2 cache, transaction assistance и прочими удобствами и излишествами.

Альтернативы

В качестве альтернатив можно привести безусловно MyBatis, EclipseLink, DataNucleus, iBATIS. Так или иначе, выбор инструмента зависит от вас и ваших потребностей. Можете хоть на чистом JDBC писать. Кстати, вот один из примеров, где Hibernate не может использоваться — всем известный и модно-молодежный ClickHouse не может взаимодействовать с Hibernate. Да и в общем-то, ClickHouse только с Native JDBC и работает, а лепят его, куда попало.

Советы в работе

Однозначно современный Hibernate настраивается чуть ли не из коробки: подключил и радуйся. Но, приступая к работе, важно понимать — это огромный монолит, который развивался на протяжении 20-ти лет, и следует отнестись к нему уважительно и почтить его хотя бы чтением спецификации JPA.

Необходимо знать принципы работы транзакций, ACID-принципы, принципы построения запросов внутри Hibernate, каким образом он взаимодействует с БД, что такое persistence context, что такое проблема n+1 и все вот это вот. Да и не мешало бы хоть немного знать сам SQL.

MyBatis / Ангелина

Что это такое

MyBatis — это фреймворк для взаимодействия с базой данных в Java-приложении. В отличие от своих альтернатив (например, Hibernate), он не реализует спецификации JPA. Также отличается сам маппинг объектов: например, Hibernate представляет таблицы в виде сущностей и при запросе к базе данных сам генерирует SQL-запрос, MyBatis же мапится не на таблицы, а на SQL-запросы.

Для начала работы с MyBatis необходимо определить объект интерфейс-маппер и xml-документ с описанием маппинга, где указывается SQL-запрос и типы получаемых и возвращаемых данных. MyBatis преобразует вызов метода интерфейса в запрос к базе, а результат запроса преобразуется в результат метода. Xml-файл маппинга помимо описания запроса может содержать логику используя компоненты: if, when, where, foreach и др. Вместо xml-файла MyBatis также поддерживает специальные аннотации:

  • @Insert, @Select, @Update, @Delete (sql-запрос, который должен быть выполнен при вызове метода, обозначенного одной из этих аннотаций);
  • @Param (указание параметров запроса);
  • @Result и @Results (описывают результат запроса, который должен вернуться после вызова);
  • @One и @Many (описание связей между таблицами, сопоставляя объект с коллекцией, объект с объектом).

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

В каком случае использовать

При разработке стоит отдать преимущество MyBatis, в случаях:

  • Если в приложении используются сложные запросы и связи;
  • Когда в приложении имеется достаточно много различных сложных выборок из нескольких таблиц;
  • Если в приложении в основном происходит работа с хранимыми процедурами;
  • Если возникает необходимость написать свой ORM;

Также MyBatis более удобен в случае использования ненормализованной базы данных.

Когда не подходит

  • Если в проекте много простых сущностей без сложных связей;
  • Если использование автоматического генерирования запросов к базе оправдано;
  • Если есть необходимость в создании и изменении схемы.

Альтернативы

Основной альтернативой является, конечно же, Hibernate. Также можно назвать:

  • Ebean — ORM-фреймворк, который как и MyBatis прост и понятен в изучении. Сущности описываются знакомыми аннотациями JPA, а запросы к БД выполняются посредством вызова методов объекта Ebean.
  • EclipseLink — эталонная реализация JPA, во многом схожая с Hibernate. Помимо JPA EclipseLink поддерживает ряд других стандартов и имеет особенности, которых нет в Hibernate (например, аннотации @Struct и @ReadOnly).
  • Reladomo — также ORM-фреймворк, ключевая особенность которого состоит в генерации Java-классов из xml-описания структуры БД. Взаимодействие с БД происходит посредством вызова методов сгенерированных классов.
  • Apache Cayenne — среда, которая позволяет генерировать ORM-объекты с помощью программы-конструктора. Создание, удаление, сохранение объектов в БД и более сложные запросы, происходят с помощью вызова методов класса DataContext.

Советы в работе

Официальная документация MyBatis

Простое руководство для начала работы с MyBatis

Научная статья «Сравнительный анализ моделей работы с данными в Java-приложениях»

JSF / Павел

Что это такое

JSF (Java Server Faces) — это Java-фреймворк, который предназначен для разработки веб-интерфейсов пользователя. JSF позволяет проектировать пользовательский интерфейс на основе повторно используемых компонентов. Разработчик пишет xhtml-шаблоны, в которых при помощи специального языка скриптов может обращаться к атрибутам java-объектов. Шаблоны состоят из переиспользуемых компонентов, JSF из коробки предоставляет богатую библиотеку таких компонентов, но также есть возможность разрабатывать свои.

Основные преимущества JSF:

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

В каком случае использовать

JSF и фреймворки, базирующиеся на JSF (например, PrimeFaces и MyFaces), обычно используются в ситуации, когда необходимо реализовать монолит на Java, где и бизнес-логика, и представление пользователя будет в одном приложении. Такие ситуации возникают, когда невозможно или нет необходимости разрабатывать отдельное frontend-приложение для взаимодействия с пользователем. Обычно это корпоративные порталы, где красота интерфейса не так важна, а важнее функциональность, надежность и сопровождаемость.

Использование JSF предполагает использование готовых компонентов, поэтому позволяет относительно просто реализовывать сложные интерфейсные вещи — диаграммы, графики, интерактивные таблицы. Реализовать подобное при помощи JS-фреймворков будет сложнее как с точки зрения взаимодействия с бэкендом, так и с точки зрения реализации на фронтенде. Бэкенд и фронтенд в данном случае пишется одной командой разработчиков, приложение работает на одном сервере приложений и изменения в бизнес-логике и в пользовательском интерфейсе реализуются и выпускаются согласовано.

В основном, JSF используется при разработке корпоративных и государственных порталов. Также JSF используется в рамках стека технологий Oracle ADF, следовательно, JSF используется на портале поддержки Oracle и web-интерфейсы Oracle BPM Suite.

Когда не подходит

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

Альтернативы

Основная альтернатива — не использовать JSF вовсе, а писать полноценное фронтенд-приложение.

Если речь идет о монолите на Java, то в качестве альтернатив будут выступать фреймворки PrimeFaces и MyFaces, которые сами основываются на JSF и предоставляют дополнительные библиотеки JSF-компонентов. Также есть вариант разработки приложения при помощи фреймворка Play.

Советы в работе

Самое главное, разобраться с жизненным циклом запроса, без этого использование JSF будет неэффективным. Может так получиться, что какие-то сложные вычисления или запросы в БД будут выполняться после обновления каждого элемента страницы.

Необходимо строго придерживаться паттерна MVC и четко разделять бизнес-логику и логику отображения — в противном случае код будет очень тяжело сопровождать в дальнейшем. Также необходимо определиться с одной библиотекой тегов и использовать только ее.

PrimeFaces / Ярослав

Что это такое

PrimeFaces — это OpenSource-библиотека компонентов для приложения на основе JSF, о котором уже говорили выше. PrimeFaces дополняет стандартный набор компонентов JSF, из которых можно собрать простой фронт для приложения.

В каком случае использовать

PrimeFaces хорошо подходит для создания простого UI с выводом информации в графики, таблицы и так далее. Например, для создания админок, новостных сайтов или страничек статистики.

У библиотеки есть отличный сайт — на нем можно посмотреть примеры того, что может получится с использованием этого фреймворка. А на этой странице можно узнать, какие компании используют PrimeFaces.

Когда не подходит

PrimeFaces не поможет, когда требуется создать сложный специфический фронт с множеством разнообразных интерактивных элементов. С наращиванием функционала код будет становится очень сложным для поддерживания. В таком случае вместо JSF лучше использовать JS-фреймворки (Angular или React). Тогда разработка UI уходит на фронт, а бэк превращается в RESTful-приложение.

Если требуется генератор простого html (например, для генерации email сообщения), то лучше посмотреть в сторону генераторов шаблонов. Они легче, проще и лучше подойдут для такой задачи.

Альтернативы

У PrimeFaces есть несколько альтернатив. Одни из них — набор похожих по смыслу библиотек (IceFaces, RichFaces и так далее). Они все также являются дополнениями к JSF и содержат набор готовых компонентов. Тем не менее, я бы рекомендовал использовать PrimeFaces, потому что он единственный, кто все еще получает обновления.

Есть еще альтернативы среди генераторов шаблонов (Thymeleaf, Mustache), но это скорее альтернатива JSF, а не PrimeFaces.

Советы в работе

Использовать тот фреймворк, который подходит под конкретно вашу задачу. И если выбор встает из того, выбрать ли PrimeFaces или RichFaces, Thymeleaf или Mustache, а четкого перевеса в сторону одного из решений нет, то можно выбрать то, что лучше знаешь и больше нравится :)

В итоге

Итак, вот основные фреймворки и библиотеки, которые пригодятся в работе программиста на Java — Spring Framework, Hibernate, MyBatis, JSF и PrimeFaces.

Spring Framework — это фреймворк, на основе которого разрабатываются приложения. Лучше всего подходит для небольших приложений или приложений на микросервисной архитектуре. Основной альтернативой является JakartaEE (WildFly, WebSphere, GlassFish).

Hibernate — библиотека для Java, предназначенная для связывания ООП и реляционной базы данных. Hibernate прекрасно подходит для использования в бизнес-слое приложения, избавляя от необходимости использования хранимых процедур или написания нативного SQL. В качестве альтернатив можно привести MyBatis, EclipseLink, DataNucleus, iBATIS.

MyBatis — это фреймворк для взаимодействия с базой данных в Java-приложении. С ним работают в тех случаях, когда в приложении используются сложные запросы и связи, имеется достаточно много различных сложных выборок из нескольких таблиц, происходит работа с хранимыми процедурами или возникает необходимость написать свой ORM. Основной альтернативой является Hibernate.

JSF — это Java-фреймворк, который предназначен для разработки веб-интерфейсов пользователя. JSF позволяет проектировать пользовательский интерфейс на основе повторно используемых компонентов. Основная альтернатива — не использовать JSF вовсе, а писать полноценное фронтенд-приложение.

PrimeFaces — это OpenSource-библиотека компонентов для приложения на основе JSF. PrimeFaces хорошо подходит для создания простого UI с выводом информации в графики, таблицы и тому подобное. Альтернатива — набор похожих по смыслу библиотек (IceFaces, RichFaces и тому подобное).

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

Изучайте, программируйте и ищите новые :)