codefest 2013. Зиновьев А. — mybatis & hibernate, давайте жить...

37
Зиновьев Алексей, Тамтэк MyBatis & Hibernate, давайте жить дружно

Upload: codefest

Post on 22-Jun-2015

345 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Зиновьев Алексей,Тамтэк

MyBatis & Hibernate, давайте жить дружно

Page 2: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

● аспирант ОмГУ, математик;● Java-девелопер в компании Thumbtack;● занимаюсь теорией графов, прогнозированием

пробок, исследованием транспортных систем;● большой фанат различных Maps API;● лидер GDG Omsk.

О себе

Page 3: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

О чем этот доклад

Тот же Ibatis, только в профиль

Page 4: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Тут будем разминаться

● Кто хоть раз использовал ORM ?

Page 5: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Тут будем разминаться

● Кто хоть раз использовал ORM ? ● Кто хоть раз использовал Hibernate ?

Page 6: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Тут будем разминаться

● Кто хоть раз использовал ORM ?● Кто хоть раз использовал Hibernate ?● Кто хоть раз использовал MyBatis ?

Page 7: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Тут будем разминаться

● Кто хоть раз использовал ORM ?● Кто хоть раз использовал Hibernate ?● Кто хоть раз использовал MyBatis ?● Кто хоть раз плевал на все и писал

свой QueryEnterpriseSQLBuilder ?

Page 8: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Жил-был один проект

● Как бы плагин к одной известной базе

● JDBC - лапша в коде● Одна база readonly● Требуется аналитическая

отчетность● Немного Hibernate для пары

таблиц в собственной базе● Сборка отчетов в коде

Page 9: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Почему на проекте появился Hibernate

● несколько удобных сущностей, для которых были на первых порах нужны только CRUD - операции;

● сущности были древовидными, хороши для HQL;● легкая разметка аннотациями существующей

модели;● Criteria API для недругов SQL;● архитектору просто нравился Hibernate.

Page 10: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Волшебная палочка Hiber?

● Пасует в сложных запросах

● Сложные связи между таблицами превращаются в неожиданные объекты

● Плох для больших выборок данных

● Не прост в изучении● Необъяснимые падения

производительности

Page 11: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Шло время, изменялись требования ...

● Росло финансирование● На проекте менялись

программисты● Появились и были

сформулированы цели● Росло число методов в

DAO - классе (sic!)● Код переполнялся

низкоуровневыми List<List<List<?>>>

Page 12: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Цели

● Производительность программиста

● Легко расширяемый функционал

● Быстрая работа с БД● Кэширование● Уход от сборки данных

отчета в коде● Минимальная скорость

добавления одного отчета

Page 13: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

MyBatis Mac'iBatis

● конфигурирование в коде или в специальном файле;

● выгрузка результата запроса в объект;● стандартный кэш или собственный;● динамическая безопасная сборка SQL (целых

секций) в зависимости от параметров, позволяет сократить число запросов;

● возможность использования аннотаций или map - файлов (аннотации менее популярны).

Page 14: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 15: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 16: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 17: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 18: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 19: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 20: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 21: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!
Page 22: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Обобщим?

Page 23: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

App case #1

● Новый проект● Часто меняющаяся схема

БД● Неясная иерархия

объектов● Пока нечего

анализировать● Много write, мало read● No JOINs

Page 24: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Ну вы поняли, что это не наш пациент ...

Page 25: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

App case #2

● Есть давно рабочая БД● Нет контроля над схемой● Сбор аналитики,

построение отчетов● Хранимые процедуры● Много read● Нужны JOINs● Приложение для

работающего бизнеса

Page 26: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Для чего удобен Hibernate

● Нужно что-то кэшировать● Хорош в работе с

деревьями объектов● Множество CRUD -

операций● Есть стабильные, ясные

сущности● Контроль над схемой БД● Создание прототипа

Page 27: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Для чего удобен JDBC

● Критичные по производительности места

● Сложные запросы, получающие простые ответы

● Для обучения новичков● Мсье знает толк...

Page 28: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Для чего удобен MyBatis

● хранения и разработки сложных SQL - запросов;

● для замены JDBC;● для нетривиальных

сущностей, которые собираются из нескольких таблиц;

● для урезанных версий сущностей;

● для динамических семейств SQL.

Page 29: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Проблемы интеграции

● Люди испытывают разные чувства к SQL

● Спорные ситуации, передел сфер влияния

● Мало удачных примеров для MyBatis в сети

● Теперь надо учить две технологии вместо одной?

Page 30: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Процесс внедрения

● Общественный договор● Документирование сфер

влияния● Диаграммы dev-процессов

(как на проекте добавить новый отчет)

● Чувство прекрасного

Page 31: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Добавление нового отчета (пример dev-процесса)

● добавляем 1 запрос типа select;● добавляем 1 Result map (не обязательно);● добавляем 1 класс, соответствующий строке

отчета;● добавляем 1 функцию в DAO, получающюю

список ResultMap объектов по псевдониму.

Эта функция возвращает множество строк отчета. Изменение логики запроса приводит лишь к изменению SQL - запроса.

Page 32: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Простые шаги

Следует начать с того, чтобы промаркировать таблицы данных следующим образом:● READONLY - контент, который поставляется нам со

стороны;● REPORT - таблицы, поставляющие данные для

аналитической отчетности;● ENTITY - удобные для понимания сущности,

которые нужно будет редактировать; ● PART OF ENTITY <ENTITY_NAME> - часть удобной

сущности ( в скобках указана сущность).

Page 33: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Простые шагиВсе таблицы с меткой ENTITY можно прогнать сквозь мясорубку хибернейтовского Reverse Engineering, создав по ним классы - сущности.

Для сущностей распавшихся по таблицам, с меткой PART OF ENTITY <ENTITY_NAME> мы руками создаем классы по стандарту JPA или пишем map - файл для Hibernate сами, или определяем foreign keys (если это возможно в БД) и полагаемся на Reverse Engineering.

Для READONLY и REPORT стоит написать запрос, который на выходе получает список строк отчета, которые маппятся в коллекцию (List) объектов типа "строка отчета"

Page 34: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Hibernate + MyBatis

● Могут жить на одном проекте

● Строгое разграничение сфер

● Большие отчеты - MyBatis● Entity - в Hibernate● Высокая скорость

разработки● ORM на проекте - шаг к

MVC

Page 36: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Да пребудет с вами DAO!

Page 37: CodeFest 2013. Зиновьев А. — MyBatis & Hibernate, давайте жить дружно!

Вопросы?

Зиновьев Алексей,Тамтэк[email protected]