Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit fda3af7

Browse files
Add files and folders ConnectLessThree of JDBC Practice.
1 parent a0e03be commit fda3af7

File tree

4 files changed

+216
-0
lines changed

4 files changed

+216
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
db.url=jdbc:postgresql://localhost:5432/flight_repository
2+
db.username=postgres
3+
db.password=testadmin
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
Пример создания соединения с базой данных через
3+
самописный "утилитный" класс ConnectionManager и
4+
файл свойств application.properties.
5+
6+
При этом не забываем подключить в настройках
7+
драйвер соединения с базой данных (*.jar),
8+
который лежит в папке 'lib' проекта 'JDBCLessonOne',
9+
иначе словим исключение. Не забываем пометить
10+
папку 'resources', как ресурсную.
11+
*/
12+
import connection_util.ConnectionManager;
13+
14+
import java.sql.Connection;
15+
import java.sql.SQLException;
16+
17+
public class JDBCLessThreeApp {
18+
19+
public static void main(String[] args) {
20+
21+
try (Connection connection = ConnectionManager.getBaseConnection()) {
22+
/*
23+
В стандарте SQL описывается четыре уровня изоляции транзакций:
24+
— Read uncommited (Чтение незафиксированных данных),
25+
- Read committed (Чтение зафиксированных данных),
26+
- Repeatable read (Повторяемое чтение),
27+
- Serializable (Сериализуемость).
28+
29+
*** 4 свойства транзакций ***
30+
31+
Основные требования к транзакционной системе:
32+
- Atomicity (атомарность) — выражается в том, что транзакция должна быть
33+
выполнена в целом или не выполнена вовсе.
34+
- Consistency (согласованность) — гарантирует, что по мере выполнения транзакций,
35+
данные переходят из одного согласованного
36+
состояния в другое, то есть транзакция не может
37+
разрушить взаимной согласованности данных.
38+
- Isolation (изолированность) — локализация пользовательских процессов означает,
39+
что конкурирующие за доступ к БД транзакции
40+
физически обрабатываются последовательно,
41+
изолированно друг от друга, но для пользователей
42+
это выглядит, как будто они выполняются параллельно.
43+
- Durability (долговечность) — устойчивость к ошибкам — если транзакция завершена
44+
успешно, то те изменения в данных, которые были ею
45+
произведены, не могут быть потеряны ни при каких
46+
обстоятельствах.
47+
48+
В данной ситуации мы смотрим уровень изоляции транзакций нашей базы.
49+
*/
50+
System.out.println(connection.getTransactionIsolation());
51+
System.out.println(connection.getCatalog());
52+
} catch (SQLException e) {
53+
throw new RuntimeException(e);
54+
}
55+
}
56+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package connection_util;
2+
3+
import java.sql.Connection;
4+
import java.sql.DriverManager;
5+
import java.sql.SQLException;
6+
7+
public final class ConnectionManager {
8+
/*
9+
Логин для подключения к базе данных, данные
10+
берем из application.properties
11+
*/
12+
private final static String LOGIN_KEY = "db.username";
13+
/*
14+
Пароль для подключения к базе данных, данные
15+
берем из application.properties
16+
*/
17+
private final static String PASS_KEY = "db.password";
18+
/*
19+
Адрес для подключения к базе данных, обычно можно
20+
взять из настроек соединения IDE и базы, данные
21+
прописываем в / и берем / из: application.properties
22+
*/
23+
private final static String BASEURL_KEY = "db.url";
24+
25+
static {
26+
// Загружаем наш PostgreSQL драйвер
27+
loadDriver();
28+
}
29+
/*
30+
Приватный конструктор данного класса
31+
*/
32+
private ConnectionManager() {
33+
}
34+
/*
35+
Нам нужно получить соединение с базой данных, т.е. экземпляр
36+
класса Connection, это можно сделать, как и в прошлый раз через
37+
перегруженный метод *.getConnection(), класса DriverManager.
38+
*/
39+
public static Connection getBaseConnection() {
40+
try {
41+
/*
42+
DriverManager.getConnection(DB_URL, DB_USER_NAME, DB_USER_PASSWORD) –
43+
устанавливаем соединение с СУБД. По переданному адресу, JDBC сама
44+
определит тип и местоположение нашей СУБД и вернёт Connection, который
45+
мы можем использовать для связи с БД.
46+
*/
47+
return DriverManager.getConnection(PropertiesUtil.get(BASEURL_KEY),
48+
PropertiesUtil.get(LOGIN_KEY),
49+
PropertiesUtil.get(PASS_KEY));
50+
} catch (SQLException e) {
51+
throw new RuntimeException(e);
52+
}
53+
}
54+
55+
private static void loadDriver() {
56+
try {
57+
/*
58+
Метод forName() класса java.lang.Class возвращает объект Class,
59+
связанный с классом или интерфейсом с заданным строковым именем.
60+
Вызов этого метода эквивалентен:
61+
62+
Class.forName(className, true, currentLoader)
63+
64+
, где currentLoader обозначает определяющий загрузчик класса текущего
65+
класса. Например, следующий фрагмент кода возвращает дескриптор класса
66+
среды выполнения для класса с именем java.lang.Thread:
67+
68+
Class t = Class.forName("java.lang.Thread")
69+
70+
Вызов forName("XYZ") приводит к инициализации класса с именем XYZ.
71+
72+
Параметры: className — полное имя вызываемого класса.
73+
Возвращает: объект Class для класса с указанным именем.
74+
75+
Исключения:
76+
- LinkageError - если связь не удалась
77+
- ExceptionInInitializerError - если инициализация, спровоцированная
78+
этим методом, не удалась.
79+
- ClassNotFoundException - если класс не может быть расположен
80+
81+
В нашем случае метод Class.forName загружает класс драйвера,
82+
который мы будем использовать.
83+
*/
84+
Class.forName("org.postgresql.Driver");
85+
} catch (ClassNotFoundException e) {
86+
throw new RuntimeException(e);
87+
}
88+
}
89+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package connection_util;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.util.Properties;
6+
7+
public final class PropertiesUtil {
8+
9+
private static final Properties PROPERTIES = new Properties();
10+
11+
static {
12+
loadProperties();
13+
}
14+
15+
private PropertiesUtil() {
16+
}
17+
/*
18+
Метод позволяющий получить свойства ключей
19+
из файла свойств application.properties
20+
*/
21+
public static String get(String key) {
22+
return PROPERTIES.getProperty(key);
23+
}
24+
25+
private static void loadProperties() {
26+
/*
27+
В блоке try -with-resources получаем (открываем)
28+
входящий поток данных из файла свойств.
29+
30+
1. Метод getClassLoader() класса java.lang.Class
31+
используется для получения classLoader текущего
32+
объекта. Этот объект может быть классом, массивом,
33+
интерфейсом и т. д. Метод возвращает classLoader
34+
этого объекта.
35+
36+
classLoader - это объект, отвечающий за загрузку
37+
классов. Класс ClassLoader является абстрактным
38+
классом. Учитывая двоичное имя класса, загрузчик
39+
класса должен попытаться найти или сгенерировать
40+
данные, составляющие определение класса. Типичная
41+
стратегия состоит в том, чтобы преобразовать имя в
42+
имя файла, а затем прочитать «файл класса» с этим
43+
именем из файловой системы.
44+
45+
2. Метод getResourceAsStream() класса java.lang.Class
46+
используется для получения ресурса с указанным ресурсом
47+
текущего класса. Метод возвращает указанный ресурс
48+
данного класса в виде объекта InputStream.
49+
50+
Метод принимает параметр resourceName, который является
51+
ресурсом для получения данных (например, пары KEY-VALUE,
52+
как у нас).
53+
*/
54+
try (InputStream inputStream = PropertiesUtil.class
55+
.getClassLoader()
56+
.getResourceAsStream("application.properties"))
57+
{
58+
/*
59+
Метод *.load() считывает список свойств
60+
(пары ключей и элементов) из входного
61+
потока байтов.
62+
*/
63+
PROPERTIES.load(inputStream);
64+
} catch (IOException e) {
65+
throw new RuntimeException(e);
66+
}
67+
}
68+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /