2. Java Data Base Connectivity (JDBC), Maven Flashcards
Что такое jdbc? Как он связан с полиморфизмом?
Java Database Connectivity – это стандартный API для независимого соединения языка программирования Java с различными базами данных (далее – БД).
JDBC решает следующие задачи:
Создание соединения с БД.
Создание SQL выражений.
Выполнение SQL – запросов.
Просмотр и модификация полученных записей.
Если говорить в целом, то JDBC – это библиотека, которая обеспечивает целый набор интерфейсов для доступа к различным БД.
Для доступа к каждой конкретной БД необходим специальный JDBC – драйвер, который является адаптером Java – приложения к БД.
Что такое Driver?
Драйвер (Driver)
Этот интерфейс отвечает за связь с БД. Работать с ним нам приходится крайне редко. Вместо этого мы чаще используем объекты DriverManager, которые управляют объектами этого типа.
Что такое Connection?
Соединение (Connection)
Этот интерфейс обеспечивает нас методами для работы с БД. Все взаимодействия с БД происходят исключительно через Connection.
Что такое Statement? какие еще есть варианты?
Что такое PreparedStatement?
Что такое ResultSet?
Результат (ResultSet)
Экземпляры этого интерфейса содержат данные, которые были получены в результате выполнения SQL – запроса. Он работает как итератор и “пробегает” по полученным данным.
Для чего нужен Maven?
Системы сборки проектов
Мавен - это инструмент для сборки Java проекта: компиляции, создания jar, создания дистрибутива программы, генерации документации. Простые проекты можно собрать в командной строке. Если собирать большие проекты с командной строки, то команда для сборки будет очень длинной, поэтому её иногда записывают в bat/sh скрипт. Но такие скрипты зависят от платформы. Для того чтобы избавиться от этой зависимости и упростить написание скрипта используют инструменты для сборки проекта.
Для платформы Java существуют два основных инструмента для сборки: Ant и Maven.
Основные преимущества Maven
- Независимость от OS. Сборка проекта происходит в любой операционной системе. Файл проекта один и тот же.
- Управление зависимостями. Редко какие проекты пишутся без использования сторонних библиотек(зависимостей). Эти сторонние библиотеки зачастую тоже в свою очередь используют библиотеки разных версий. Мавен позволяет управлять такими сложными зависимостями. Что позволяет разрешать конфликты версий и в случае необходимости легко переходить на новые версии библиотек.
- Возможна сборка из командной строки. Такое часто необходимо для автоматической сборки проекта на сервере (Continuous Integration).
- Хорошая интеграция со средами разработки. Основные среды разработки на java легко открывают проекты которые собираются c помощью maven. При этом зачастую проект настраивать не нужно - он сразу готов к дальнейшей разработке.
Как следствие - если с проектом работают в разных средах разработки, то maven удобный способ хранения настроек. Настроечный файл среды разработки и для сборки один и тот же - меньше дублирования данных и соответственно ошибок.
- Декларативное описание проекта.
Как можно работать с зависимостями в Maven?
Apache Maven — отличная штука, для управления сторонними зависимостями в вашем проекте. Достаточно сказать ему, какой артефакт вам нужен и всё остальное Maven сделает сам.
Добавление зависимостей
Все зависимости перечисляются в секции , одна за одной, в любом порядке.
junit junit 3.8.2 test
Например, в архетипе quickstart автоматически добавляется библиотека JUnit3. Если мы хотим перейти с JUnit3 на JUnit4, то достаточно изменить версию в зависимости:
junit junit 4.12 test
Чтобы добавить какую-нибудь другую зависимость, например TestNG, надо знать её maven координаты, то есть группу, артефакт и версию:
<code></code>
junit junit 4.12 test <b> org.testng testng 6.11 test </b>
</code>
Переменные в maven
Перед тем как продолжить добавлять зависимости, нужно сделать шаг к переменным в maven. Maven позволяет задавать переменные (а сам задаёт ещё больше), значения которых впоследствии можно использовать где угодно:
1.2.3
${myvar}
И в тег будет подставлено значение «1.2.3».
Те же самые переменные можно и нужно использовать, чтобы задавать версию зависимости отдельно от самой зависимости.
Области видимости
Вы могли заметить, что описания зависимостей для JUnit и Spring framework отличаются параметром scope, он же — область видимости. Scope позволяет указать maven’у когда и для чего вам нужна эта зависимость. Всего существует шесть областей видимости:
compile — область видимости по умолчанию. Зависимости с этим scope будут доступны и во время сборки и во время тестирования и их даже добавят в конечный пакет, чтобы они были доступны и во время исполнения. Более того, maven распространит их дальше и сделает доступными в зависимых пакетах.
provided — Почти как compile, но в пакет зависимость добавлена не будет. Предполагается что данные библиотеки будут предоставлены средой выполнения, например J2EE контейнером. Каноничный пример такой зависимости — J2EE API, конкретная реализация которых предоставляется контейнером J2EE.
runtime — антипод provided. Означает зависимость, которая требуется для исполнения/тестирования кода, но не для его сборки. Зависимости из этого
scope так же будут добавлены в пакет.
test — зависимости, которые нужны только и исключительно для тестов. Как JUnit из примера выше.
system — зависимость которая присутствует в среде Java всегда, тем или иным путём. Maven не будет пытаться предоставить этот артефакт или класть
его в пакет итд.
import — использутся для импорта зависимостей из других артефактов и управлением зависимостями в сложных пакетах, состоящих из нескольких артефактов.
org.projectlombok lombok ${lombok.annotations} provided org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} runtime junit junit ${junit.version} test
- org.projectlombok:lombok — утилита для генерации кода, работающая только во время компиляции. Поэтому у неё scope — provided
- org.slf4j:slf4j-api — Фронтенд для ведения логов. Мой проект с ним собирается, тестируется и работает. Scope Slf4j — compile.
- org.slf4j:slf4j-log4j12 — Реализация Slf4j поверх log4j. Мой проект не ссылается напрямую на эту библиотеку и использует её только посредством Slf4j, поэтому её Scope — runtime.
- junit:junit — Фреймворк юнит-тестирования. Очевидно что он нужен только во время исполнения тестов и из-за этого его scope — test.
Чтобы просмотреть, какие именно зависимости (с учётом их зависимостей) имеет ваш артефакт, можно попросить maven нарисовать дерево зависимостей:
$ mvn dependency:tree
[INFO] Scanning for projects…
[INFO] Searching repository for plugin with prefix: ‘dependency’.
[INFO] ————————————————————————
[INFO] Building exclude
[INFO] task-segment: [dependency:tree]
[INFO] ————————————————————————
[INFO] [dependency:tree {execution: default-cli}]
[INFO] ru.morningjava.maven:exclude:jar:1.0
[INFO] +- junit:junit:jar:4.10:test
[INFO] | - org.hamcrest:hamcrest-core:jar:1.1:test
Или тоже самое, но с подробностями:
$ mvn dependency:tree -Dverbose=true
Какие цели есть в Maven? Чем отличается deploy от install?
Задача (goal) – это специальная задача, которая относится к сборке проекта и его управлению. Она может привязываться как к нескольким фазам, так и ни к одной. Задача, которая не привязана ни к одной фазе, может быть запущена вне фаз сборки с помощью прямого вызова.
Порядок выполнения зависит от порядка вызова целей и фаз.
Задача clean Maven (clean:clean) привязывается к фазе clean в жизненном цикле сборки. Эта задача удаляет ввод сборки путём удаления директории сборки. Таким образом, когда выполняется команда mvn clean, Maven удаляет директорию сборки (target)
package Преобразует скомпилированный код и пакет в дистрибутивный формат. Такие как JAR, WAR или EAR.
install Устанавливает пакет в локальный репозиторий, который может быть использован как зависимость в других локальных проектах.
deploy Копирует финальный пакет (архив) в удалённый репозиторий для, того, чтобы сделать его доступным другим разработчикам и проектам.
Жизненный цикл Default (Build)
Это основной жизненный цикл Maven, который используется для сборки проектов. Он включает в себя 23 фазы:
validate Подтверждает, является ли проект корректным и вся ли необходимая информация доступа для завершения процесса сборки.
initialize Инициализирует состояние сборки, например, различные настройки.
generate-sources Включает любой исходный код в фазу компиляции.
process-sources Обрабатывает исходный код (подготавливает). Например, фильтрует определённые значения.
generate-resources Генерирует ресурсы, которые должны быть включены в пакет.
process-resources Копирует и отправляет ресурсы в указанную директорию. Это фаза перед упаковкой.
compile Комплирует исходный код проекта.
process-classes Обработка файлов, полученных в результате компиляции. Например, оптимизация байт-кода Java классов.
generate-test-sources Генерирует любые тестовые ресурсы, которые должны быть включены в фазу компиляции.
process-test-sources Обрабатывает исходный код тестов. Например, фильтрует значения.
test-compile Компилирует исходный код тестов в указанную директорию тестов.
process-test-classes Обрабатывает файлы, полученные в результате компиляции исходного кода тестов.
test Запускает тесты, используя приемлемый фреймворк юнит-тестирования (например, Junit).
prepare-package Выполняет все необходимые операции для подготовки пакет, непосредственно перед упаковкой.
package Преобразует скомпилированный код и пакет в дистрибутивный формат. Такие как JAR, WAR или EAR.
pre-integration-test Выполняет необходимые действия перед выполнением интеграционных тестов.
integration-test Обрабатывает и распаковывает пакет, если необходимо, в среду, где будут выполняться интеграционные тесты.
post-integration-test Выполняет действия, необходимые после выполнения интеграционных тестов. Например, освобождение ресурсов.
verify Выполняет любые проверки для подтверждения того, что пакет пригоден и отвечает критериям качества.
install Устанавливает пакет в локальный репозиторий, который может быть использован как зависимость в других локальных проектах.
deploy Копирует финальный пакет (архив) в удалённый репозиторий для, того, чтобы сделать его доступным другим разработчикам и проектам.
Необходимо уточнить два момента:
Когда мы выполняем команду Maven, например install, то будут выполнены фазы до install и фаза install.
Различные задачи Maven будут привязаны к различным фазам жизненного цикла Maven в зависимости от типа архива (JAR/WAR/EAR).
Чем CallableStatement отличается?
Можно ли прописывать Native Query в Callable?
Что такое мавен? Полное имя артефакта?