Главная страница

Git. Maven. Jdbc. Jpa и Hibernate 1 Что такое Maven Для чего нужен Как добавлять в проект библиотеки без него


Скачать 21.78 Kb.
НазваниеGit. Maven. Jdbc. Jpa и Hibernate 1 Что такое Maven Для чего нужен Как добавлять в проект библиотеки без него
Дата10.02.2023
Размер21.78 Kb.
Формат файлаdocx
Имя файлаJPA и Hibernate.docx
ТипДокументы
#930377


Git. Maven. JDBC. JPA и Hibernate
1) Что такое Maven? Для чего нужен? Как добавлять в проект библиотеки без него?
Maven — инструмент (фреймворк) для сборки и управления проектом. Это мультиплатформенный проект с открытым исходным кодом (написанный на Java), поддерживаемый Apache Software.

Он помогает на всех стадиях работы с проектом: от создания структуры проекта и подключения необходимых библиотек до развертывания продукта на сервере. На данный момент ни один серьезный проект не обходится без систем сборки и управления зависимостями, потому что вручную подключать и управлять зависимостями, а тем более транзитивными (зависимостями - зависимостей) зависимостями ОЧЕНЬ трудозатратно, аля не реально.

Основная фишка Maven, по сравнению, например с Ant-ом это Декларативное описание проекта (т.е. описание как должно быть, а не КАК ЭТО ДЕЛАТЬ)

Из чего состоит Maven?

  • POM. Project object model. Файл - модель проекта — в ней описано из чего проект состоит и как устроен его жизненный цикл

  • Репозитории артефактов (библиотек)

  • Утилиту mvn и плагины к ней (это собственно сам инструмент сборки и управления проектом)

Как добавлять в проект библиотеки без Maven?

В IntelliJ IDEA для добавления в проект: File -> Project Structure -> Project Settings -> Libraries -> +
В модуль проекта: File -> Project Structure -> Project Settings -> Modules -> Dependencies


2) Как добавить dependency в Maven? Для чего? Откуда они скачиваются?
Ни один серьезный проект не обходится без подключения сторонних библиотек и фреймворков.

Их так же называют “Зависимости” или dependency, а в терминологии maven - артефакты.

Чтобы подключить зависимость в maven, необходимо прописать ее идентификаторы в файле конфигурации pom.xml в разделе . В нем создать тег dependency в котором указать

GAV (groupId, artifactId, version), и необязательный classifier (когда в рамках одной версии есть библиотеки под разные JDK или ОС).


И области действия scope:
- compile (или если scope не указан): все стадии проекта

- provided: как compile, но без добавления в пакет

- system: как и provided, но maven не ищет артефакт в репе, а только по пути указанному в systemPath

- test: только на этапе тестирования

- runtime: только на стадии выполнения

- import: в зависимости типа pom, когда зависимости берутся из другого pom файла
У maven есть центральный (глобальный) репозиторий, который добавлен в конфигурацию по умолчанию. Это ресурс: mvnrepository.com
Помимо него, может быть корпоративный репозиторий команды разработчиков.
И все скачанные артефакты добавляются в локальный репозиторий на компе:
%userprofile%/.m2/repository
Адреса репозиториев maven указываются:
- в файле %userprofile%/.m2/settings.xml
- в разделе файла pom (имеет более высокий приоритет)
3) Основные фазы проекта под управлением Maven?
Процесс построения приложения называют жизненным циклом Maven-проекта, он состоит фаз (phase):

  1. clean — удаляются все скомпилированные файлы из каталога target (место, в котором сохраняются готовые артефакты);

  2. validate — идет проверка, вся ли информация доступна для сборки проекта;

  3. compile — компилируются файлы: из исходного кода (файлы .java) исполняемый байт код
    ( файл .class)

  4. test — выполняются тесты

  5. package — упаковка скомпилированных файлы (в jar, war, ear архив)

  6. verify — выполняются проверки для подтверждения готовности упакованного файла;

  7. install — копирование готового пакета (jar) в локальный репозиторий. Теперь он может использоваться другими проектами как внешняя библиотека;

  8. site создается документация проекта;

  9. deploy — собранный архив копируется в удаленный репозиторий.

Все фазы выполняются последовательно: нельзя запустить, скажем, четвертую фазы, пока не завершены фазы 1-3.
4) Что такое JDBC? Какие классы / интерфейсы относятся к JDBC?
JDBC (Java DataBase Connectivity) - стандарт взаимодействия Java-приложений с различными СУБД. Реализован в виде драйверов, предоставляемых производителями СУБД, а также классов и интерфейсов в пакетах java.SQL.* и javax.SQL.*, т.е. являются частью JDK.

Основные классы JDBC:
- Driver
- DriverManager, DataSource
- Connection
- Statement, PreparedStatement
- ResultSet
- SQLException
5) Для чего нужен DriverManager?
- DriverManager автоматически загружает драйверы, которые он нашел в CLASSPATH (до Java 6 (JDBC 4.0) нужно было это делать самостоятельно)
- и с помощью метода: DriverManager.getConnection(url, user, passwd), получает Connection (подключение)
6) Что такое Statement, PreparedStatement, CallableStatement?
Это виды объекта Statement (выражение), который используется для формирования запросов к БД.
Создание: connection.createStatement() connection.prepareStatement connection.prepareCall()

- Statement: используется для выполнения простых SQL запросов без, динамически параметров
- PrepareStatement, наоборот, используется когда есть необходимость динамической вставки входных параметров в запрос. Для этого в запросе, на месте параметров, вставляют знаки вопроса “?”, а затем, с помощью специальных методов-сеттеров (setInt(), setString()), подставляются вместо вопросов конкретные значения.
PreparedStatement “прекомпилирован” и использует кеширование, поэтому выполняется немного быстрее. Statement уязвим к SQL инъекциям, а PreparedStatement нет.

- CallableStatement: для выполнения хранимых в БД процедур с входными и выходными параметрами
Хранимые процедуры – это именованный набор операторов SQL хранящийся в базе данных.


Как вызвать хранимую процедуру?

без параметров → Statement

с входными параметрами → PreparedStatement

с входными и выходными параметрами → CallableStatement
7) Что такое sql-injection?
Это самый распространенный метод взлома web ресурсов и программ, работающих с базами данных. Он основан на внедрения дополнительного SQL-кода там, где это не ожидается.
Например? в форме для ввода данных пользователя дописывают: ; DROP TABLE Users. Затем из этих данных формируется запрос Statement, а точнее уже 2 запроса 1 из которых удаляет таблицу.

Как защититься от sql injection?
Формировать запрос только с помощью параметров. т.е. использовать PrepareStatement

8) Как осуществляется запрос к базе данных и обработка результатов?


Выполнение запросов осуществляется путем вызова 1 из 3х методов объекта Statement:

- executeQuery() (“выполнить запрос”): для выборки данных с помощью команды SELECT. Возвращает один объект ResultSet - набор значений, содержащий данные выборки.
- executeUpdate() (“выполнить обновление”) - для выполнения операторов INSERT, UPDATE или DELETE, а также для операторов DDL (Data Definition Language “язык описания данных”. Например, CREATE TABLE и DROP TABLE). Метод возвращает int - сколько записей было изменено;

- execute() – исполняется, для выполнения запросов, которые могут возвращать различные результаты.
Возвращает true, если первый результат содержит ResultSet и false, если первый результат - это количество модифицированных записей или результат отсутствует. Чтобы получить первый результат необходимо вызвать метод getResultSet() или getUpdateCount(). Остальные результаты доступны через вызов getMoreResults(), который при необходимости может быть произведен многократно.
9) Что такое ResultSet? Как с ним работать?
Объект хранит в себе результат запроса к базе данных - некий набор данных, внутри которого есть курсор, указывающий на один из элементов набора данных - текущую запись.
После запроса курсор-итератор устанавливается на позиции перед первой строкой. И чтобы переместиться к первой строке (и ко всем последующим) необходимо вызвать метод next().
Пока в наборе ResultSet есть доступные строки, метод next возвращает true. Поэтому часто используется конструкция: while (resultSet.next()) {

А содержание полей записи получают с помощью спец. геттеров: resultSet.getInt(“Номер или имя колонки”), .getString(“..”) и им подобных.
10) Рассказать про паттерн DAO
Суть паттерна DAO - отделить, абстрагировать взаимодействия с источником данных от бизнес-логики.
Вся логика работы с конкретным хранилищем данных скрывается в DAO классах.
А код отвечающий за бизнес-логику, “сервисы”, взаимодействует с этими классами, а не с хранилищем непосредственно.
DAO дает возможность отделить логику (интерфейс) от реализации. Создавать любое количество реализаций и переключаться между ними не беспокоя пользователей

11) Что такое ORM?
Object - Relational Mapping (“Объектно - реляционное отображение”) - концепция, подход к работе с БД, суть которой - работа с таблицами БД как с объектами. Т.е. мы описываем связь между классами и таблицами БД, производит т.н. Mapping. А затем работаем с java объектами, а не с таблицами БД.
12) Что такое JPA?
Java Persistence API это спецификация (документ), в котором описаны правила и API для реализации принципов ORM для Java. Ее можно скачать и почитать (на английском).

Сама Java не содержит реализации JPA, но есть множества реализаций данной спецификации от разных компаний (открытых и нет).

13) В чем разница между JPA и Hibernate? Как связаны эти понятия?
JPA это спецификация, которая только описывает правила и API для реализации принципов ORM, а Hibernate реализует эти описания, впрочем у Hibernate (как и у многих других реализаций JPA) есть дополнительные возможности, не описанные в JPA (и не переносимые на другие реализации JPA).
14) Что такое Hibernate?
Hibernate самая популярная (практически стандарт де-факто) открытая реализация спецификации JPA. А лучше сказать - “Соответствующая спецификации JPA”.
Это Java Framework обеспечивающий промежуточный уровень между базой данных и кодом Java. Позволяющей работать с сущностями Java не задумываясь как они хранятся в БД.

Основные возможности Hibernate:

1. Позволяет сократить объемы низкоуровневого шаблонного кода. Большинство SQL запросов уже реализованы - нужно просто использовать готовые методы.

2. Автоматическая генерация и обновление таблиц в БД
3. Содержит “под капотом” полезные “фишки” по работе с БД - кеширование, настройка получения взаимосвязанных сущностей и др.
15) Какие классы / интерфейсы относятся к JPA / Hibernate?
Классы / Интерфейсы JPA

Persistence - основная цель объекта - получить объект EntityManagerFactory с помощью статического метод createEntityManagerFactory
EntityManagerFactory
- фабричный класс (класс для создания объектов другого класса) для EntityManager. Он создает и управляет несколькими экземплярами EntityManager.
EntityManager - интерфейс, олицетворяющий соединение с базой данных и фабрика для Query
EntityTransaction - интерфейс, создается из EntityManager для выполнения транзакций
Query (“запрос”) - интерфейс, создается из EntityManager. Используется для выполнения запроса к БД.

Классы / Интерфейсы Hibernate

Configuration - используется для конфигурирования Hibernate и создания SessionFactory

SessionFactory – из него мы получаем объекты типа Session. Создается при старте приложения в количестве 1 штука для БД.. SessionFactory также кэширует информации для сокращения запросов к БД. Существуют несколько способов получить SessionFactory, один из которых: configuration.buildSessionFactory()

Session – основной интерфейс - мост между приложением и Hibernate, через который производятся все CRUD-операции с объектами-сущностями. Живет только в пределах логической транзакции.
Создается из SessionFactory: sessionFactory.openSession()

Также, интерфейс Session:
- реализует кэш первого уровня

- управляет транзакциями
- является фабрикой для Transaction
Transaction – короткоживущий объект, используемый для атомарных операций (операция, которая либо выполняется целиком, либо не выполняется вовсе). Это абстракция от JDBC.

Query (“запрос”) - объект использует HQL или SQL для выполнения запросов к БД:
session.createSQLQuery("DROP TABLE user").executeUpdate()
16) Основные аннотации Hibernate
1. @Entity: Объявляет класс сущностью

2. @Table: Определяет таблицу базы данных для данной сущности (схему БД)
Если не указана = имя_класса. Пример: @Table (name = "users_table")
3. @Column: Определяет колонку БД, в которой будут храниться значения поля.
Если не указана = имя_поля_класса. Пример: @Column (name = "user_name")
4. @Lob - указывает, что данный атрибут не имеет ограничений длины. Применяется совместно с аннотацией @Column
5. @Id: поля является идентификатором объектов этого класса, т.е. первичным ключом сущности

6. @GeneratedValue — данное поле будет генерироваться автоматически в БД.
Пример: @GeneratedValue(strategy = GenerationType.IDENTITY)

7. @Transient: исключить поле из хранения в БД. static и final поля всегда transient

8. @OneToOne, @ManyToOne, @OneToMany, @ManyToMany - аннотации для связи ассоциаций
9. @Version — управление версией. При изменении записи в БД будет увеличиваться на 1
10. @OrderBy — указание сортировки. При выборке записи будет отсортированы.
Пример: @OrderBy("firstName asc")

17) Чем HQL отличается от SQL?
HQL (Hibernate Query Language) - это объектно-ориентированный язык запросов, который очень похож на SQL. Главное различие языков HQL и SQL связано с тем, что SQL формирует запросы из наименований таблиц и столбцов в БД, а HQL работает с сущностями (классами) и их полями
HQL поддерживает такие понятия, как полиморфизм, наследование, ассоциация.
Hibernate транслирует HQL–запросы в понятные для БД SQL–запросы, которые и выполняют необходимые действия в БД
18) Что такое Query? Как передать в объект Query параметры?
Query (“запрос”) - объект, который использует HQL или SQL для выполнения запросов к БД:
в запросе можно использовать именованные параметры (:имя_параметра). А с помощью метода setParameter вставлять конкретные значения парметров в запрос:

session.createQuery("delete User where id = :id")

.setParameter("id", id)

.executeUpdate();


19) Какие можно устанавливать параметры в hbm2ddl, рассказать про них
hibernate.hbm2ddl.auto" - параметр настройки Hibernate, который определяет, что делать, с таблицами БД, если их нет или они отличаются о того что описано в классах-сущностях. Действия совершаются при инициализации SessionFactory. Возможные значения:
- create: создать таблицы заново, уничтожив предыдущие данные
- create-drop: аналогично create,только после закрытия SessionFactory - удалить таблицы с данными

- validate: проверить БД, если соответствия нет ,то выбросить исключение
- update: проверить БД и при необходимости обновить таблицы и сохранить данные

- none: ничего не делать с БД
20) Требования JPA к Entity-классам? Не менее пяти
1) Entity класс должен быть помечен аннотацией Entity или описан в XML файле конфигурации JPA

2) Entity класс должен содержать public или protected конструктор без аргументов (он также может иметь конструкторы с аргументами),

3) Entity класс должен быть классом верхнего уровня (top-level class),

4) Entity класс не может быть enum или интерфейсом,

5) Entity класс не может быть финальным классом (final class - от него нельзя наследоваться),

6) Entity класс не может содержать финальные поля или методы, если они участвуют в маппинге (persistent final methods or persistent final instance variables),

7) Если объект Entity класса будет передаваться по значению как отдельный объект (detached object), например через удаленный интерфейс (through a remote interface), он так же должен реализовывать Serializable интерфейс,

8) Поля Entity класс должны быть напрямую доступны только методам самого Entity класса и не должны быть напрямую доступны другим классам, использующим этот Entity. Такие классы должны обращаться только к методам (getter/setter методам или другим методам бизнес-логики в Entity классе),

9) Entity класс должен содержать первичный ключ, то есть атрибут или группу атрибутов которые уникально определяют запись этого Entity класса в базе данных

21) Жизненный цикл Entity в Hibernate
1. New (Transient): объект, который никогда не был связан с сессией Hibernate и не маппированный на какую нибудь строку в таблице БД

2. Managed (Persistent) — сущность связана со строкой в таблице БД (но физически может там пока отсутствовать)
3. Detached: — сущность связана с таблицей БД, но не управляется (или больше не управляется) Hibernate (persistence context был закрыт, либо экземпляр был удален из него)

4. Removed — объект создан, управляется H., но запланирован к удалению из БД
22) Кэш в Hibernate
Кэш - механизм ускорения работы с БД посредством уменьшения количества запросов к ней за счет использования более высокоскоростного временного уровня хранения.
В Hibernate есть несколько кэшей:
1. Кэш первого уровня - Session (либо EntityManager - ее аналог в JPA).
Кеш первого уровня работает в пределах сессии. Hibernate всегда по умолчанию использует этот кеш и отключить его нельзя. Как он работает: отслеживаемые сущности хранятся в Map: ключ - id, значение - сущность. Если сущность извлекается из БД, то она помещается в этот Map и хранится до закрытия сессии. А при повторном извлечении она берется уже из Map и запроса select к БД не будет.
2. Кэш второго уровня - SessionFactory
Кеш второго уровня работает для всех сессий, созданных из данной фабрики сессий. По умолчанию - выключен. Чтобы начать его использовать нужно:
- пометить классы, которые необходимо кэшировать, аннотацией @Cache с выбранной стратегией кэширования для класса (usage = CacheConcurrencyStrategy.READ_WRITE).
Или указать настройку, которая по умолчанию ой все классы будут по умолчанию кешироваться

- в файле конфигурации добавить параметр: use_second_level_cache: true и указать провайдер кэша.

Сам Hibernate не реализует кеширование второго уровня, а дает возможность подключить внешнюю совместимую реализацию. Выбор провайдера зависит от стратегии, которые он может поддерживать: Read-only, Read-write, Nonstrict-read-write (нестрогое чтение-запись: чтение и неконкурентное обновление), Transactional (изменения в кэше и изменения в БД, записываются в одной транзакции):
EHCache (Easy Hibernate Cache), OSCache (Open Symphony Cache), Swarm Cache, JBoss Tree Cache.

3. Кэш запросов (Query Cache)
Сохраняет запросы и их результаты. Дает повышение производительности при многократном повторении одинаковых запросов. Но несет накладные расходы по производительности, поэтому по умолчанию выключен. Чтобы его включить, нужно:
- указать в конфигурации: hibernate.cache.use_query_cache = “true”
- настроить таймаут региона кэширования
- разрешать кэширование запросов для конкретных запросов


23) Что такое Git
Git (дословно “мерзавец”) это самая популярная, открытая распределенная система контроля версий, которая даёт возможность разработчикам отслеживать изменения в файлах и работать совместно с другими разработчиками. Был создан Линусом Торвальдсом для разработки ядра Linux в 2005 году.
Она не единственная, есть еще: SVN, Mercurial

24) Индекс в Git
Индекс в Git — это промежуточная область между рабочей директории и репозиторием.

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

Индекс это возможность сформировать текущий коммит именно из тех файлов, которые нам нужны, оставил для другого коммита другие параллельные правки.
24) Возможные состояния файла в Git
- Не отслеживаемый
- Отслеживаемый: измененный / не измененный
- Индексированный (измененный, добавленный в индекс)
- Зафиксированный (сохраненный в локальном репозитории)
25) Как отменить последний коммит?
Командой git reset. У нее 3 варианта:

1. git reset HEAD

1 (аналогично: git reset --mixed HEAD1). Режим по умолчанию.
HEAD передвинется на 1 коммит назад, index сбросится. Изменения останутся в рабочем каталоге

2. git reset --soft HEAD1

HEAD передвинется на 1 коммит назад, изменения останутся в index и в рабочем каталоге

3. git reset --hard HEAD1
HEAD передвинется на 1 коммит назад, index сбросится. Изменения в рабочем каталоге удалятся

* HEAD1 - один коммит до HEAD, т.е. на 1 коммит назад
26) Как отменить «git add» до коммита?
Т.е. удалить файл из индекса:

git reset имя_файла
27 Отличия между командами merge и rebase
Git Merge и Rebase преследуют одну и ту же цель интегрируют изменения из одной ветки в другую.
Но принципы работы разные:

merge (слияние) - создает коммит слияния. И после merge остаются три удобных коммита. Для продолжения работы можно использовать первую или вторую нить, или объединенную. Т.е. сохраняется история. Минусы - загрязняется история множеством коммитов

rebase (перемещение) - работая в отдельной ветке, желая подтянуть изменения с основной, делаем rebase с master и наша ветка окажется после всех коммитов ветки master. Т.е. git переместит все коммиты вашей ветки на последний коммит ветки master. Т.е. это команда переписывает историю и не будет видно когда делали обновления с основной ветки.


Не ответил на следующие вопросы. На следующем ревью буду их отвечать - тогда дополню этот конспект
1. рассказать про ACID (свойства транзакции)

2. рассказать про @Column (какие параметры)

3. рассказать про каждый GeneratedType (типы генерации @GeneratedValue)

4. Жизненный цикл Entity (вещь оказывается важная. Нужно понимать что на каждой фазе делается с сущностью)




написать администратору сайта