63473

Java DataBase Connectivity. Основы языка SQL

Лекция

Информатика, кибернетика и программирование

Чтобы получить доступ в БД, поставляемой некоторым поставщиком, вы обращаетесь через разработанный поставщиком движок, в котором используется своя реализация SQL. Несовместимость, главным образом, связана с встроенным SQL и хранимыми процедурами (stored procedure).

Русский

2014-07-15

162 KB

3 чел.

I. Java DataBase Connectivity                                                                                                    Лекция 8.

Чтобы получить доступ в БД, поставляемой некоторым поставщиком, вы обращаетесь через разработанный поставщиком движок, в котором используется своя реализация SQL. Несовместимость, главным образом, связана с встроенным SQL и хранимыми процедурами (stored procedure). Чтобы разрешить эту несовместимость, Вам необходимо реализовать два разных приложения, если Вы хотите поддерживать 2 различные БД.

Banking Application (DB2)

DBMS (DB2)

Banking Application (Oracle)

DBMS (Oracle)

                                                                                                                                                 1

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

- общего доступа к данным;

- доступа, определяемого конкретной СУБД.

Application

↓                                                                                          ↑

Generic Data Access

↓                                                                                          ↑

DBMS Specific Data Access

↓                                                                                          ↑

DBMS

                                                                                                                                                2

Примером реализации такой архитектуры является Open DataBase Connectivity (ODBC). Но тут возникает другой тип несовместимости, если вы хотите, чтобы Ваше приложение работало на разных платформах. Многие языки программирования не могут полностью переноситься между платформами. Выход – Java и его API.

Application

        ↓                                                                                         ↑

ODBC Driver Manager

↓                                        ↑                        ↓                                     ↑

ODBC Driver (DB2)

ODBC Driver  (Oracle)

                                         

DBMS (DB2)

DBMS (Oracle)

                                                                                                                                              3

Какую клиент-серверную архитектуру выбрать, чтобы оптимизировать использование вашей БД? На данный момент ответ единственный – трех-уровневую. В Интернет-окружении web-browser (или java-приложение будет являться первым уровнем, web-сервер – вторым, а сервер СУБД – третьим. Второй уровень также называется middleware.

Приложение делится на две части – клиентскую и серверную.

Что есть JDBC и чем он отличается от других архитектур?

JDBC™ - это прикладной программный интерфейс (далее API) Java™ для выполнения запросов. Он состоит из множества классов и интерфейсов, написанных на языке Java. JDBC предоставляет стандартный API для разработчиков, использующих базы данных (далее БД). С помощью JDBC можно писать приложения на языке Java, использующие БД.

С помощью JDBC легко отсылать SQL-запросы почти ко всем реляционным БД. Другими словами, использование JDBC API избавляет от необходимости для каждой СУБД (Informix, Oracle и т.д.) писать свое приложение. Достаточно написать одну единственную программу, использующую JDBC API, и эта программа сможет отсылать SQL-запросы к требуемой БД. Кроме того, это приложение будет переносимо на различные платформы.

JDBC расширяет и без того богатую функциональность Java. Например, можно опубликовать в Интернет веб-страницу, содержащую апплет, связанный с БД на сервере. Еще один пример: организация с помощью JDBC может подключить всех сотрудников к одной БД, даже если мы имеем дело с конгломератом операционных систем на рабочих станциях сотрудников – Windows, Macintosh, UNIX.

JDBC против ODBC и других API

В настоящее время, возможно, ODBC наиболее популярен при разработке приложений для доступа к БД. Этот интерфейс «понимают» почти все СУБД на всех платформах. Возникает вопрос: в а почему бы не использовать ODBC в языке Java?

Дело в том, что лучше использовать так называемый мост JDBC-ODBC, который рассмотрим позже. На поставленный вопрос существует несколько ответов:

1. ODBC использует интерфейс наиболее родной для языка С и не совсем подходящий для Java. Вызовы C-кода из языка Java страдают плохой защищенностью, гибкостью и переносимостью приложений.

2. Непосредственная трансляция интерфейса ODBC API в Java API нежелательна по той причине, что в языке Java нет адресной арифметики, а ODBC активно ее использует в виде указателей void*.

3. ODBC сложнее для изучения. Он перемешивает в себе одновременно и простые, и сложные возможности и требует сложных программистских «выкрутасов» даже для выполнения простейших запросов. В то же время в JDBC все простое делается просто, но и сложные возможности остаются доступными.

4. JDBC отвечает концепции «истинной Java». Когда используется ODBC, необходимо на каждую клиентскую машину ставить odbc-драйвер. Если JDBC-драйвер написан целиком на языке Java, то приложение, использующее его, лишено такого недостатка и, кроме того, обладает переносимостью и защищенностью, присущей языку Java.

Короче говоря, JDBC – это «родной» для Java интерфейс к базовым абстракциям и концепциям языка SQL. Он чем-то похож на ODBC, поэтому программистам, знакомым с ODBC, изучить JDBC не составит труда.

Двухзвенные и трехзвенные модели

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

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

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

Основы языка SQL

Одна из основных проблем при работе с базами данных – это война между компаниями этого рынка за право навязывания своего понимания баз данных. Существует «стандартный» язык баз данных – структурированный язык запросов Structured Query Language (SQL-92), но вы обычно должны знать с базой данных какого производителя вы работаете, несмотря на стандарт. Технология JDBC изначально является платформенно-независимой, так что вам нет необходимости заботиться о том, какую базу данных вы используете во время работы с ней. Однако все еще возможно делать зависимые от производителя вызовы из JDBC, так что вы не ограничены и можете делать то, что вам нужно.

Одним из таких мест, где программистам может понадобиться использовать имена типов SQL, является выражение CREATE TABLE, когда они создают новую таблицу данных и определяют SQL тип для каждого столбца. К сожалению, существуют значительные различия между SQL типами, поддерживаемыми различными производителями баз данных. Различные базы данных, использующие одну и ту же семантику и структуру данных, могут использовать для них различные имена типов. Большинство наиболее известных баз данных поддерживают типы данных SQL для больших бинарных значений: в Oracle этот тип называется LONG RAW, Sybase называет его IMAGE, Informix называет его BYTE, а DB2 называет его LONG VARCHAR FOR BIT DATA.  Поэтому если переносимость между базами данных является вашей целью, вы должны попробовать обойтись только основными идентификаторами SQL типов.

Элементы синтаксиса

1. Создание БД

CREATE DATABASE book

2. Создание таблиц

CREATE TABLE publishers

(

publisher_id                 DECIMAL (4,0)               NOT NULL,

pubTitle                        char (20)           NOT NULL

)

CREATE TABLE books

(

book_id                char (13)           FOR BIT DATA NOT NULL,

isbn     char (10)         NOT NULL,

title                  char (20)           NOT NULL,

publicationYear           date,

retailPrice                    DECIMAL (12,2)                 NOT NULL,

publisher_id                 DECIMAL (12,2)                 NOT NULL

)

3. Создание индексов и первичных ключей

CREATE UNIQUE INDEX isbnByID ON books

(

isbn                      ASC

)

ALTER TABLE publishers

ADD PRIMARY KEY (publisher_id)

ALTER TABLE books

ADD PRIMARY KEY (book_id)

ALTER TABLE books

             ADD FOREIGN KEY (publisher_id)

                           REFERENCES publishers

                           ON DELETE RESTRICT;

4a. Вставка данных

INSERT INTO books (book_id, isbn, title, publicationYear, retailPrice,

publisher_id) VALUES

(generate_unique ( ), ‘0789708019’, ‘Webmaster cookbook’, ‘2001-07-04’, 50.55,

1234)

INSERT INTO books VALUES

(generate_unique ( ), ‘0789708019’, ‘Webmaster cookbook’, ‘2001-07-04’, 50.55,

1234)

INSERT INTO books (book_id, isbn, title, retailPrice, publisher_id) VALUES

(generate_unique ( ), ‘0789708019’, ‘Webmaster cookbook’, 50.55, 1234)

INSERT INTO books (book_id, isbn, publicationYear, retailPrice, publisher_id)

VALUES

(generate_unique ( ), ‘0789708019’, 2001-07-04’, 50.55, 1234)

Полный синтаксис:

INSERT INTO имя_таблицы [ (список столбцов) ] VALUES (список данных)

Замечание. Элементы, заключенные в квадратные скобки ( [ ] ), являются необязательными, и их можно опустить. То, что выделено курсивом, следует заменить реальными именами таблиц, столбцов и значений данных. ПРОПИСНЫМИ БУКВАМИ набраны команды SQL, которые не меняются. И хотя для большинства интерпретаторов не имеет значения, какими буквами (прописными или строчными) набраны команды SQL, традиционно программисты выделяют SQL-инструкции прописными  буквами. Если для некоторого параметра существует несколько предопределенных значений, они отделяются вертикальной чертой ( ׀  ). Повторение элементов синтаксиса обозначается троеточием ( . . . ).

4б. Извлечение информации

SELECT title,  publicationYear FROM books WHERE retailPrice = 50.55

Полный синтаксис:

SELECT [ ALL ׀  DISTINCT ] список_ аргументов

FROM { таблица ׀  вид }

[    WHERE условия_поиска ]

[   GROUP BY столбец  [  , столбец  ] [. . .]  ]

             [ HAVING условия_поиска   ]

[    ORDER BY { столбец  ׀ номер_аргумента }   [ ASC ׀ DESC ]  ]

             [   ,   { столбец  ׀ номер_аргумента }   [ ASC ׀ DESC ] [. . .] ]

Извлечение информации из нескольких таблиц (объединенная выборка). Объединение, основанное на операторе равенства, называется эквивалентным или равным объединением. Эквивалентное объединение, в котором столбец объединения указан только однократно, называется естественным объединение, например:

SELECT books.isbn, books.title, books.publisher_id

FROM books, publishers

WHERE books.publisher_id = publishers. publisher_id

А вот пример эквивалентного объединения, которое не является естественным:

SELECT books.isbn, books.title, books.publisher_id, publishers. publisher_id

FROM books, publishers

WHERE books.publisher_id = publishers. publisher_id

4в. Редактирование данных

UPDATE books

SET retailPrice = 39.67

WHERE isbn =’0789708019’

Полный синтаксис:

UPDATE  имя_ таблицы SET [ имя_столбца=выражение  [  , имя_столбца=выражение]  [. . . ]  ]

4г. Удаление данных

DELETE FROM books

WHERE publicationYear < 2000

Полный синтаксис:

DELETE FROM имя таблицы

[WHERE условия_поиска]

Пример:

                            DELETE FROM books

5. Удаление таблиц и баз данных

DROP TABLE books

DROP DATABASE book

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

JAR

Java Applet

JDBC Driver

. . .

 2

Web Server

Java Applet

JDBC Driver

. . .

                                                   1

Web Browser

 

Java Applet

       ↑

JDBC Driver

←. .

                     

Database Server

3                                  

 4

Структура JDBC приложения

Start of JDBC App

Load JDBC driver

                             

Connect to the database

Create a Statement object

Prepared

Statement

Statement

Caltable

Statement

Execute the SQL using the Statement object

(get result set for select)

Process results

End of JDBC App

 

                                                                                                                      5

Библиотека JDBC, как и большинство API в Java, была спроектирована так, что пользоваться ей было максимально просто. Вызовы методов, которые вы будете делать, непосредственно связаны с логическими

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

Для получения платформо-независимости, JDBC предоставляет менеджер драйверов (driver manager) который динамически использует все объекты драйверов, которые необходимы вашей программе для проведения запросов. Так что если у вас есть базы данных от трех производителей, к которым вы хотите подсоединиться, вам нужно три различных объект-драйвера. Объекты-драйверы регистрируют себя с помощью менеджера драйверов во время загрузки, а вы можете принудительно выполнить загрузку, используя  Class.forName ( ).

Для открытия базы данных вы базы данных вы должны создать “URL базы данных”, который указывает:

  1.  Что вы используете JDBC с помощью “jdbc”.
  2.  «Подпротокол»: имя драйвера или имя механизма соединения с базой данных. Так как назначение JDBC было вдохновлено ODBC, первый доступный подлежащий протокол – это “jdbc-odbc мост“, обозначаемый odbc.
  3.  Идентификатор базы данных. Он варьируется в зависимости от используемого драйвера базы данных, но обычно предоставляет логическое имя, которое отображается программным обеспечением администрирования базы данных на физический директорий, в котором расположены таблицы базы данных. Чтобы идентификатор базы данных что-либо значил, вы должны зарегистрировать имя, используя ваше программное обеспечение администрирования базы данных. (Процесс регистрации различен для разных платформ).

ODBC Data Sources

Вся эта информация комбинируется в одну строку: “URL базы данных”. Например, для подключения через надлежащий протокол ODBC к базе данных с идентификатором “people”, URL базы данных может быть:

String dbUrl = “jdbc : odbc : people”;

Если вы подключаетесь по сети, URL базы данных будет содержать информацию для подключения, идентифицирующую удаленную машину и может быть немного пугающим. Вот пример работы с базой данных CloudScape, которую вызывает удаленный клиент, использующий RMI:

jdbc : rmi : / / 192.168.170.27 : 1099/ jdbc : cloudscape : db

Этот URL базы данных на самом деле содержит два jdbc вызова в одном. Первая часть jdbc : rmi : / / 192.168.170.27 : 1099/ “ использует RMI для создания с удаленной машиной баз данных, следящей за портом 1099 по IP адресу 192.168.170.27. Вторая часть URL, jdbc : cloudscape : dbпередает более привычные установки, используя подлежащий протокол и имя баз данных, но это произойдет только после того, как первая секция установит соединение с удаленной машиной через RMI.

Когда для присоединения к базе данных будет все готово, вызовите статический (static) метод DriverManager.getConnection ( ) и передайте ему URL базы данных, логин и пароль для входа в базу данных. Обратно вы получите объект Connection, который затем вы можете использовать для проведения запросов и манипуляций с базой данных.

Пример:

String  driverName = “COM.ibm.db2.jdbc.app.DB2Driver”;

         String url = “jdbc:db2:book”;

         try {

                 / / Запрашиваем драйвер

                 DriverManager.getDriver ( url);

         } catch (java.sql.SQLException e ) {

                    System.out.println ( e.getMessage ( ) );

                    try {

                            / / Если не получается, то пробуем так загрузить

                            Class.forName ( driverName ).newInstance ( );

                    } catch (Exception e1) {

                               System.out.println ( e1.getMessage ( ) );   

                    }

         }

         try {

                   / / Устанавливаем соединение 

                    Connection con = DriverManager.getConnection (url, “boss”, “777”);

                     / /  Устанавливаем объект-оператор для посылки SQL-операторов

                     / / в драйвер

                     Statement stmt = con.createStatement ( );

                      / / Выполняем запрос

                      ResultSet rs = stmt.executeQuery (

                                  “SELECT title, publicationYear FROM books “);

                      while (rs.next ( ) )  {

                      / /

                                   String s = rs.getString (“title”);

                                    Date f = rs.getDate (“publicationYear “);

                                    System.out.println ( s + f );

                      }

                      stmt.close ( ) ;

                      con.close ( );

} catch (java.sql.SQLException e ) {

                      System.out.println ( e.getMessage ( ) );   

}

Как только соединение установлено с помощью DriverManager.getConnection ( ), вы можете использовать полученный объект Connection для создания объекта Statement, используя метод createStatement ( ). С помощью Statement вы можете вызвать executeQuery ( ), передав в него строку, содержащую SQL выражение стандарта SQL-92.

SQL-запросы можно создавать с использованием различных инструментов, например, Microsoft Query.

Метод executeQuery ( ) возвращает ResultSet, который является итератором: метод next ( ) перемещает итератор на следующую запись в выражении или возвращает false, если достигнут конец результирующего множества. Вы всегда получите назад объект ResultSet от executeQuery ( ), даже если результатом запроса является пустое множество (если так, исключение не возникает). Обратите внимание, что вы должны вызвать next ( )  прежде, чем попробовать прочесть любую запись. Если результирующее множество – пустое, это первый вызов next ( )  вернет false. Для каждой записи результирующего множества вы можете выбрать поля, используя (наряду с другими подходами) имя поля, как строку. Также обратите внимание, что регистр в имени поля может игнорироваться – базы данных SQL не различают его. Вы определяете тип, который получите, вызвав getInt ( ), getString ( ), getFloat ( ) и т.д. В этом месте вы получаете данные из вашей базы данных в родном формате Java и можете делать с ними все, что хотите, используя обычный Java код.

public boolean execute (String sql) throws SQLException
public ResultSet getResultSet ( ) throws SQLException
public int getUpdateCount ( ) throws SQLException

public int executeUpdate (String sql ) throws SQLException –

                                                  Executes an SQL INSERT, UPDATE or DELETE statement

Извлечение столбцов по порядковому номеру:

Date f = rs.getDate (2);

Как известно, SQL-команды выполняются немедленно. Для большинства небольших запросов это приемлемо, но для сложных запросов это значит, что изменить данные в базе нельзя до тех пор, пока запрос не будет выполнен полностью. Например, прежде чем добавить данные о новой книге, нужно ввести данные об издательстве, в котором она опубликована. В SQL для выполнения таких атомарных (atomic) операций используются транзакции. Атомарными они называются потому, что их нельзя расщепить, т.е. транзакция может быть либо полностью выполнена, либо полностью отменена. Иначе говоря, она не может находиться в каком-то промежуточном состоянии.

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

Явное управление транзакциями SQL

  1.  Для отключения автоматического режима фиксации используйте метод setAutoCommit ( )объекта Connection.
  2.  Выполните SQL-команду.
  3.  Как только нужно будет зафиксировать внесенные изменения в базе данных, вызовите метод commit ( ) объекта Connection.
  4.  Если требуется отменить все изменения, внесенные после последней фиксации, вызовите метод  rollback ( ) объекта Connection.

Параноидальный обработчик SQL запросов

Statement stmt  = null;

if  ( conn == null )  {

         throw  new  NullPointerException ( “Connection conn is null “ );

}

try  {

       stmt = conn.createStatement ( );

       stmt.excuteQuery ( “ . . . “ );

} finally   {

       if ( stmt  != null )  {

               try  {

                         stmt.close ( );

               }  catch ( Exception e )   {

                         / / nothing

               }  finally  {

                        stmt  =  null;

               }

      }

}

II. DB2

Производительность, масштабируемость, переносимость, многоплатформенность, надежность.

Command Center

Control Center


 

А также другие работы, которые могут Вас заинтересовать

37595. Соотношение мер защиты и мер ответственности в гражданском праве России 780 KB
  Однако проблема соотношения мер защиты и мер ответственности изучена недостаточно. Несмотря на то, что проблема рассматривалась в некоторых работах, сделанные в них выводы не дают возможности считать этот вопрос разработанным, поэтому требуется специальное научное исследование в этой сфере.
37596. МЕТОДОЛОГИЯ СТАТИСТИЧЕСКОЙ ОЦЕНКИ ЭФФЕКТИВНОСТИ УПРАВЛЕНИЯ ПЕРСОНАЛОМ 1.54 MB
  В литературе по управленческой тематике преобладают, как правило, публикации учебного и учебно-методического характера, рассматривающие главным образом историю и основы менеджмента, а также специальные вопросы управления, такие как финансовый менеджмент, кадровый менеджмент, ситуационные и системные подходы к управлению, социология организаций, маркетинг. При этом в море публикаций по проблемам управления явно не хватает литературы, для специалистов-менеджеров, высшего звена, а именно по оценки эффективности управления персоналом.
37597. ГОСУДАРСТВЕННОЕ РЕГУЛИРОВАНИЕ ФАРМАЦЕВТИЧЕСКОГО РЫНКА 2.67 MB
  Целью диссертационной работы является исследование комплекса проблем рынка лекарственных средств для формирования системы государственного регулирования фармацевтического рынка России в сложившихся экономических, политических и социальных условиях.
37598. МЕТОДИЧЕСКИЕ ОСНОВЫ АНТИКРИЗИСНОГО УПРАВЛЕНИЯ ПРЕДПРИЯТИЕМ 1.27 MB
  современные проблемы управления несостоятельными предприятиями [2. Кризисные предприятия в национальной экономике России [2.2] Понятие несостоятельного предприятия [2. Степень качества финансового состояния предприятия [2.
37599. СТИМУЛИРОВАНИЕ НАЕМНЫХ РАБОТНИКОВ В ПРОЦЕССЕ ПРЕДПРИНИМАТЕЛЬСКОЙ ДЕЯТЕЛЬНОСТИ 1.04 MB
  Теоретические основы организации стимулирования наемных работников в процессе предпринимательской деятельности [2.2] работников в предпринимательской деятельности [2. Анализ действующих систем стимулирования наемных работников [3.
37600. Издержки производства: экономическая природа, региональные особенности и резервы снижения (на примере отраслей нефтедобычи Республики Татарстан) 957 KB
  Экономическое содержание издержек производства. Классификация издержек производства. Региональные особенности издержек производства в нефтедобыче.
37601. Проектирование информационных систем 1.12 MB
  Приводимые в обзоре рекомендации могут способствовать успешному внедрению CASEсредств и уменьшить риск неправильных инвестиций. Несмотря на высокие потенциальные возможности CASEтехнологии увеличение производительности труда улучшение качества программных продуктов поддержка унифицированного и согласованного стиля работы далеко не все разработчики информационных систем использующие CASEсредства достигают ожидаемых результатов. Существуют различные причины возможных неудач но видимо основной причиной является неадекватное понимание...
37602. Определение мощности дизельного двигателя 202.67 KB
  Определение мощности дизельного двигателя: 1. Процесс снятия индикаторной диаграммы с цилиндров двигателя называется индицированием цилиндров. Индикаторная диаграмма снятая с двигателя изображает действительный цикл с учетом всех потерь а площадь индикаторной диаграммы – индикаторную работу цикла Li. Если подставить в уравнение Pi в кг см2 Vh – в литрах как принято в двигателестроении число оборотов вала n в об мин и обозначить количество цилиндров – i а тактность двигателя – ττ = 2 – для двухтактного и...
37603. ИССЛЕДОВАНИЕ ВЛИЯНИЯ УГЛА АТАКИ ПОТОКА НА ХАРАКТЕРИСТИКИ ТУРБИННОЙ РЕШЕТКИ 317.21 KB
  ИССЛЕДОВАНИЕ ВЛИЯНИЯ УГЛА АТАКИ ПОТОКА НА ХАРАКТЕРИСТИКИ ТУРБИННОЙ РЕШЕТКИ Вопросы пространственного обтекания турбинных решеток чрезвычайно сложны и теоретически решается лишь для некоторых простейших случаев поэтому основным достоверным материалом для суждения о качественной и количественной зависимостях между отдельными величинами при обтекании турбинных решеток сжимаемой средой является материал эксперимента. Рисунок 1 Характеристики турбинной решетки Результаты эксперимента β1 = 450 Углы потока 1 2 3 4...