Здравствуйте! В этой статье я напишу простой пример соединения с базами данных на Java.Эта статья предназначена новичкам.Здесь я опишу каждую строчку объясню что зачем.

Но для начала немного теории.

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)


  1. ExplosiveZ
    16.04.2017 16:16
    +5

    А где собственно пример JDBC?


  1. DemAn_13
    16.04.2017 16:55
    +5

    Не совсем понятен смысл этой статьи. Простейший пример использования JDBC спокойно гуглится как на русском, так и на английском.

    Примеры кода лучше оформлять именно в виде кода, а не скрина. Да и сами скрины делать желательно делать хотя бы с помощью alt+print screen


  1. sshikov
    16.04.2017 17:21
    +4

    Руки бы сегодня отрывать за такие примеры.


    1. ls18
      16.04.2017 17:50
      -4

      Почему? Что не так в примере? Он конечно очень мелкий и не подходит для статьи по объему и важности информации.


      1. sshikov
        16.04.2017 18:28
        +3

        Да все в нем не так. Начнем с того, что Connection уже давно (ну лет так 10 наверное уже) рекомендуется получать не из DriverManager, а из DataSource. По разным причинам, например потому, что это обычно пул коннектов, а не один.


        Во-вторых, за .close() внутри try — потому что это надо делать внутри finally, и не забывать при этом, что каждый из этих методов сам может кинуть исключение — и эти исключения нужно ловить (хотя обычно можно и не обрабатывать).


        В-третьих, начиная с java 7 есть такая штука, как try with resources, и в принципе все ресурсы jdbc относятся к таким, которые могут быть закрыты автоматически.


        Короче, тут все неправильно. JDBC уже лет 20 наверное существует, это базовый низкоуровневый механизм. И за это время вокруг понаделали столько хороших удобных высокоуровневых, что начинающим следует пользоваться ими, например Spring JDBC, где вопросы незакрытых ресурсов просто не возникают.


        1. barker
          16.04.2017 19:28
          +2

          Ещё добавлю что и в этом случае Class.forName делать уже лет 10 как не надо.


          1. sshikov
            16.04.2017 19:38

            Ну, это наверное самая мелкая претензия в данном случае. Хотя… если вдуматься, forName может выкинуть парочку исключений, которые тоже неплохо бы ловить — если уж мы решили коннект таким древним способом получить.


      1. sshikov
        16.04.2017 18:34
        +2

        Да, и еще одно, но не самое мелкое — вот такой вот пример класса, который получает коннект к базе внутри себя, и внутри же хранит параметры соединения — это типичный пример класса не тестируемого. Потому что чтобы нормально тестировать это — нужно DataSource инжектить снаружи. Тогда его хотя бы в интеграционных тестах можно будет заменить на другой.


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


        Ну и напоследок — select *, да? А потом getString(1), да? И долго будет удивляться тот, кто это станет поддерживать, почему вдруг оно сломалось, от того, что совсем немного изменился набор (или порядок) колонок в таблице.


  1. GerrAlt
    16.04.2017 17:31
    +3

    Честно говоря если вы хотите рассказывать про JDBC, то мне кажется было бы логично более подробно остановится на том как правильно писать запросы и как работать с результатами, а у вас как минимум визуально много отдано под описание интерфейса одной конкретной IDE. Уверен что не все новички именно ей пользуются, и абсолютно точно с jdbc совсем не обязательно именно через эти интнрфейсы работать.


  1. RISA
    16.04.2017 21:40

    ну и часть примеров уже проскакивало в вашей-же предыдущей статье https://habrahabr.ru/post/320542/


  1. streetturtle
    16.04.2017 21:40
    +3

    Все очень плохо…
    В проекте нет .gitignore'а (папки target, .idea и файл *.iml не должны быть в проекте). Зачем нам знать как вы подключаетесь к базе (пользователи IDEA Ultimate наверняка это знают, пользователям остальных IDE это вряд ли интересно). Уж если делаете пример, то хотя бы напишите DDL таблицы которую используете. Статью можно заменить куском кода из main класса и написать что так делать не надо.


    1. grossws
      16.04.2017 23:20

      проекте нет .gitignore'а (папки target, .idea и файл *.iml не должны быть в проекте)

      если target/ в .gitignore заносить вполне логично (правда, стоит с аккуратностью потом создавать пакеты с именем target), то /.idea/ и *.iml вполне можно внести в глобальный (per user) gitignore, который прописать в git config --global core.excludesfile.


      В остальном — сложно не согласиться с вами ,)