Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java базы данных

Как использовать базу данных 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 :

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

Тут есть пара моментов, на которые следует обратить внимание. Метод 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 базы данных

Мы приступаем к одному из очень важных разделов программирования на Java — работа с базами данных. Данные являются наверно наиглавнейшей составляющей программирования и вопрос их хранения крайне актуален. Не буду больше говорить о важности этого вопроса — тут можно писать много-много-много разных интересных слов.

Сервер баз данных

Сама идея сервера баз данных и СУБД в виде отдельной программы появилось по совершенно очевидным причинам. Базы данных мгновенно стали МНОГОПОЛЬЗОВАТЕЛЬСКИМИ. Данные нужны всем и возможность одновременного доступа к ним является очевидной. Проблема базы данных в виде обычного файла заключается в том, что к этому файлу будет обращаться сарзу много программ, каждая из которых захочет внести изменения или получить данные. Организовать такой доступ на уровне файловой системы — по сути, невыполнимая задача.
Во-первых — файл должен быть доступен всем пользователям, что требует перекачку данных по сети и хранение этого файла где-то на сетевом диске. Большие объемы данных по сети (пусть даже с высокой скоростью) — кроме слова “отвратительно” у меня ничего не приходит на ум.
Во-вторых — попытка одновременной записи в файл несколькими программами обречена на провал. Для организации такого доступа обычной файловой системы явно не достаточно.
В-третьих — организация прав доступа к тем или иным данным тоже становится непосильной задачей.
В-четвертых — надо “разруливать” конфликты при одновременном доступе к одним и тем же данным.
После небольшого анализа, кроме этих вопросов, можно увидеть еще немалое количество проблем, которые надо решить при мультипользовательском доступе к данным.
В итоге было принято (и реализовано) вполне здравое решение — написать специальную программу, которая имеет несколько названий — Система Управления Базами Данных (СУБД), сервер баз данных и т.д. Я буду называть ее СУБД.
Суть и цель этой программы — организовать централизованный доступ к данным. Т.е. все запросы на получение или изменение данных от клиентских приложений (клинетов) посылаются (обычно по сети и по протоколу TCP/IP) именно в эту программу. И уже эта программа будет заниматься всеми вышеупомянутыми проблемами:

  1. СУБД будет иметь некоторый набор команд, который позволит записывать и получать данные
  2. СУБД будет сама работать с файловой системой (нередко у нее бывает своя собственная файловая система для скорости)
  3. СУБД предоставит механизмы разграничения доступа к разным данным
  4. СУБД будет решать задачи одновременного доступа к данным

В итоге мы получаем достаточно ясную архитектуру — есть СУБД, которая сосредоточена на работе с данными и есть клиенты, которые могут посылать запросы к СУБД.

При работе с СУБД клиенты должны решить достаточно четкие задачи:

  1. Клиент должен соединиться с СУБД. Как я уже упоминал, чаще всего для общения используется сетевой протокол TCP/IP. В момент подключения клиент также передает свой логин/пароль, чтобы СУБД могла его идентифицировать и в дальнейшем позволить (или не позволить) производить те или иные действия над данными
  2. Клиент может посылать команды для изменения/получения данных в СУБД
  3. Данные внутри СУБД хранятся в определенных структурах и к этим структурам можно обратиться через команды
Читать еще:  Восстановление пароля учетной записи майкрософт на windows

SQL базы данных

Могу предположить,что вышеупомянутые задачи и породили именно SQL-базы данных. В них есть удобные и понятные структуры для хранения данных — таблицы. Эти таблицы можно связывать в виде отношений и тем самым дается возможность хранить достаточно сложно организованные данные. Был придуман специальный язык — SQL (Structured Query Language — структурированный язык запросов). Этот язык хоть и имеет всего 4 команды для манипулирования данными, позволяет создавать очень сложные и заковыристые запросы.
На сегодняшний день SQL-базы данных являются самыми распространенными. В последние годы наметилась тенденция к использованию баз данных, основанные на других способах хранения и обработки данных, но пока их применение достаточно узконаправлено, хотя в некоторых случаях они действительно помогают решать важные задачи более эффективно, но все-таки пока SQL — самое главное направление баз данных. Почему я про это упоминаю ? Потому, что все наше знакомство с технологией работы с базами данных из Java будет сконцентрировано на SQL базах данных. С основными командами SQL вы можете познакомиться в различных учебниках. Их сейчас достаточно много и в большинстве своем они вполне понятны.
Возможно, что я тоже когда-нибудь внесу свою лепту в рассказы про SQL, но в данном разделе предполагается, что вы уже знакомы с основными идеями построения реляционных баз данных и с самим языком SQL.

JDBC — Java Database Connectivity — архитектура

Если попробовать определить JDBC простыми словами, то JDBC представляет собой описание интерфейсов и некоторых классов, которые позволяют работать с базами данных из Java. Еще раз: JDBC — это набор интерфейсов (и классов), которые позволяют работать с базами данных.
И вот с этого момента я попробую написать более сложное и в тоже время более четкое описание архитектуры JDBC. Главным принципом архитектуры является унифицированный (универсальный, стандартный) способ общения с разными базами данных. Т.е. с точки зрения приложения на Java общение с Oracle или PostgreSQL не должно отличаться. По возможности совсем не должно отличаться.
Сами SQL-запросы могут отличаться за счет разного набора функций для дат, строк и других. Но это уже строка запроса другая, а алгоритм и набор команд для доставки запроса на SQL-сервер и получение данных от SQL-сервера отличаться не должны.

Наше приложение не должно думать над тем, с какой базе оно работает — все базы должны выглядеть одинаково. Но при всем желании внутреннее устройство передачи данных для разных СУБД разное. Правила передачи байтов для Oracle отличается от правил передачи байтов для MySQL и PostgreSQL. В итоге имеем — с одной стороны все выглядят одинаково, но с другой реализации будут разные. Ничего не приходит в голову ?
Еще раз — разные реализации, но одинаковый набор функциональности.

Думаю, что вы уже догадались — типичный полиморфизм через интерфейсы. Именно на этом и строится архитектура JDBC. Смотрим рисунок.

Как следует из рисунка, приложение работает с абстракцией JDBC в виде набора интерфейсов. А вот реализация для каждого типа СУБД используется своя. Эта реализация называется “JDBC-драйвер”. Для каждого типа СУБД используется свой JDBC-драйвер — для Oracle свой, для MySQL — свой. Как приложение выбирает, какой надо использовать, мы увидим чуть позже.
Что важно понять сейчас — система JDBC позволяет загрузить JDBC-драйвер для конкретной СУБД и единообразно использовать компоненты этого драйвера за счет того, что мы к этим компонентам обращаемся не напрямую, а через интерфейсы.
Т.е. наше приложение в принципе не различает, обращается оно к Oracle или PostgreSQL — все обращения идут через стандартные интерфейсы, за которыми “прячется” реализация.

Пока я предлагаю отметить несколько важных интерфейсов, которые мы будем рассматривать позже, но мне бы хотелось, чтобы у вас этот список уже был, чтобы вы могли по мере прочтения отмечать — “да, вот он важный интерфейс/класс и я теперь знаю, куда он встраивается”. Вот они:

  1. java.sql.DriverManager
  2. java.sql.Driver
  3. java.sql.Connection
  4. java.sql.Statement
  5. java.sql.PreparedStatement
  6. java.sql.CallableStatement
  7. java.sql.ResultSet

Теперь давайте рассмотрим несложный пример и поймем, как работает JDBC.

JDBC — пример соединения и простого вызова

Попробуем посмотреть на несложном примере, как используется JDBC-драйвер. В нем же мы познакомимся с некоторыми важными интерфейсами и классами.

Предварительно нам необходимо загрузить JDBC-драйвер для PostgreSQL. На данный момент это можно сделать со страницы PostgreSQL JDBC Download

Если вы не нашли эту страницу, то просто наберите в поисковике “PostgreSQL JDBC download” и в первых же строках найдете нужную страницу.
Т.к. я пишу эти статьи для JDK 1.7 и 1.8, то я выбрал строку “JDBC41 Postgresql Driver, Version 9.4-1208” — может через пару-тройку лет это будет уже не так.
Если вы выполнили SQL-скрипт из раздела Установка PostgreSQL, который создавал таблицу JC_CONTACT и вставил туда пару строк, то эта программа позволит вам “вытащить” эти данные и показать их на экране. Это конечно же очень простая программа, но на ней мы сможем посмотреть очень важные моменты. Итак, вот код:

Для запуска этой програмы необходимо подключить JDBC-драйвер для PostgreSQL. Прочитайте раздел Что такое JAR-файлы для того, чтобы подключить нужный JAR с JDBC-драйвером к проекту в NetBeans.
Для запуска нашей программы из командной строки достаточно собрать этот код (причем здесь не надо подключать JAR на этапе компиляции — только на момент запуска).
Итак, команда для сборки:

И теперь команда для запуска:

Для запуска проекта в NetBeans предлагаю вам самостоятельно разобраться, как подключить JAR-файл — пример этого указан в статье Что такое JAR-файлы

Начнем разбор нашей программы с самого начала. Итак, в чем же заключается набор вызовов для создания соединения с базой

Вызов Class.forName() мы уже встречали, когда разговаривали о рефлексии. Если вы этого не сделали — обязательно прочитайте, иначе многое будет непонятно. Так вот наш вызов загружает один из ключевых классов JDBC, который реализует очень важный интерфейс java.sql.Driver. Почему этот класс так важен, мы разберем чуть ниже.
Следующим важным вызовом явлется DriverManager.getConnection(url, login, password);.
Думаю, что параметры login и password достаточно оччевидны — это логин и пароль для подключения к СУБД. А вот первый параметр — url надо рассмотреть подробно.
Параметр url является строкой и я люблю его разбивать на две части. Первая часть jdbc:postgresql: позволяет идентифицировать, к какому типу СУБД вы подключаетесь — Oracle, MySQL, PostgreSQL, IBM DB2, MS SQL Server. В нашем случае тип базы данных — PostgreSQL.
Вторая часть — //localhost:5432/contactdb — определяет конкретный экземпляр выбранной базы данных. Т.е. если первая часть url указывает, что мы хотим работать с PostgreSQL, то вторая часть указывает на каком хосте и на каком порту (опять вспоминаем основы TCP/IP) работает конкретный экземпляр PostgreSQL. Еще раз — первая часть поределяет только тип, вторая часть — параметры оединения с конкретным экземпляром СУБД.
Как вы можете видеть, вторая часть включает помимо IP-адреса и порта (localhost:3306) включает имя базы данных, с которой вы будете соединяться.

И вот теперь возвращаемся к интерфейсу java.sql.Driver. Достаточно очевидно, что сложное приложение на Java может работать с несколькими типами СУБД и одновременно в приложнении участвуют несколько JDBC-драйверов для разных типов СУБД. Так как же класс DriverManager определяет, какой тип СУБД вы собираетесь использовать ?
Придется нам вернуться к моменту загрузки класса — Class.forName(). Большинство классов в момент своей загрузки выполняют очень важный шаг — они РЕГИСТРИРУЮТСЯ у класса DriverManager. Как они это делают ? Посмотрите документацию на класс DriverManager — например здесь:
DriverManager
Среди методов мы можете найти этот: registerDriver(Driver driver). Причем метод статический и создавать экземпляр DriverManager не надо. Таким образом драйвер под конкретный тип СУБД регистрируется у DriverManager. У этого класса (можно глянуть в исходники) создается список драйверов, каждый из которых реализует интерфейс java.sql.Driver. Что же происходить дальше ? Зайдем в документацию java.sql.Driver. Там есть два очень интересных метода:

  1. boolean acceptsURL(String url)
  2. Connection connect(String url, Properties info)

Работа с базами данных с помощью JDBC драйвера

В этом уроке я бы хотел вас научить работать с базами данных MySQL, PostgreSQL, Oracle. А именно как подключится и выполнять SQL запросы к базе с помощью java.

Что такое JDBC?

JDBC Driver – (Java DataBase Connectivity — соединение с базами данных на Java) — платформенно-независимый промышленный стандарт взаимодействия Java-приложений с различными СУБД, реализованный в виде пакета java.sql , входящего в состав Java SE.

Зачем нужен JDBC?

JDBC – позволяет получать доступ к БД, а также выполнять к ней SQL запросы.

Читать еще:  Как восстановить удаленные фото на компьютере windows

Шаг 1.

Скачиваем jar файл JDBC драйвера.

Шаг 2.

Подключение к БД Mysql:

Подключение к БД PostgreSQL:

Подключение к БД Oracle:

В 1-й строке мы указываем наш JDBC драйвер. Не забудьте добавить его в ClassPath иначе его компилятор его не увидит.
Во 2-й строке JDBC Manager который открывает соединение с базой данных и обеспечит нам дальнейшее обращение к ней.
И последняя строка закрывает соединение с БД.

Желательно строку для определения JDBC поместить в блок try для того чтобы контролировать его наличия в вашем приложении.

Шаг 3. Создание таблиц в БД.

Вынесем в отдельный метод соединение с БД.

Этот метод будет создавать в БД таблицу:

и в main методе вызываем метод createDbTable() который создаст таблицу в БД.

В результате вы должны получить:

Шаг 4. Добавление новой записи в БД.

метод который будет возвращать текущую дату и время:

И выполняем наш SQL запрос который лежит в переменной insertTableSQL

Шаг 5. Получение данных с БД.

Шаг 6. Удаление данных с БД.

Выполняем запрос на удаление:

Шаг 7. Обновление данных в БД.

Выполняем запрос на обновление записи:

Выводы.

Все действия с любой базой данных выполняются через SQL запросы, то есть нам достаточно знать SQL для манипуляцией данными в БД.

ПОХОЖИЕ ПУБЛИКАЦИИ

29 комментариев к статье «Работа с базами данных с помощью JDBC драйвера»

Проблема с подключением jdbc к приложению для Android – заголовок комментария.

Почему в жизни так бывает …

строка Connection connection = DriverManager.getConnection(“jdbc:postgresql://хост:порт/имя_дб”,”пользователь”, “пароль”);
выдаёт ошибку Unhandled exception type SQLException
( строка connection.close(); – выдаёт туже ошибку )

При добавлении строки import java.sql.SQLException; в MainActivity.java
выводит сообщение …
The import java.sql.SQLException is never used

При этом файл postgresql-9.2-1002.jdbc4.jar лежит в /libs

И в classpath добавлять пробовал, хотя многие источники говорят, что это не обязательно, достаточно держать файл postgresql-9.2-1002.jdbc4.jar в /libs

При нажатие ctrl+shift+O Eclips добавляет только:

Java и базы данных

Java, начинавшая свой путь как средство украшения Web-страниц, постепенно переходит в разряд ключевых технологий для построения сетей intranet и сложных корпоративных приложений. Это стало возможным благодаря появлению в Java средств для работы с базами данных, без которых невозможно обойтись в сложных корпоративных системах.

Варианты архитектуры

Чтобы понять, какую роль может выполнять Java-программа в работе с базами данных, необходимо вспомнить несколько архитектур, которые используются для построения сложных клиент-серверных систем. Мы не будем рассматривать случай одноуровневой системы клиент-сервер, так как этот вырожденный случай использования баз данных просто не требует применения Java. В более сложной двухуровневой архитектуре клиент-сервер можно написать на Java пользовательский интерфейс, который будет общаться с базой данных на удаленном сервере, например, с помощью SQL-запросов. При разработке такого клиентского ПО уже потребуются абстрактные средства Java для составления SQL-запросов, которые можно настроить на работу с различными базами данных. Есть два способа связи с БД: статический (JSQL) и динамический (JDBC). JSQL — это расширение языка Java за счет добавления в него элементов SQL.

Текст JSQL-программы уже не является текстом Java, но он может быть преобразован в него с помощью специальной программы, называемой JSQL-транслятором. Эта программа проверяет правильность составления SQL-запросов, соответствия типов переменных и SQL-процедур. Таким образом, при разработке программ с помощью JSQL ошибки выявляются еще на этапе компиляции. Кроме того, разработанные с помощью JSQL программы работают быстрее, они лучше отлажены и имеют меньший размер. Однако при использовании JSQL нет возможности менять SQL-запросы во время исполнения программы, впрочем, в большинстве случаев этого и не требуется.

JDBC, в отличие от JSQL, позволяет динамически определять SQL-запросы. Этот метод общения с базами данных строится на основе стандартной библиотеки, которая распространяется с JDK 1.1. JDBC определят набор Java-классов, с помощью которых можно обратиться к любой базе данных через специальные JDBC-драйверы. Такая архитектура является более гибкой, так как позволяет менять SQL-запросы уже во время работы программы. Однако JDBC не проверят правильность SQL-запросов, поэтому если в программе есть ошибки, то это может выясниться только во время ее выполнения. Очень часто логика приложения пишется на JSQL, а потом тексты JSQL преобразуются в JDBC как низкоуровневое средство общения с базами данных. В этом случае JSQL-транслятор проверяет правильность составления SQL-запросов, а тонкую настройку можно в случае необходимости произвести уже с помощью JDBC.

Следует отметить, что JDBC может работать как напрямую с базой данных, так и через промежуточный слой — сервер приложений. Однако для связи Java-приложений с базами данных можно вообще обойтись без прямого общения Java-программы с базой данных. Это возможно в трехуровневой архитектуре клиент/сервер. Если сервер приложений уже разработан и отлажен, то можно запросы из Java-программы передавать этому серверу, который и будет работать с базой данных. Дело в том, что сервер приложений, реализованный на Java, в большинстве случаев менее эффективен, чем, например, сервер на С++. Если же система строится по трехуровневой архитектуре клиент/сервер, то лучше не применять средства прямого общения Java-программ с базами данных, а обойтись просто удаленными вызовами С-программ, которые расположены на сервере приложений.

Если в Java-программе используется ограниченный набор функций для работы с СУБД или же необходимо обеспечить надежную работу Java-приложения и базы данных, то в этом случае лучше всего подойдет JSQL. Если в Java-программе предусмотрен небольшой набор функций для работы с СУБД, то лучше оформить такую программу с помощью JSQL, который обеспечит соответствие типов и самих SQL-запросов еще на этапе ее написания. Пользователь просто не сможет составить неверный запрос и что-то повредить в базе данных. Кроме того, JSQL-транслятор оптимизирует работу Java-приложений по времени, что позволяет создать наиболее быструю реализацию программы и оптимизировать использование ресурсов системы.

Есть два типа JSQL-трансляторов, один из которых транслирует программу непосредственно в байт-коды, а другой — в текст Java-программы, который впоследствии можно откомпилировать любым Java-компилятором.

Собственно, использование JSQL похоже на работу с прекомпилятором в С/С++. Даже выражения JSQL немного напоминают команды прекомпилятора С:

Этот оператор удаляет столбец из таблицы TAB. Более сложный пример программы на JSQL приведен во врезке «Пример Java-программ на JSQL и JDBC».

Вообще говоря, существуют SQL-расширения различных языков программирования — С, COBOL, FORTRAN, ADA. Однако JSQL имеет серьезные преимущества перед другими вариантами расширений, обусловленные свойствами самого языка Java. Перечислим некоторые из них.

  • Java самостоятельно занимается управлением памятью (например, с помощью «сборщика мусора»), что позволяет не заботиться об использовании памяти в программах JSQL.
  • Все Java-типы очень хорошо структурированы и имеют нулевое значение null, которое можно использовать для нулевого состояния — SQL Null.
  • Кросс-платформенные возможности Java обеспечивают легкую переносимость JSQL-программ. Впрочем, некоторые JSQL-трансляторы используют особенности конкретной базы данных и генерируют непереносимую Java-программу. Для обеспечения хорошей переносимости транслятор должен использовать только стандартные и абстрактные механизмы Java типа JDBC.
  • Java-приложения являются бинарно совместимыми на всех платформах, и поэтому написанное на Java приложение базы данных может работать в сложной гетерогенной сети на различных платформах без перекомпиляции.

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

    Стандартным решением для организации связи Java-приложений с базой данных является JDBC. Именно эта библиотека входит в комплект JavaBeans и поставляется в комплекте средств разработки JDK 1.1. Эта библиотека обеспечивает Java-программам универсальное средство для работы с СУБД. JDBC работает аналогично ODBC — универсальному механизму доступа к базам данных, разработанному компанией Microsoft. Собственно, вызовы методов JDBC могут преобразовываться в вызовы функций ODBC с помощью специального моста JDBC — ODBC. JDBC выполняет три основные функции работы с базами данных:

  • установление связи с СУБД;
  • передача базе данных SQL-запросов;
  • обработка полученных результатов.

    Архитектура JDBC подразумевает использование как минимум четырех частей: Java-приложения, которое вызывает методы JDBC; собственно компонента JDBC, который распределяет клиентские вызовы по соответствующим базам данных; драйвера JDBC, который поддерживает сеанс связи с конкретной базой данных, и, наконец самой базы данных. Если драйвер JDBC поставляется производителем базы данных, то Java-приложение может получить доступ к ней через механизм JDBC без посредников. Этот вариант JDBC позволяет работать в двухуровневой архитектуре клиент-сервер.

    Однако если JDBC-драйвера по каким-либо причинам нет, можно воспользоваться стандартными драйверами ODBC, используя специальный мост JDBC — ODBC. В результате обращение к базе данных из Java-приложения будет выполняться по следующей цепочке: Java-приложение — JDBC — мост JDBC — ODBC — драйвер ODBC — база данных. Собственно, мост больше всего подходит для корпоративной системы с трехуровневой архитектурой, так как для работы такой системы требуется промежуточный сервер, на котором работает ODBC. Еще один вариант использования JDBC в трехуровневой архитектуре — это когда Java-программа связывается с сервером приложений по стандартному протоколу, а серверная Java-программа преобразует вызовы в протокол, используемый определенной базой данных.

    Читать еще:  Можно ли восстановить удаленные сообщения на авито

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

    В общем, JDBC предлагает полный набор необходимых низкоуровневых функций для связи с базами данных (см. врезку «Пакет java.sql»), который может быть использован другими приложениями или трансляторами JSQL. Следует отметить, что метод CallableStatement позволяет запускать внутренние процедуры СУБД, что весьма важно в тех случаях, когда пользователям запрещено напрямую изменять содержание базы данных, но разрешено работать с определенными функциями СУБД. Этот метод позволяет более точно настроить права доступа пользователей к базе данных.

    Очевидно, что оба метода установки связи между Java-программами и базами данных найдут применение у разработчиков. Все будет зависеть от требований, предъявляемых к Java-программам: можно выбрать максимально гибкий доступ к базе данных или надежную и устойчивую работу всей системы. Видимо, если приложение разрабатывается в расчете на Web, например, для предоставления сотрудникам компании доступа к определенным базам данных, то лучше всего использовать JDBC, как более гибкий и настраиваемый инструмент. Если же предполагается использовать Java-программы в качестве клиентов сложной системы, например, для организации работы банка, то, видимо, такие программы лучше писать на JSQL, чтобы уменьшить риск выхода системы из строя и обеспечить наиболее быстрый доступ к базе данных.

    Полезные ресурсы по работе Java с СУБД

    www.javasoft.com/jdbc/index.html — страница на сервере JavaSoft, посвященная JDBC;

    www.oracle.com — на этом сервере можно найти более подробную информацию о JSQL;

    www.javaworld.com — интерактивный журнал, посвященный различным аспектам Java-технологии;

    Пример Java-программ на JSQL и JDBC

    Рассмотрим пример программ на JSQL и JDBC, в которых Java-приложение связывается с базой данных STUDENT и распечатывает из него некоторую информацию о студентах. Фрагмент такой программы, написанный на JSQL, выглядит следующим образом:

    Тот же самый пример, но реализованный с помощью JDBC, будет выглядеть так:

    Переменная recs содержит объект типа java.sql.Connection, который обеспечивает связь с соответствующей базой данных.

    За пределами обоих текстов остались функции, которые открывают сеанс связи с базой данных.

    Пакет java.sql

    Пакет java.sql содержит классы и интерфейсы JDBC. Имеются следующие типы интерфейсов:

    Driver — определяет методы как драйвера, так и менеджера драйверов JDBC;

    Connection — выбирает методы для создания сеанса связи с базой данных;

    DatabaseMetaData — устанавливает методы для получения сведений о базе данных, с которой работает приложение;

    Statement — методы для передачи SQL-запроса базе данных;

    PreparedStatement — аналогичен Statement, но сохраняет бинарные планы обслуживания запроса для дальнейшего использования;

    CallableStatement — обеспечивает выполнение хранимых в базе данных SQL-процедур;

    ResultSet — методы для обработки результата обращения к базе данных;

    ResultSetMetaData — методы получения информации о типах данных, хранящихся в ResultSet;

    В состав пакета входят следующие классы:

    Date — спецификация SQL-типа DATE;

    Numeric — спецификация SQL-типов DECIMAL и NUMERIC;

    Time — спецификация SQL-типа TIME;

    Timestamp — спецификация SQL-типа TIMESTAMP;

    DriverManager — управление JDBC-драйверами;

    DriverPropertyInfo — информация о JDBC-драйверах;

    Types — управление дополнительными SQL-типами.

    Кроме того, в состав пакета java.sql входят обработчики исключительных ситуаций DataTruncation, SQLException и SQLWarning.

    Поделитесь материалом с коллегами и друзьями

    Собеседование по Java EE — SQL, JDBC (вопросы и ответы)

    Вопросы и ответы для собеседования о применении SQL, JDBC в Java разработке.

    к списку вопросов раздела JEE

    Вопросы

    1. ANSI SQL
    2. Основные элементы баз данных – таблицы, процедуры, функции, констрейнты и т.д..
    3. Как вы понимаете null в базах данных?
    4. Агрегатные функции, как они работают с null. Не забудьте о group by и having
    5. Каким образом лучше добавлять большое количество записей в таблицу?
    6. Что такое первая нормальная форма и процесс нормализации? Какие бывают нормальные формы?
    7. В чем смысл индекса СУБД, как они устроены, как хранятся? Как бы вы реализовали тот же функционал?
    8. Что такое JDBC API и когда его используют?
    9. Что такое JDBC Driver и какие различные типы драйверов JDBC вы знаете?
    10. Как JDBC API помогает достичь слабой связи между Java программой и JDBC Drivers API?
    11. Что такое JDBC Connection? Покажите шаги для подключения программы к базе данных.
    12. Как используется JDBC DriverManager class?
    13. Как получить информацию о сервере базы данных из java программы?
    14. Что такое JDBC Statement?
    15. Какие различия между execute, executeQuery, executeUpdate?
    16. Что такое JDBC PreparedStatement?
    17. Как установить NULL значения в JDBC PreparedStatement?
    18. Как используется метод getGeneratedKeys() в Statement?
    19. Какие преимущества в использовании PreparedStatement над Statement?
    20. Какие есть ограничения PreparedStatement и как их преодолеть?
    21. Что такое JDBC ResultSet?
    22. Какие существуют различные типы JDBC ResultSet?
    23. Как используются методы setFetchSize() и SetMaxRows() в Statement?
    24. Как вызвать Stored Procedures используя JDBC API?
    25. Что такое JDBC Batch Processing и каковы его преимущества?
    26. Что такое JDBC Transaction Management и зачем он нужен?
    27. Как откатить JDBC транзакцию?
    28. Что такое JDBC Savepoint и как он используется?
    29. Расскажите о JDBC DataSource. Какие преимущества он дает?
    30. Как создать JDBC пул соединений используя JDBC DataSource и JNDI в Apache Tomcat Server?

    31. Расскажите про Apache DBCP API.
    32. Какие вы знаете уровни изоляции соединений в JDBC?
    33. Что вы знаете о JDBC RowSet? Какие существуют различные типы RowSet?
    34. В чем разница между ResultSet и RowSet?
    35. Приведите пример наиболее распространенных исключений в JDBC.
    36. Расскажите о типах данных CLOB и BLOB в JDBC.
    37. Что вы знаете о «грязном чтении» (dirty read) в JDBC? Какой уровень изоляции предотвращает этот тип чтения?
    38. Какие есть две фазы commit?
    39. Приведите пример различных типов блокировки в JDBC.
    40. Как вы понимаете DDL и DML выражения?
    41. Какая разница между java.util.Date и java.sql.Date?
    42. Как вставить изображение или необработанные данные в базу данных?
    43. Что вы можете рассказать о фантомном чтении? Какой уровень изоляции его предотвращает?
    44. Что такое SQL Warning? Как возвратить SQL предупреждения в JDBC программе?
    45. Как запустить Oracle Stored Procedure с объектами базы данных IN/OUT?
    46. Приведите пример возникновения java.sql.SQLException: No suitable driver found.
    47. Best Practices в JDBC.

    Ответы

    1. ANSI SQL

    SQL (structured query language — «язык структурированных запросов») — формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД). SQL основывается на исчислении кортежей. Стандарт SQL определяется с помощью кода ANSI.
    *Вопрос «расскажите о SQL» очень широкий и не вписывается в рамки этой статьи. К прочтению любая инфа из интернета, например:

    SQL : ОБЗОР: http://www.sql.ru/docs/sql/u_sql/ch2.shtml
    Wiki: https://ru.wikipedia.org/wiki/SQL

    2. Основные элементы баз данных – таблицы, процедуры, функции, констрейнты и т.д.

    Поле — это минимальный элемент базы данных, содержащий один неделимый квант информации. Каждое поле характеризуется именем и типом хранящихся в нем данных.
    Запись — это совокупность нескольких разнородных полей, описывающая некоторую сущность предметной области.
    Таблица базы данных — это набор однородных записей.

    Хранимая процедура — объект базы данных, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на сервере. Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения.

  • Ссылка на основную публикацию
    ВсеИнструменты 220 Вольт
    Adblock
    detector
    ×
    ×