Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java jdbc example

JDBC пример

В примере рассматривается взаимодействие сразу с несколькими СУБД (oracle, ms sql, postgresql, mysql, derby) по подключению к серверу, созданию и удалению схемы (базы данных), созданию и удалению таблицы. При небольшой доработке можно одновременно работать сразу с несколькими разнотипными реляционными СУБД. Пример создан с использованием всех основных принципов ООП (объектно-ориентированное программирование) — инкапсуляция-наследование-полиморфизм.

На сайте приводится также пример записи файлов в бинарные (BLOB) и символьные (CLOB/TEXT) поля баз данных Oracle и MySQL, который можно увидеть здесь.

Описание примера

На скриншоте представлен JDBC пример в среде разработки Eclipse.

Рассматриваемый JDBC пример включает несколько программных модулей, реализующих принципы ООП :

  • dao_base.java — базовый класс определения свойств и функций доступа к серверу БД;
  • dao_oracle.java, dao_mssql.java, dao_postgres.java, dao_mysql.java, dao_derby.java — классы, наследующие свойства базового класса и реализующие функции доступа к конкретному серверу БД;
  • test_jdbc.java — модуль тестирования.

В директории lib размещаются драйверы JDBC различных провайдеров БД. В примере использовались следующие сервера баз данных : Oracle 10g Express Edition и MySQL 5.1

Дополнительно пример включает СУБД Apache Derby (директория db), которая наряду с драйверами JDBC включена в исходный код примера. СУБД Derby работает в режиме «EmbeddedDriver», т.е. запускается под управлением виртуальной машины JVM вместе с примером. Пример можно использовать для разработки и отладки дополнительных функций. Исходный код примера в виде проекта Eclipse можно скачать здесь.

Базовый класс, dao_base.java

Базовый класс является абстрактным, включающим два абстрактных метода setURL() и getConnection(). Данные методы, определяющие строку подключения URL к серверу БД и возвращающие объект подключения Connection к серверу СУБД, должны быть реализованы в «наследниках».

Метод RegisterDriverManager() подключает соответствующий JDBC драйвер к программе. Строка описания драйвера «driver» определяется в конструкторе. Подробнее о выборе и подключении драйвера JDBC можно познакомиться на странице «Класс DriverManager».

Метод Connect() регистрирует драйвер JDBC и определяет свойства подключения.

В связи с тем, что синтаксис создания схемы базы данных CREATE SCHEMA (и удаления «DROP SCHEMA») разных СУБД имеет отличия, то в базовом классе определены методы createSchema(final String schema) и dropSchema(final String schema), которые должны быть переопределены в наследующих классах.

Метод execSQL(final String sql) используется для выполнения СУБД транзакций. В случае возникновения ошибки транзакции в консоль выводится код и сообщение об ошибке.

Модули доступа к СУБД

Модули доступа к серверам СУБД наследуют свойства базового класса и реализуют его функции.

Исходный код dao_oracle.java

При создании объекта в родительский конструктор передается описание драйвера. Метод setURL() определяет строку подключения к серверу СУБД. Объект подключения connection создается из родного для драйвера класса — для Oracle это OracleConnection.

В связи с тем, что в Oracle схема связана, как правило, с учетной записью пользователя и создается, «можно сказать», при создании пользователя (при создании пользователем первого объекта), то в модуле dao_oracle функции создания и удаления схемы не переопределены.

Исходный код dao_mssql.java

В конструкторе класса определена строка описания драйвера. Формат строки подключения URL к серверу БД MS SQL представлен в методе setURL(String host, String database, int port). Если наименование базы данных «database» определить, то подключение будет выполнено к непосредственной базе данных, в противном случае к серверу.

Исходный код dao_postgres.java

PostgreSQL в отличие от остальных реляционных СУБД позволяет создавать несколько баз данных «DATABASE», которые являются контейнерами схем «SCHEMA». База данных «postgres» создается по умолчанию. В нашем модуле доступа мы не рассматриваем вопрос создания базы данных, который практически ничем не отличается от создания схемы. По умолчанию мы будем подключаться к БД «postgres», внутри которой будем создавать схему.

Исходный код dao_mysql.java

В СУБД MySQL понятия базы данных «DATABASE» и схемы «SCHEMA» можно сказать являются синонимами. Поэтому в синтаксисе создания базы данных можно использовать как «CREATE DATABASE database_name», так и «CREATE SCHEMA schema_name».

Исходный код dao_derby.java

Отличительная особенность СУБД Derby в режиме «EmbeddedDriver» заключается в том, что она работает под управлением виртуальной машины JVM вместе с примером. Для доступа к этой СУБД в «dao_derby» необходимо в строке подключения определить путь к БД. В нашем примере она располагается вместе с приложением.

Тестирование JDBC модулей доступа к СУБД

Для тестирования модулей доступа к серверам СУБД конечно необходимо использовать JUnit тесты. Но это не так наглядно. Использование JUnit при разработке приложения представлено на странице Тестирование программы, JUnit. В исходные коды примера в качестве образца включен тест подключения к серверу БД Apache Derby. Данная СУБД выбрана в качестве примера, поскольку управляется той же JVM, что и приложение и не требует дополнительной установки сервера СУБД.

В модуле тестирования «test_jdbc.java» определим массив параметров подключения к серверу СУБД :

Параметры подключения «params» нужно настроить. Для этого необходимо в первом поле указать HOST сервера СУБД. Для MSSQL неоходимо наряду с хостом указать соответствующий сервис сервера СУБД. Во второй колонке необходимо только подкорректировать SID сервера Oracle. В тестовом примере указывается SID сервера разработчика «XE». Для Derby указан относительный путь к БД. В следующих 2-х колонках необходимо привести соответствующие значения логина и пароля. В последней колонке указывается значение флага активности ACTIVE, который позволяет исключить сервер из тестирования. Данные параметры подключения используются в процедуре подключения createConnecion, которой необходимо передать модуль доступа и идентификатор СУБД :

Читать еще:  Java string split пример

Дополнительно определяем флаги создания объектов (схемы, таблицы) и текстовые константы, которые используются при выводе сообщений.

SQL-скрипты создания и удаления таблицы :

В SQL-скриптах присутствуют символы ‘%s’, которые должны быть заменены либо на наименование схемы, либо на пустой символ.

Процедура создания схемы и таблицы createObjects

В процедуре «createObjects» схема создается во всех СУБД за исключением Oracle.

После создания схемы СУБД MySQL и MSSQL выполняем переподключение к вновь созданной схеме для создания таблицы. В СУБД PostgreSQL и Derby создаем таблицу с указанием наименования схемы, т.е. «MEDIA».USERS .

Процедура удаления схемы и таблицы dropObjects

Процедура сначала удаляет таблицу, после чего удаляет схему, если СУБД не Oracle. Для удаления схемы в MS SQL необходимо «отключиться» от схемы, в противном случае будет ошибка с сообщением, что удалить невозможно в связи с имеющимися подключениями.

Исходный код dao_derby.java

В исходных кодах приведем только описание конструктора «test_jdbc». Все остальные, используемые в примере переменные и методы, представлены выше.

В конструкторе в цикле выполняется создание объекта «dao», после чего выполняется подключение к серверу БД, создается схема и таблица во вновь созданной схеме. После этого вновь созданные объекты удаляются и «dao» отключается от сервера СУБД.

На следующем скриншоте представлены сообщения данного JDBC примера в консоли Eclipse.

Работа с БД с помощью JDBC

1. Утверждения (Statements)

Взаимодействовать с БД мы можем с помощью трёх интерфейсов, которые имплементируются каждым драйвером:

  1. Statement — этот интерфейс используется для доступа к БД для общих целей. Он крайне полезен, когда мы используем статические SQL – выражения во время работы программы. Этот интерфейс не принимает никаких параметров.
  2. PreparedStatement — этот интерфейс может принимать параметры во время работы программы.
  3. CallableStatement — этот интерфейс становится полезным в случае, когда мы хотим получить доступ к различным процедурам БД. Он также может принимать параметры во время работы программы.

2. Интерфейс Statement

После этого мы можем использовать наш экземпляр statement для выполнения SQL – запросов. Для этой цели интерфейс Statement имеет три метода, которые реализуются каждой конкретной реализацией JDBC драйвера:

  • boolean execute(String SQL) — позволяет вам выполнить Statement, когда неизвестно заранее, является SQL-строка запросом или обновлением. Метод возвращает true, если команда создала результирующий набор.
  • int executeUpdate(String SQL) используется для выполнения обновлений. Он возвращает количество обновленных строк. Для выполнения операторов INSERT, UPDATE или DELETE.
  • ResultSet executeQuery(String SQL) — используется для выполнения запросов (SELECT). Он возвращает для обработки результирующий набор.

Пример 1. Создание таблицы

3. Интерфейс ResultSet

Этот интерфейс представляет результирующий набор базы данных. Он обеспечивает приложению построчный доступ к результатам запросов в базе данных.

Во время обработки запроса ResultSet поддерживает указатель на текущую обрабатываемую строку. Приложение последовательно перемещается по результатам, пока они не будут все обработаны или не будет закрыт ResultSet.

Основные методы интерфейса ResultSet:

  1. public boolean absolute(int row) throws SQLException — метод перемещает курсор на заданное число строк от начала, если число положительно, и от конца — если отрицательно.
  2. public void afterLast() throws SQLException — этот метод перемещает курсор в конец результирующего набора за последнюю строку.
  3. public void beforeFirst() throws SQLException — этот метод перемещает курсор в начало результирующего набора перед первой строкой.
  4. public void deleteRow() throws SQLException — удаляет текущую строку из результирующего набора и базы данных.
  5. public ResultSetMetaData getMetaData() throws SQLException — предоставляет объект метаданных для данного ResultSet. Класс ResultSetMetaData содержит информацию о результирующей таблице, такую как количество столбцов, их заголовок и т.д.
  6. public int getRow() throws SQLException — возвращает номер текущей строки.
  7. public Statement getStatement() throws SQLException — возвращает экземпляр Statement, который произвел данный результирующий набор.
  8. public boolean next() throws SQLException, public boolean previous() throws SQLException — эти методы позволяют переместиться в результирующем наборе на одну строку вперед или назад. Во вновь созданном результирующем наборе курсор устанавливается перед первой строкой, поэтому первое обращение к методу next() влечет позиционирование на первую строку. Эти методы возвращают true, если остается строка для дальнейшего перемещения. Если строк для обработки больше нет, возвращается false.
  9. public void close() throws SQLException — осуществляет немедленное закрытие ResultSet вручную. Обычно этого не требуется, так как закрытие Statement, связанного с ResultSet, автоматически закрывает ResultSet.

Пример 2. Использование интерфейса ResultSet

4. Пакетное выполнение запросов

Для выполнения набора из нескольких запросов на обновление данных в интерфейс Statement были добавлены методы:

Читать еще:  Javascript работа с базой данных

Пакетное выполнение запросов уменьшает трафик между клиентом и СУБД и может привести к существенному повышению производительности.

Пример 3. Пакетное выполнение запросов

5. Интерфейс PreparedStatement

Особенностью SQL-выражений в PreparedStatement является то, что они могут иметь параметры. Параметризованное выражение содержит знаки вопроса в своем тексте. Например:

Перед выполнением запроса значение каждого вопросительного знака явно устанавливается методами setXxx()‏, например:

Использование PreparedStatement приводит к более быстрому выполнению запросов при их многократном вызове с различными параметрами.

Пример 4. Использование интерфейса PreparedStatement

Пример 5. Использование интерфейса PreparedStatement

6. Использование properties файлов

Пример 6. Содержимое database.properties файла

Пример 7. Использование ResourceBundle для чтения данных для аутентификации

7. Data access object (DAO)

В программном обеспечении data access object (DAO) — это объект, который предоставляет абстрактный интерфейс к какому-либо типу базы данных или механизму хранения. DAO может использоваться для разных видов доступа к БД (JDBC, JPA).

Как использовать базу данных MySQL в Java

    Переводы, 24 июня 2015 в 13:46

В этой статье мы научимся подключаться к базе данных MySQL из Java-кода и выполнять простые запросы для получения и обновления данных. Для того, чтобы получить доступ к базе данных, мы будем использовать JDBC (Java Database Connectivity) API, который входит в стандартную библиотеку Java. JDBC позволяет подключиться к любой базе данных: Postgres, MySQL, SQL Server, Oracle и т. д. — при наличии соответствующей реализации драйвера, необходимого для подключения. Для базы данных MySQL мы будем использовать драйвер Type 4 JDBC из пакета mysql-connector-java-5.1.23-bin.jar . Он написан на чистой Java, а значит, нам не понадобятся какие-либо нативные библиотеки или ODBC-мост. Все, что нам надо будет сделать — это положить JAR-файл в директорию, содержащуюся в CLASSPATH. JAR-файл содержит класс com.mysql.jdbc.Driver , необходимый для подключения к MySQL. Если его не окажется в CLASSPATH, во время выполнения программы выбросится исключение java.lang.ClassNotFoundException , поэтому убедитесь, что вы правильно настроили пути.

Кстати, если вы ищете хорошую книгу по использованию JDBC, обратите внимание на Practical Database Programming with Java (Ying Bai). Это относительно новая книга, и в ней рассматриваются две самые популярные базы данных: Oracle и SQL Server 2008. В книге используется IDE NetBeans для примеров и описываются все инструменты, необходимые для работы с базами данных в Java. Это отличная книга для начинающих и опытных программистов.

Подключаем базу данных MySQL с помощью JDBC

Для того, чтобы подключить базу данных MySQL, нам потребуется четыре вещи:

  1. Строка подключения JDBC (например: jdbc:mysql://localhost:3306/test ).
  2. Имя пользователя (root).
  3. Пароль (root).
  4. База данных с некоторым количеством таблиц для примера (например, база данных книг).

Строка подключения для MySQL начинается с jdbc:mysql . Это название протокола соединения, за которым следуют хост и порт подключения, на которых запущена база данных. В нашем случае это localhost с портом по умолчанию 3306 (если вы его не поменяли при установке). Следующая часть — test — имя базы данных, которая уже существует в MySQL. Мы можем создать таблицу Books :

и наполнить ее хорошими книгами:

Программа на Java, которая использует базу данных

Теперь давайте напишем программу на Java, которая будет подключаться к нашей базе данных, запущенной на localhost . Важно помнить о том, что необходимо закрывать соединение, запросы и результат выполнения после завершения работы с ними. Также важно закрывать их в finally-блоке, со своей try/catch оберткой, поскольку сам метод close() может кинуть исключение, что приведет к утечке ресурсов. За подробной информацией вы можете обратиться к этой статье. Кроме того, вы можете использовать обертку try-with-resource, которая появилась в Java 7. Более того, это стандартный способ работы с ресурсами в Java 1.7.

При первом запуске у вас, возможно, будет ошибка No suitable driver found for jdbc:mysql , если драйвера MySQL нет в CLASSPATH:

Добавим нужный JAR-файл в путь и снова запустим программу. Другая частая ошибка — указать таблицу в строке соединения: jdbc:mysql://localhost:3306/test/book . В этом случае вылетит следущее исключение:

Успешный запуск программы выведет на экран следующее:

Результат верный, поскольку у нас в таблице только две книги: «Effective Java» и «Java Concurrency in Practice».

Кстати, если у вас был драйвер при компиляции, но отсутствует при запуске, вы получите исключение java.lang.ClassNotFoundException: com.mysql.jdbc.Driver . О том, как исправить эту ошибку, вы можете прочитать здесь.

Получаем данные с помощью SELECT-запроса в JDBC

Для получения данных из БД вы можете выполнить SELECT-запрос. В первом примере мы уже его использовали, но получили только количество строк. Теперь мы вернем сами строки. Большая часть программы останется без изменений, за исключением SQL-запроса и кода, возвращающего данные из объекта ResultSet :

Этот код выведет на экран следующее:

Читать еще:  Javascript string substring

Тут есть пара моментов, на которые следует обратить внимание. Метод rs.getInt(1) используется для получения столбца с целочисленным типом, в нашем случае это столбец «id». Индексы в JDBC начинаются с единицы, поэтому rs.getInt(1) вернет значение первого столбца как целое число. В случае, если вы укажете неверный индекс (многие разработчики вызывают rs.getInt(0) для получения первого столбца), выбросится исключение InvalidColumnIndexException . Доступ к столбцам по индексу чреват ошибками, поэтому лучше использовать имя столбца, например, rs.getInt(«id») . Подробнее об этом вы можете прочитать в этой статье. Метод getString() используется для получения строковых значений из базы (например, VARCHAR ). Цикл будет выполняться, пока rs.next() не вернет false . Это значит, что строки закончились. В нашем случае в таблице две строки, поэтому цикл выполнится два раза, выводя информацию о книгах из таблицы на экран.

Добавляем данные с помощью INSERT-запроса в JDBC

Добавление данных мало отличается от их получения: мы просто используем INSERT-запрос вместо SELECT-запроса и метод executeUpdate() вместо executeQuery() . Этот метод используется для запросов INSERT, UPDATE и DELETE, а также для SQL DDL выражений, таких как CREATE, ALTER или DROP. Эти команды не возвращают результата, поэтому мы убираем все упоминания ResultSet ‘а в коде и изменяем запрос соответственно:

После запуска программы вы можете проверить таблицу в СУБД. На этот раз вы увидите три записи в таблице:

Теперь вы умеете подключаться к MySQL из Java-приложения и выполнять SELECT, INSERT, DELETE и UPDATE-запросы так же, как и в MySQL GUI. Для подключения мы используем объект Connection , для чтения результатов запроса — ResultSet . Убедитесь перед подключением, что сервер MySQL запущен и mysql-connector-java-5.1.17-bin.jar находится в CLASSPATH, чтобы избежать ClassNotFoundException .

Когда разберетесь с подключением и простыми запросами, имеет смысл изучить, как использовать подготавливаемые запросы (Prepared Statement) в Java для избежания SQL-инъекции. В боевом коде всегда следует использовать подготавливаемые запросы и связывание переменных.

Java jdbc example

В предыдущей статье мы только познакомились с JDBC и написали простое приложение, которое позволило нам соединиться с СУБД и получить данные с помощью SQL-запроса. Хоть программа и не очень сложная, но на мой взгляд, мы сделали весьма важный шаг — мы смогли соединиться с базой данных и сделать пусть и простой, но запрос. Все, что мы рассмотрим дальше — это уже более удобные и более профессиональные способы использования JDBC.

Запросы на получение данных и запросы на обновление

SQL-запросы можно условно разделить на две группы:

  1. Получение данных — к ним относится оператор SELECT
  2. Изменение данных — к ним относятся операторы INSERT, UPDATE и DELETE

Для первой группы используется уже знакомый нам метод интерфейса StatementexecuteQuery(). В принципе для начала этого метода вполне достаточно. Он покрывает очень большой процент запросов, которые разрабатываются для реальных систем. Позже мы познакомимся с дополнительными возможностями, но на данных момент советую запомнить — если надо получить данные из таблицы, то executeQuery в подавляющем большинстве случаев будет самым правильным выбором.
Для второй группа запросов (опять же в большинстве случаев) может использоваться другой метод интерфейса StatementexecuteUpdate(). Есл посмотреть документацию, то в отличии от executeQuery() (который возвращает ResultSet) этот метод возвращает целое число, которое говорит сколько строк в таблице было изменено при исполнении вашего запроса.
Например, вы можете оператором DELETE FROM JC_CONTACT удалить ВСЕ строки (посему будьте очень аккуратны). В этом случае метод executeUpdate() вернет количество удаленных строк. В некоторых ситуациях знание о количестве измененных строк бывает удобным для построения алгоритмов работы с данными.
В принципе с этим вопросов можно закончить — главное мы уже увидели. Для выборки данных — executeQuery(). Для изменения данных — executeUpdate().

Разновидности Statement

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

Возникает вполне резонный вопрос — а зачем эти интерфейсы нужны ? Давайте разбираться. Для начала мы рассмотрим интерфейс PreparedStatement и другие возможности JDBC. К интерфейсу CallableStatement обратимся позже — его использование во-первых не так часто встречается, и во-вторых — после всего рассмотренного, про него разговор уже можно делать достаточно коротким.

PreparedStatement

Если честно перевести название, то можно получить что-то вроде «подготовленный оператор». Самым важным здесь является слово «подготовленный». В чем же заключается «подготовленность» ?
Прежде чем мы рассмотрим этот вопрос, предлагаю увидеть достаточно важный с точки зрения удобства момент, который возникает очень часто. Итак, в каком-либо приложении нам надо вставить данные о контакте в таблицу JC_CONTACT. Для этого нам надо подготовить запрос наподобие такого:

Ссылка на основную публикацию
Adblock
detector