JDBC Flashcards Preview

Java > JDBC > Flashcards

Flashcards in JDBC Deck (41)
Loading flashcards...
1

ANSI SQL

SQL (structured query language — «язык структурированных запросов») — формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД). SQL основывается на исчислении кортежей. Стандарт SQL определяется с помощью кода ANSI.

2

Основные элементы BD

Поле — это минимальный элемент
Запись — совокупность полей,
Таблица базы данных — совокупность записей.
Хранимая процедура - набор SQL-инструкций? хранится на сервере В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения.
Функция – это подпрограмма, которая вычисляет значение.
Констрейнты (constraints) — объявление правил (ограничения), которым должны соответствовать данные в таблице.

3

Типы констрейнтов:

NOT NULL -колонка не может содержать NULL значений.
UNIQUE — каждая строка в колонке должна иметь уникальное значение.
PRIMARY KEY — комбинация NOT NULL и UNIQUE.
FOREIGN KEY — обеспечивает ссылочную целостность. Означает что ссылающиеся данные имеют соответствие в другой таблице.
CHECK — проверка на определенное выполнение правил.
DEFAULT

4

null в базах данных

Смысл NULL-значения — это отсутствие информации или неприменимость данного атрибута в данном кортеже.
NULL-значение может означать неприменимость значения к этому столбцу (например в колонке «скорость полета» для таблицы животные и записи «Слон»)
NULL-значение так же может означать отсутствие информации. Заменять отсутствующие значения, например на -1, ‘ ‘ или что-то такое, не корректно.

5

Агрегатные функции,

COUNT(*) Возвращает количество строк источника записей
COUNT Возвращает количество значений в указанном столбце
SUM Возвращает сумму значений в указанном столбце
AVG Возвращает среднее значение в указанном столбце
MIN Возвращает минимальное значение в указанном столбце
MAX Возвращает максимальное значение в указанном столбце

GROUP BY используется для определения групп выходных строк, к которым могут применяться агрегатные функции (COUNT, MIN, MAX, AVG и SUM).

HAVING применяется после группировки для определения аналогичного предиката, фильтрующего группы по значениям агрегатных функций. Это предложение необходимо для проверки значений, которые получены с помощью агрегатной функции не из отдельных строк источника записей, определенного в предложении FROM, а из групп таких строк. Поэтому такая проверка не может содержаться в предложении WHERE.

6

Каким образом лучше добавлять большое количество записей в таблицу?

использовать подзапрос:

INSERT INTO [(,...)]
SELECT *
FROM
WHERE value = 'something';

7

Что такое первая нормальная форма и процесс нормализации? Какие бывают нормальные формы?

Первая нормальная форма (1NF) — базовая нормальная форма отношения в реляционной модели данных.

Нормальная форма — свойство отношения в реляционной модели данных, характеризующее его с точки зрения избыточности, потенциально приводящей к логически ошибочным результатам выборки или изменения данных. Нормальная форма определяется как совокупность требований, которым должно удовлетворять отношение. Нормальные формы: первая нормальная форма, вторая нормальная форма, третья нормальная форма, нормальная форма Бойса — Кодда, четвёртая нормальная форма, пятая нормальная форма.

8

В чем смысл индекса СУБД, как они устроены, как хранятся?

Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева.

9

. Что такое JDBC API и когда его используют?

DBC – это стандарт взаимодействия приложения с различными СУБД. JDBC основан на концепции драйверов, позволяющей получать соединение с БД по специальному url. JDBC API находятся в пакетах java.sql и javax.sql. С помощью JDBC API можно создавать соединения с БД, выполнять SQL запросы, хранимые процедуры и обрабатывать результаты. JDBC API упрощает работу с базами данных из Java программ. Меняя БД меняем лишь драйвер взаимодействия

10

JDBC Driver и какие различные типы драйверов JDBC вы знаете?

JDBC основан на концепции так называемых драйверов, позволяющих получать соединение с базой данных по специально описанному URL. Драйверы могут загружаться динамически (во время работы программы). Загрузившись, драйвер сам регистрирует себя и вызывается автоматически, когда программа требует URL, содержащий протокол, за который драйвер отвечает.Различают четыре типа драйверов.Java программа работает с БД в двух частях. Первая часть это JDBC API, а вторая — драйвер, который и выполняет всю работу. Каждый тип определяет реализацию JDBC драйвера по возрастающей степени независимости от платформы, производительности и легкости администрирования. Эти четыре типа следующие:

Тип 1: JDBC-ODBC бридж (JDBC-ODBC Bridge plus ODBC Driver) — транслирует JDBC в ODBC и для взаимодействия с базой данных использует драйвер ODBC. Компания Sun включила в состав JDK один такой драйвер — мост JDBC/ODBC. Сейчас имеются более удачные реализации.
Тип 2: Нативный API/частично Java драйвер (Native API partly Java technology-enabled driver) — переводит вызовы JDBC в вызовы специфичные к СУБД таких как например SQL Server, Informix, Oracle или Sybase. Драйвер 2-го типа общается напрямую с сервером базы данных, следовательно он требует, чтобы какой то бинарный код был на стороне клиентской машины.
Тип 3: Сетевой протокол/«чистый» Java драйвер (Pure Java Driver for Database Middleware) — использует трехуровневую архитектуру, где вызовы JDBC посылаются на промежуточный т.н. сервер приложений, далее этот сервер транслирует вызовы (явно или косвенно) в вызовы специфичного к СУБД нативного интерфейса для дальнейшего обращения к базе данных. Если сервер среднего слоя написан на Java то он может использовать для трансляции JDBC драйверы 1 и 2 типов.
Тип 4: Нативный протокол/«чистый» Java драйвер (Direct-to-Database Pure Java Driver) — конвертирует вызовы JDBC в специфический протокол вендора СУБД, так что клиентские приложения могут напрямую обращаться с сервером базы данных. Драйверы 4-го типа полностью реализуются на Java с целью достижения платформенной независимости и устранения проблем администрирования и развертывания.

11

Как JDBC API помогает достичь слабой связи между Java программой и JDBC Drivers API?

JDBC API используют рефлексию в java для достижения слабой связи между джава программой и JDBC драйверами. Драйвер фактически загружается один раз с помощью Class.forName(), а дальше используются возможности JDBC API в Java. Таким образом мы пишем код не особо задумываясь с какой базой данных мы будем работать. При необходимости достаточно указать другой драйвер и не переписывать большое количество кода.

12

Что такое JDBC Connection? Покажите шаги для подключения программы к базе данных.

JDBC Connection — соединение, установленное с сервером базы данных

try{
// load the Driver Class
Class.forName("com.mysql.jdbc.Driver");

// create the connection now
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/UserDB","user","pas");
}

13

Как используется JDBC DriverManager class?

JDBC DriverManager — фабрика, через которую можно получить объект Database Connection. После загрузки JDBC драйвера в память, он регистрирует себя в DriverManager (что можно проверить посмотрев в исходники JDBC Driver class). DriverManager используется для получения подключения с помощью зарегистрированных драйверов (метод getConnection()).

14

Как получить информацию о сервере базы данных из java программы?

С помощью объекта интерфейса DatabaseMetaData можно получить детальную информацию о сервере. После подключения к БД мы можем вызывать метод getMetaData() и получить объект DatabaseMetaData. Существует множество методов для получения различной информации, например о версии БД, конфигурации и т.п..
DatabaseMetaData metaData = con.getMetaData();
String dbProduct = metaData.getDatabaseProductName();

15

JDBC Statement?

JDBC API Statement используется для выполнения SQL запросов к базе данных. Объект Statement можно получить с помощью метода Connection.getStatement(). Вызывая методы execute(), executeQuery(), executeUpdate() и др., можно выполнять различные статичные SQL запросы.

В случае динамически созданных SQL запросов внутри java программы, когда введенные пользователем данные могут быть не проверенными, можно использовать SQL injection.

По умолчанию только один объект ResultSet для каждого Statement может быть открыт в одно и то же время. Таким образом, если необходимо работать с несколькими объектами ResultSet одновременно, мы должны использовать различные объекты Statement. Все execute() методы в интерфейсе Statement закроют текущий открытый объект ResultSet при выполнении.

16

Какие различия между execute, executeQuery, executeUpdate?

Существует несколько способов выполнять SQL-запросы в зависимости от типа этого запроса. Для этого у интерфейса Statement существует три различных метода: executeQuery(), executeUpdate(), а так же execute(). Рассмотрим их отдельно.
Самый базовый метод executeQuery() необходим для запросов, результатом которых является один единственный набор значений, таких как у запросов SELECT. Возвращает ResultSet, который не может быть null даже если у результата запроса не было найдено значений.
Метод execute() используется, когда операторы SQL возвращают более одного набора данных, более одного счетчика обновлений или и то, и другое. Метод возвращает true, если результатом является ResultSet, как у запроса SELECT. Вернет false, если ResultSet отсутствует, например при запросах вида Insert, Update. С помощью методов getResultSet() мы можем получить ResultSet, а getUpdateCount() — количество обновленных записей.
Метод executeUpdate() используется для выполнения операторов INSERT, UPDATE или DELETE, а также для операторов DDL (Data Definition Language — язык определения данных), например, CREATE TABLE и DROP TABLE. Результатом оператора INSERT, UPDATE, или DELETE является модификация одной или более колонок в нуле или более строках таблицы. Метод executeUpdate() возвращает целое число, показывающее, сколько строк было модифицировано. Для выражений типа CREATE TABLE и DROP TABLE, которые не оперируют над строками, возвращаемое методом executeUpdate() значение всегда равно нулю.

Все методы выполнения SQL-запросов закрывают предыдущий набор результатов (result set) у данного объекта Statement. Это означает, что перед тем как выполнять следующий запрос над тем же объектом Statement, надо завершить обработку результатов предыдущего (ResultSet).

17

Что такое JDBC PreparedStatement?

Объект PreparedStatement используется для выполнения прекомпилированных SQL-запросов с или без входных (IN) параметров. Мы можем использовать сеттеры для установки значений в запрос. Т.к. PreparedStatement является предкомпилированным, то он может быть эффективно использован множество раз. PreparedStatement считается лучшим выбором нежели Statement, т.к. он автоматически обрабатывает специальные символы, а так же предотвращает, так называемые, SQL injection attack (когда в запрос можно подставить свой код).

18

Как установить NULL значения в JDBC PreparedStatement?

Используя метод setNull() для установки null переменной в качестве параметра. Этот метод принимает индекс и SQL тип в качестве аргументов: s.setNull(10, java.sql.Types.INTEGER);

19

getGeneratedKeys() в Statement?

Если в таблице используется автоматическая генерация ключей, то для их получения используется метод Statement getGeneratedKeys(), который вернет сгенерированный ключ.

20

Какие преимущества в использовании PreparedStatement над Statement?

reparedStatement позволяет предотвратить атаки типа SQL injection, т.к. он автоматически экранирует специальные символы.
PreparedStatement позволяет использовать динамические запросы с внедрением параметров.
PreparedStatement быстрее Statement. Это особенно заметно при частом использовании PreparedStatement или при использовании для вызова группы запросов.
PreparedStatement позволяет писать объектно ориентированный код с использованием сеттеров\геттеров. В то время при использовании Statement необходимо использовать конкатенацию строк для создания запроса. Для больших запросов конкатенация выглядит, как минимум, большой, а так же несет в себе большой риск ошибки в запросе.

21

JDBC ResultSet

JDBC ResultSet — интерфейс, объект которого создается в результате запроса к базе данных. Его можно представить в виде таблицы данных, которая была сформирована в ответ на запрос.
Объект ResultSet поддерживает курсор, который указывает на текущую строку данных. При инициализации курсор устанавливается до первой строки. Для движение по строкам используется метод next(). При наличии строк после текущей позиции, метод next() возвращает true, что можно использовать для итерации по таблице полученных результатов.

По умолчанию объект ResultSet не модифицируемый и поддерживает курсор, который способен только к движение вперед. Для обхода такого ограничения можно использовать следующую конструкцию, которая даст возможность двунаправленного движения по таблице, а так же возможности обновления:Объект ResultSet автоматически закрывается при закрытии объекта, который его сгенерировал. Так же закрытие произойдет при повторном выполнении запроса или возврату результата из другого набора результатов.

Для использования геттера ResultSet можно использовать имя колонки или индекс, который начинается с 1.

22

типы JDBC ResultSet

Три типа объектов ResultSet:

ResultSet.TYPE_FORWARD_ONLY: тип по умолчанию. Поддерживает движение курсора только в прямом направлении.
ResultSet.TYPE_SCROLL_INSENSITIVE: Двунаправленный курсор. Объект не чувствителен к изменениям, которые произошли с таблицей после получения результата.
ResultSet.TYPE_SCROLL_SENSITIVE: Двунаправленный курсор. Объект чувствителен к изменениям, которые произошли с базой данных после создания объекта ResultSet.
Два типа потокобезопасных объектов ResultSet:

ResultSet.CONCUR_READ_ONLY: Поддерживает только чтение (read only). Применяется по умолчанию.
ResultSet.CONCUR_UPDATABLE: Поддерживает метод ResultSet update для обновления строк в таблице данных.

23

Stored Procedures используя JDBC API?

Хранимые процедуры — это группы SQL запросов, которые компилируются в базе данных и могут быть вызваны с помощью JDBC API. Для вызова хранимых процедур используется объект CallableStatement. Нам необходимо задать параметры выхода OUT до выполнения CallableStatement.
CallableStatement stmt = con.prepareCall("{call insertEmployee(?,?,?,?,?,?)}");
stmt.setInt(1, id);
stmt.setString(2, name);
stmt.setString(3, role);
stmt.setString(4, city);
stmt.setString(5, country);

//register the OUT parameter before calling the stored procedure
stmt.registerOutParameter(6, java.sql.Types.VARCHAR);

stmt.executeUpdate();

24

JDBC Batch Processing

Бывает необходимо выполнить сразу группу похожих запросов, например при загрузке данных из CSV файлов реляционной базы данных. Это можно сделать просто используя Statement или PreparedStatement для пошагового выполнения этих запросов. В JDBC API существует другая возможность, которая предоставляет возможность выполнить группу запросов за один раз. Выполнение такого рода задачи происходит с помощью JDBC API Batch Processing.

JDBC API поддерживает пакетную обработку с помощью методов addBatch() и executeBatch() у Statement и PreparedStatement. К преимуществам такого подхода относится более быстрая работа, т.к. вызовов к базе данных может быть существенно меньше.

25

Что такое JDBC Transaction Management и зачем он нужен?

По умолчанию, при создании подключения к базе данных будет выбран auto-commit mode. Это означает, что при каждом выполнении запроса он будет подтвержден автоматически по завершению. Каждый SQL запрос является транзакционным и выполняя какие-либо DML или DDL запросы по их завершению изменения будут приняты (сохранены) базой данных. Если у нас есть необходимость отказываться от сохранения выполнения какого-либо запроса (или групп запросов) в случае, если что-то пошло не так, то мы можем воспользоваться поддержкой транзакций в JDBC API.

С помощью метода setAutoCommit(boolean flag) можно отключить авто коммит в конкретном соединении. Следует отметить, что при отключении auto-commit не одно изменение не будет сохранено в базе данных до вызова метода commit() и за этим необходимо следить. Сервер базы данных будет блокировать необходимую часть базы данных до подтверждения транзакции, а так как это ресурсоёмкая задача, то подтверждать транзакцию необходимо сразу после выполнения задачи.

26

откатить JDBC транзакцию?

Connection rollback()

27

JDBC DataSource

JDBC DataSource является интерфейсом пакета javax.sql и является более продвинутым в сравнении с DriverManager для подключения к базе данных. Мы можем использовать DataSource для создания подключения к базе данных и реализацию класса драйвера, которая будет выполнять всю работу по поддержанию соединения. В дополнение к соединению через Database, DataSource предоставляет следующие дополнительные возможности:

Кэширование PreparedStatement для ускорения обработки запросов
Настройки Connection timeout
Возможности логирования
Порог максимального размера ResultSet
Поддержка Connection Pooling в контейнере сервлетов, использующий поддержку JNDI.

28

JDBC пул соединений используя JDBC DataSource и JNDI в Apache Tomcat Server?

создать JDBC JNDI ресурс в файле конфигурации сервера (server.xml или context.xml).
server.xml:


context.xml:

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

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");

29

Что такое уровни изоляции соединений в JDBC?

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

Когда мы используем транзакции в JDBC для обеспечения целостности данных, СУБД использует блокировки, чтобы заблокировать доступ других обращений к данным, участвующим в транзакции. Такие блокировки необходимы, чтобы предотвратить грязное чтение (Dirty Read), неповторяющиеся чтение (Non-Repeatable Read) и фантомное чтение (Phantom-Read).
Уровень изоляции транзакции JDBC используемый СУБД для механизма блокировки можно задать с помощью метода setTransactionIsolation(). Получить информацию о применяемом уровне изоляции поможет метод Connection getTransactionIsolation().

30

Перечислите уровни изоляции соединений в JDBC?

TRANSACTION_NONE без транзакций
TRANSACTION_READ_COMMITTED с транзакциями предотвращает грязное чтение, допускает неповторяющееся и фантомное чтение

TRANSACTION_READ_UNCOMMITTED с транзакциями допускает грязное неповторяющееся и фантомное чтение

TRANSACTION_REPEATABLE_READ с транзакциями предотвращает грязное неповторяющееся чтение, допускает фантомное чтение

TRANSACTION_SERIALIZABLEс транзакциями предотвращает грязное неповторяющееся и фантомное чтение