Но для начала немного теории.
JDBC (Java DataBase Connectivity — соединение с базами данных на Java) предназначен для взаимодействия Java-приложения с различными системами управления базами данных (СУБД). Всё движение в JDBC основано на драйверах которые указываются специально описанным URL.
А теперь практика.
Для начала создаём maven проект и в pom.xml помещаем зависимость для соединения с СУБД (В моём случае СУБД будет выступать MySQL):
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
Должно получится так:
Дальше подключаемся к базе данных нужной вам(я пользуюсь IDEA Ultimate по этому я подключаюсь именно так).
Дальше заполняем Database, User и Password.Обязательно проверяем соединение.
Дальше мы создаём сам класс.
А теперь разберём его построчно:
В начале мы создаём три переменные url,username и password. Образец указания url:
Username по умолчанию root.Password вы должны знать сами.
После с помощью строчки Class.forName(«com.mysql.jdbc.Driver») регестрируем драйвера. Дальше устанавливаем соединение с помощью DriverManager.getConnection (ваш url, username, password).
После с помощью connection (соединения) создаём простой запрос Statement методом createStatement().
Дальше создаём экземпляр класса ResultSet и формируем запрос через statement методом executeQuery (запрос).
Дальше мы заставляем пробежаться resultSet по всей базе данных и вывести то что нам нужно. Так с помощью объекта resultSet и его методов (getString,getInt и т.д. в зависимости от типа переменных в колонке) мы выводим.Так как мой запрос был для того что бы вывести всё, мы можем вывести любую колонку.
После закрываем resultSet,statement и connection (именно в такой последовательности). В процессе он будет показывать ошибки так как будет запрашивать обработку исключений в catch.Так что пишите catch заранее.
Теперь когда практика есть на неё можно наложить более глубокую теорию.Тема правда очень большая, желаю удачи в её изучении.
Этот проект на github тут.
Комментарии (12)
DemAn_13
16.04.2017 16:55+5Не совсем понятен смысл этой статьи. Простейший пример использования JDBC спокойно гуглится как на русском, так и на английском.
Примеры кода лучше оформлять именно в виде кода, а не скрина. Да и сами скрины делать желательно делать хотя бы с помощью alt+print screen
sshikov
16.04.2017 17:21+4Руки бы сегодня отрывать за такие примеры.
ls18
16.04.2017 17:50-4Почему? Что не так в примере? Он конечно очень мелкий и не подходит для статьи по объему и важности информации.
sshikov
16.04.2017 18:28+3Да все в нем не так. Начнем с того, что Connection уже давно (ну лет так 10 наверное уже) рекомендуется получать не из DriverManager, а из DataSource. По разным причинам, например потому, что это обычно пул коннектов, а не один.
Во-вторых, за .close() внутри try — потому что это надо делать внутри finally, и не забывать при этом, что каждый из этих методов сам может кинуть исключение — и эти исключения нужно ловить (хотя обычно можно и не обрабатывать).
В-третьих, начиная с java 7 есть такая штука, как try with resources, и в принципе все ресурсы jdbc относятся к таким, которые могут быть закрыты автоматически.
Короче, тут все неправильно. JDBC уже лет 20 наверное существует, это базовый низкоуровневый механизм. И за это время вокруг понаделали столько хороших удобных высокоуровневых, что начинающим следует пользоваться ими, например Spring JDBC, где вопросы незакрытых ресурсов просто не возникают.
barker
16.04.2017 19:28+2Ещё добавлю что и в этом случае Class.forName делать уже лет 10 как не надо.
sshikov
16.04.2017 19:38Ну, это наверное самая мелкая претензия в данном случае. Хотя… если вдуматься, forName может выкинуть парочку исключений, которые тоже неплохо бы ловить — если уж мы решили коннект таким древним способом получить.
sshikov
16.04.2017 18:34+2Да, и еще одно, но не самое мелкое — вот такой вот пример класса, который получает коннект к базе внутри себя, и внутри же хранит параметры соединения — это типичный пример класса не тестируемого. Потому что чтобы нормально тестировать это — нужно DataSource инжектить снаружи. Тогда его хотя бы в интеграционных тестах можно будет заменить на другой.
А если еще вспомнить, что у большинства полезных программ база должна настраиваться и не в тестовом режиме — то и подавно, выполнять запросы и настраивать коннект в одном классе — моветон.
Ну и напоследок — select *, да? А потом getString(1), да? И долго будет удивляться тот, кто это станет поддерживать, почему вдруг оно сломалось, от того, что совсем немного изменился набор (или порядок) колонок в таблице.
GerrAlt
16.04.2017 17:31+3Честно говоря если вы хотите рассказывать про JDBC, то мне кажется было бы логично более подробно остановится на том как правильно писать запросы и как работать с результатами, а у вас как минимум визуально много отдано под описание интерфейса одной конкретной IDE. Уверен что не все новички именно ей пользуются, и абсолютно точно с jdbc совсем не обязательно именно через эти интнрфейсы работать.
RISA
16.04.2017 21:40ну и часть примеров уже проскакивало в вашей-же предыдущей статье https://habrahabr.ru/post/320542/
streetturtle
16.04.2017 21:40+3Все очень плохо…
В проекте нет .gitignore'а (папкиtarget
,.idea
и файл*.iml
не должны быть в проекте). Зачем нам знать как вы подключаетесь к базе (пользователи IDEA Ultimate наверняка это знают, пользователям остальных IDE это вряд ли интересно). Уж если делаете пример, то хотя бы напишите DDL таблицы которую используете. Статью можно заменить куском кода из main класса и написать что так делать не надо.grossws
16.04.2017 23:20проекте нет .gitignore'а (папки target, .idea и файл *.iml не должны быть в проекте)
если
target/
в.gitignore
заносить вполне логично (правда, стоит с аккуратностью потом создавать пакеты с именемtarget
), то/.idea/
и*.iml
вполне можно внести в глобальный (per user) gitignore, который прописать вgit config --global core.excludesfile
.
В остальном — сложно не согласиться с вами ,)
ExplosiveZ
А где собственно пример JDBC?