JDBC » История » Версия 1
Александр Александров, 21.04.2019 17:15
1 | 1 | Александр Александров | h1. JDBC |
---|---|---|---|
2 | |||
3 | h2. Вопросы |
||
4 | |||
5 | # Что такое JDBC? |
||
6 | # Этапы работы с базой данных с использованием JDBC? |
||
7 | # Как создать Connection? |
||
8 | # Чем отличается Statement от PreparedStatement? |
||
9 | # Как вызвать хранимую процедуру? |
||
10 | # Как правильно закрыть Connection? |
||
11 | # Какие есть уровни изоляции транзакций? |
||
12 | # Какие есть типов чтения транзакций? |
||
13 | |||
14 | h2. Ответы |
||
15 | |||
16 | h3. Что такое JDBC? |
||
17 | |||
18 | API JDBC (Java DataBase Connectivity) - стандартный прикладной интерфейс языка Java для организации взаимодействия между приложением и СУБД. Взаимодействие осуществляется с помощью драйверов JDBC, обеспечиваю щих реализацию общих интерфейсов для конкретных СУБД и конкретних протоколов. В JDBC определяются четыре типа драйверов. |
||
19 | |||
20 | h3. Этапы работы с базой данных с использованием JDBC? |
||
21 | |||
22 | Этапы работы с базой данных с использованием JDBC: |
||
23 | |||
24 | # Подключение библиотеки с классом-драйвером базы данных. |
||
25 | # Установка соединения с БД. |
||
26 | # Создание объекта для передачи запросов. |
||
27 | # Выполнение запроса. |
||
28 | # Обработка результатов выполнения запроса. |
||
29 | # Закрытие соединения, statement. |
||
30 | |||
31 | h3. Как создать Connection? |
||
32 | |||
33 | Для установки соединения с БД вызывается статический метод getConnection() класса java.sql.DriverManager. В качестве параметров методу передаються URL базы данных, логин пользователя БД и пароль доступа. |
||
34 | Загрузка класса драйвера базы данных при отсутствии ссылки на экземпляр этого класса в JDBC 4.1 происходит автоматически при установке соединения екземпляром DriverManager. Метод возвращает объект Connection. URL базы данных, состоящий из типа и адреса физического расположения БД, может создаваться в виде отдельной строки или извлекаться из файла ресурсов. |
||
35 | |||
36 | Соответственно: |
||
37 | |||
38 | {{dmsf_image(235)}} |
||
39 | |||
40 | В результате будет возвращен объект Connection и будет одно установленное соединение с БД с именем testphones. Класс DriverManager предоставляет средства для управления набором драйверов баз данных. |
||
41 | |||
42 | h3. Чем отличается Statement от PreparedStatement? |
||
43 | |||
44 | Объект Statement используется для выполнения SQL-запросов к БД. Существует три типа объектов Statement. Все три служат как бы конейнерами для выполнения SQL-выражений через данное соединение: Statement, PreparedStatement, наследующий от Statement, и CallableStatement, наследующий от PreparedStatement. Они специализируются на различных типах запросов: Statement используется для выполнения простых SQLзапросов без параметров; PreparedStatement используется для выполнения прекомпилированных SQL-запросов с или без входных (IN) параметров; CallableStatement используется для вызовов хранимых процедур. Интерфейс Statement предоставляет базовые методы для выполнения запросов и извлечения результатов. Интерфейс PreparedStatement добавляет методы управления входными (IN) параметрами; CallableStatement добавляет методы для манипуляции выходними (OUT) параметрами. Интерфейс PreparedStatement наследует от Statement и отличается от последнего следующим: Экземпляры PreparedStatement "помнят" скомпилированные SQL-выражения. Именно поэтому они называются "prepared" ("подготовленные"). |
||
45 | |||
46 | SQL-выражения в PreparedStatement могут иметь один или более входной (IN) параметр. Входной параметр - это параметр, чье значение не указывается при создании SQL-выражения. Вместо него в выражении на месте каждого входного параметра ставится знак ("?"). Значение каждого вопросительного знака устанавливается методами setXXX перед выполнением запроса. |
||
47 | |||
48 | h3. Как вызвать хранимую процедуру? |
||
49 | |||
50 | Хранимые процедуры – это именованный набор операторов Transact-SQL хранящийся на сервере. Такую процедуру можно легко вызвать из Javaкласса с помощью специального синтаксиса. При вызове такой процедуры необходимо указать ее имя и определить список параметров. Имя и список параметров посылаются по JDBC-соединению в СУБД, которая выполняет вызываемую процедуру и возвращает результат (если таковой имеется) обратно, используя это же соединение. JDBC Java-код для выполнения хранимой процедуры, использующий объект Statement без параметров. |
||
51 | |||
52 | {{dmsf_image(236)}} |
||
53 | |||
54 | h3. Как правильно закрыть Connection? |
||
55 | |||
56 | <pre> |
||
57 | st.close(); |
||
58 | cn.close(); |
||
59 | </pre> |
||
60 | |||
61 | После того, как база больше не нужна, соединение закрывается. Для того, чтобы правильно пользоваться приведенными методами, программисту требуется знать типы полей БД. В распределенных системах это знание предполагается изначально. В Java 7 для объектов-ресурсов, требующих закрытия, реализована технология try with resources. |
||
62 | |||
63 | h3. Какие есть уровни изоляции транзакций? |
||
64 | |||
65 | Уровни изоляции транзакций определены в виде констант интерфейса Connection (по возрастанию уровня ограничения): |
||
66 | |||
67 | * *TRANSACTION_NONE* - информирует о том, что драйвер не поддерживает транзакции; |
||
68 | * *TRANSACTION_READ_UNCOMMITTED* - позволяет транзакциям видеть несохраненные изменения данных, что разрешает грязное, неповторяющееся и фантомное чтения; |
||
69 | * *TRANSACTION_READ_COMMITTED* - означает, что любое изменение, сделанное в транзакции, не видно вне ее, пока она не сохранена. Это предотвращает грязное чтение, но разрешает неповторяющееся и фантомное; |
||
70 | * *TRANSACTION_REPEATABLE_READ* - запрещает грязное и неповторяющееся чтение, но фантомное разрешено; |
||
71 | * *TRANSACTION_SERIALIZABLE* - определяет, что грязное, неповторяющееся и фантомное чтения запрещены. |
||
72 | |||
73 | h3. Какие есть типов чтения транзакций? |
||
74 | |||
75 | Для транзакций существует несколько типов чтения: |
||
76 | |||
77 | * грязное чтение (dirty reads) происходит, когда транзакциям разрешено видеть несохраненные изменения данных. Иными словами, изменения, сделанные в одной транзакции, видны вне ее до того, как она была сохранена. Если изменения не будут сохранены, то, вероятно, другие транзакции выполняли работу на основе некорректных данных; |
||
78 | * неповторяющееся чтение (nonrepeatable reads) происходит, когда транзакция А читает строку, транзакция Б изменяет эту строку, транзакция А читает ту же строку и получает обновленные данные; |
||
79 | * фантомное чтение (phantom reads) происходит, когда транзакция А считывает все строки, удовлетворяющие WHERE-условию, транзакция Б вставляет новую или удаляет одну из строк, которая удовлетворяет этому условию, транзакция А еще раз считывает все строки, удовлетворяющие WHERE-условию, уже вместе с новой строкой или недосчитавшись старой. |