Введение в программирование баз данных

Э

То первая из нескольких глав, посвященных доступу к базам данных с помощью JBuiIder. Прочитав эти главы, вы должны будете хорошо представлять себе все те основные задачи, из которых слагается создание мощного приложения для рабо­ты с базами данных.

Назначение этой главы — предоставить вводный материал по базам данных для новичков в этой технологии и тех, кому хотелось бы вкратце повторить пройденное. Здесь мы рассмотрим:

■ Целевую аудиторию для этого раздела книги.

■ Определение и назначение базы данных JDBC.

■ Различия между истинными базами данных SQL, такими как Oracle или MySQL, и локальными базами данных, такими как Paradox или Access.

■ Определение и назначение реляционных баз данных и баз данных SQL.

■ Роль драйвера базы данных.

Целевая аудитория

Для работы с большей частью этого раздела книги вам понадобится редакция JBuilder Enterprise. (В JBuilder 6 и ниже можно пользоваться редакцией Pro.) Я не хочу сказать, что из JBuilder Personal или JBuilder SE нельзя обращаться к базам данных: с базами данных не связано ничего такого, что можно было бы сделать в ре­дакции Enterprise, но нельзя было бы выполнить в редакции Personal. Другое дело, что JBuilder ничем не сможет помочь в ваших устремлениях, если вы не располагае­те редакцией Enterprise.

В редакциях Personal и SE все, что имеет отношение к базам данных, приходится делать вручную. Редакция Enterprise предусматривает инструменты, помогающие автоматически генерировать высококачественный код взаимодействия с базами данных. Это и есть те преимущества, которые вы получаете за более высокую цену, уплачиваемую за усовершенствованные версии.

Кое-где в этих главах речь будет идти о программировании баз данных JDBC; тем не менее, основное назначение части VII, "Базы данных", состоит в том, чтобы про­демонстрировать, как собирать инструментальные средства с помощью Borland DataExpress.

Наконец, хочу подчеркнуть одно из сделанных во введении замечаний. Я свято верю в интегрированные среды разработки, подобные JBuilder, и думаю, что умение работать с ними стоит тех усилий, которые приходится затрачивать на их изучение. То, что вы можете написать приложение баз данных вручную, не значит, что именно так вы и должны поступать, имея здоровую альтернативу. В некотором смысле это то же, что идти пешком, когда можно полететь самолетом. Да, конечно, пешком вы до­беретесь туда, куда нужно, но если время имеет для вас значение, лететь будет по­просту разумнее. Тем не менее, ничто подобное не должно становиться оправдани­ем написания "неряшливого" кода. Раз уж JBuilder помогает вам сэкономить время, потратьте часть его на более тщательную разработку и реализацию своих идей.

Что такое JDBC1 и какое отношение к нему имеет DataExpress

JDBC расшифровывается как Java Database Connectivity (Java-интерфейс взаимо­действия с базами данных). Это API-интерфейс компании Sun, разработанный для обеспечения унифицированного интерфейса взаимодействия с базами данных в Java. Кроме того, JDBC реализован на Java, то есть он является переносимым инст­рументом.

JDBC — тщательно продуманный API-интерфейс, и пользоваться им достаточно просто. Достоинство инструментов компании Borland состоит в том, что они предо­ставляют возможность автоматически генерировать код взаимодействия с базами данных или визуально манипулировать компонентами кода взаимодействия с база­ми данных.

DataExpress — это оболочка для JDBC, разработанная Borland. DataExpress часто сокращают как dx, и хранится он в одном JAR-файле — ∕JBuilder∕lib∕d×. Jar.

Оболочки DataExpress нужны для того, чтобы предоставить средство для созда­ния тех мощных инструментов взаимодействия с базами данных, которые необхо­димы для автоматизации доступа к базам данных с помощью JBuilder. Код, реализу­ющий эти задачи, хранится в JAR-файле DataExpress и еще одном файле в том же каталоге — Dbswing.Jar.

примечаниеDataExpress показывает базовый JDBC-код, который в нем упакован. Если вы знакомы с JDBC, то в большинстве случаев сможете обращаться к ключевым объек­там JDBC путем вызова соответствующих методов библиотеки DataExpress. В этой книге я покажу, как это делается, но обычно это не нужно.

DataExpress содержит в себе определенный объем кода, который дол­жен быть включен в ваши приложения. C помощью Archive Builder, который входит в ре­дакции SE и Enterprise, можно автоматически собрать JAR-файл, содержащий код DataExpress. В главе 43 я расскажу, как это сделать.

Что такое сервер баз данных?

Сервер баз данных (Database Server) — это средство хранения данных и доступа к ним. Существует множество серверов баз данных; наиболее популярным является, пожалуй, Oracle,— очень быстрый, широко масштабируемый и… очень дорогой.

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

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

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

Еще одна очень популярная база данных — Microsoft SQL Server (MSSQL). MSSQL не так быстр, как MySQL или Oracle, однако он снабжен великолепными инструментами и принадлежит к среднему ценовому диапазону. Компания Microsoft выпускает также локальную базу данных Access, речь о которой пойдет ниже в этой главе.

InterBase — база данных, разработанная Borland. Существует как бесплатная ее версия с открытым исходным кодом, так и версия, предлагаемая за весьма умерен­ную цену. Она изначально создавалась как встроенная база данных, да и сейчас зача­стую используется в этом качестве, вследствие чего одним из ее достоинств является небольшие размеры.

JDataStore — еще одна база данных от компании Borland. JDataStore представляет собой соответствующую ANSI-32 базу данных, полностью реализованную на Java. Она переносится на все Java-платформы и очень легко развертывается. За распрост­ранение кода, созданного при помощи JDataStore, взимается определенная плата.

SQL-серверы и локальные базы данных

Большинство баз данных предназначено для удаленного использования. Обыч­но ваша программа будет выполняться на одной машине, а база данных будет нахо­диться на другой машине, — такие машины называются SQL-серверами, файловыми серверами или клиент-серверными базами данных.

Некоторые базы данных, такие как Access, dBASE или Paradox, являются локаль­ными базами данных, предназначенными для запуска с той машины, на которой они находятся. В принципе, к этим базам данных можно обращаться удаленно, но это не является их стандартным режимом работы.

Приложения, использующие локальные базы данных, обычно обращаются на­прямую к базе данных. Доступ к истинной базе данных SQL, с другой стороны, обычно осуществляется через протокол TCP/IP. В некоторых случаях клиентская и серверная части SQL-сервера будут располагаться на одной и той же машине, одна­ко две части приложения будут обмениваться данными друг с другом с помощью протокола удаленного доступа.

Если вы строите базу данных, к которой одновременно будет обращаться только один человек или которую будет использовать лишь несколько человек, вы можете воспользоваться локальной базой данных. Если же вы пишете программу, у которой планируется много пользователей одновременно, вам следует отдать предпочтение базе данных вроде Oracle, MSSQL, MySQL или InterBase. Вне зависимости от числа пользователей, истинная база данных SQL в большинстве случаев будет более на­дежна и в меньшей степени подвержена потере данных, чем локальная база данных.

Oracle, InterBase, MySQL и MSSQL — истинные базы данных SQL. dBASE, Paradox и Access — это локальные базы данных. Это не значит, что локальные базы дан­ных не являются мощными многофункциональными инструментами, а только то, что их возможности ограничены, когда речь заходит об обеспечении безопасности данных.

Что такое реляционная база данных

Реляционные базы данных изначально являются сложной темой. Тем не менее, если вам ранее не приходилось с ними сталкиваться, несколько простых вещей по­могут вам понять, что они собой представляют. Если же вы хотите серьезно изучить эту тему, нужно будет обратиться к соответствующим книгам.

Реляционная база данных предназначена для. устранения дублирования за счет хранения данных во множестве связанных таблиц. И локальные базы данных, и SQL-серверы, описываемые в этой главе, — это реляционные базы данных.

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

Моя_компания, Адрес_моей_компании, Мой_номер_телефона,

Наименование_товара, Количество, Стоимость

Для каждого проданного товара вы будете просто добавлять в таблицу новую строку:

Elvenware7 Санта-Круэ, 333-333-3333, Книга по Java, 1, $2000.00

Elvenware, Санта-Круз, 333-333-3333, Книга no C++, 1, $2.00

Elvenware, Санта-Круэ, 333-333-3333, Книга по Delphi, 1, $2000.00

Elvenware, Санта-Круз, 333-333-3333, Книга no Java, 1, $2000.00

Microsoft, Редмонд, 666-666-6666, Книга по Visual Basic, 1, $0.25

Microsoft, Редмонд, 666-666-6666, KHMranoVisualBasic, 1, -$1.25

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

Реляционная схема разбивает такие данные на две таблицы:

Таблица КОМПАНИЯ

Идентификатор_компании = 1

Наэвание_компании = Elvenware

Адрес_компании = Санта-Круз

Телефон_компании = 333-333-3333

Таблица ПРОДАЖИ

Идентификатор_продажи = 22054

Наименование_товара = Книга no Java

Количество = 1

Стоимость = $2000

Идентификатор_компании = 1

Самое важное поле в этом объявлении — Идентификатор_компании. Идентифи­катор компании Elvenware — 1. В результате вы можете просто включить лишь этот номер в каждую строку таблицы продажи, чтобы обозначить компанию, которая продала товар:

22054, KiinranoJava, 1, $2000.00, 1

22055, Книга по C++, 1, $2.00, 1

22056, KHHranoVisualBasic, 1, $0.10, 2

22057, Книга по Visual Basic, 1, -$5.00, 2

В последнем поле можно видеть, что первые две книги были проданы компани­ей Elvenware, идентификатор которой равен 1. Третья книга была продана какой-то другой компанией с идентификатором 2.

Реляционная база данных позволяет легко создавать связи между таблицами. Например, вы можете спросить: "Каковы все элементы в таблице продажи с иденти­фикатором компании, равным 1?" Ответом на этот вопрос будет набор данных, со­держащий все продажи, произведенные компанией Elvenware.

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

Что такое SQL?

Большинство баз данных архитектуры клиент-сервер представляют собой базы данных SQL. SQL — это язык для создания запросов к базам данных. Аббревиатура SQL расшифровывается как Structured Query Language — язык структурированных запросов. ("А что" — можете спросить вы, — "такое язык неструктурированных зап­росов?")

Давайте на минутку задумаемся о ряде других существующих типах языков. Java — это универсальный язык программирования. JavaScript — язык для програм­мирования Web-страниц. В командных файлах используется простой язык для вы­полнения последовательностей команд в окне DOS. Язык Bash Shell — более мощ­ный инструмент для выполнения действий в командной строке Unix. А язык, о ко­тором мы говорим в данный момент, — язык SQL — это язык для создания запросов к базам данных. SQL — средство унификации в области, которой изначально прису­ще многообразие. Базовый набор команд SQL одинаково хорошо работает практи­чески на каждой платформе баз данных, поддерживающей SQL. SQL — это не опера­ционная система. Тем не менее, в разработке баз данных SQL играет почти такую же роль, что и Java в межплатформенной разработке: это стандарт, предназначенный для работы на всех платформах. SQL — это стандарт, предназначенный для работы со всеми базами данных.

Сегодня практически каждый доступный на рынке серьезный продукт для рабо­ты с базами данных поддерживает SQL. В компьютерном мире SQL является стан­дартом для разработки баз данных. Представить себе базы данных без SQL — в неко­тором смысле то же, что представить себе автомобили без дорог. Эти два понятия очень тесно связаны между собой.

Полное описание языка SQL выходит за рамки этой книги. Тем не менее, наибо­лее распространенные команды выглядят так:

CREATE DATABASE MyDatabase;

USE DATABASE MyDatabase;

DROP DATABASE MyDatabase;

CREATE TABLE MyTable (id int, data VarChar (128)) ;

DROP TABLE MyTable;

CREATE INDEX MyIndex ON MyTable (id) ;

SELECT * FROM MyTable;

INSERT INTOMyTable (id, data) values (1, "MyData");

UPDATE MyTable SET data = "NewData" WHERE id = 1;

DELETE FROM MyTable WHERE id = 1 ;

He стоит и говорить, что эти команды демонстрируют, как создать базу данных, выбрать базу данных, удалить (выбросить) базу данных, создать таблицу, удалить таблицу, создать индекс для таблицы, выбрать данные из таблицы, добавить новую строку в таблицу, обновить существующую строку в таблице и удалить строку из табли­цы. Это основные действия, которые можно выполнять в отношении базы данных.

SQL — язык не всегда столь краткий, как может показаться из этого небольшого введения. Собственно говоря, можно создавать очень длинные, буквально на тыся­чи строк, SQL-операторы.

Что такое набор данных?

Набор данных (Dataset) — это совокупность строк, извлеченных из базы данных при помощи SQL-запроса. Ниже показан небольшой набор данных:

Elvenware, Санта-Круз, 333-333-3333, Книга по Java, 1, $2000.00

Microsoft, Редмонд, 666-666-6666, KHHranoVisualBasic, 1, $0.25

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

В большинстве случаев клиентская часть будет выполняться на одной машине, а серверная — на другой. Когда вам нужно просмотреть данные, вы переносите их с сервера на клиентскую машину через протокол TCP/IP или какой-то другой Internet-протокол.

Базы данных SQL невероятно мощны. Однако существует одно правило, которое следует помнить для успешной работы с ними: ваши наборы данных должны быть как можно меньше.

Создание запроса, результатом которого будут десять мегабайт данных, в боль­шинстве случаев приведет к неприятностям: ваша клиентская программа не сможет справиться со всеми этими данными и, увязнув в них, перестанет отвечать на запро­сы и будет выглядеть как "зависшая". Отсюда следует, что одно из правил игры в ба­зах данных — делать запросы на ограниченное число строк данных.

Выработать стратегии, которые уберегут вас от неприятностей при выдаче запро­сов в базы данных,— полностью ваша задача. Например, вместо того, чтобы запра­шивать людей во всей таблице, вы будете запрашивать всех внесенных в базу данных людей, чьи фамилии начинаются на "А".

Сохранение целостности реляционной базы данных

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

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

22054, Книга по Java, 1, $2000.00, 1

22055, Книга по C++, 1, $2.00, 1

Как вы помните, это две записи из таблицы продажи. Последнее поле в записи — 1 — указывает на элемент с идентификатором 1 в таблице компания. Иными слова­ми, оно указывает на запись Elvenware из таблицы компания:

1, Elvenware, Санта-Круз, 333-333-3333

2, Microsoft, Редмонд, 666-666-6666

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

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

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

Активизировать правила базы данных могут также специальные SQL-операторы, такие как check, constraint и create rule. Принудительное применение этих правил должно быть задачей базы данных, а не Java-разработчика; тем не менее, ве­дутся споры о том, не следует ли разработчикам также пытаться обеспечивать со­блюдение этих правил на стороне клиента.

Каскадные удаления

Конечно же, будут встречаться и такие случаи, когда необходимо удалить компа­нию из таблицы компания. Одновременно вам нужно будет удалить и все связанные записи из таблицы продажи. Такое действие называется Каскадным удалением (Cascading Delete)’, оно последовательно проходит из таблицы компания внутрь таб­лицы продажи. На практике оно может также последовательно погружаться в таблицы, связанные с таблицей ПРОДАЖИ и так далее, проходя через несколько уровней.

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

Ключи и индексы

Большинству SQL-операторов вроде тех, которые мы рассматривали, свойствен­на некая интуитивно понятная логика. Одним из исключений является понятие индекса, в некоторых случаях тесно связанное с понятием ключа.

В реляционной базе данных вы постоянно используете определенные поля для связывания таблиц. Поле, которое вы используете для определения отношения, на­зывается Ключом (Key) Индекс, с другой стороны, может помочь быстро отсортиро­вать или найти данные в таблице. Ключи связывают таблицы, индексы же помогают сортировать и искать данные в таблице.

примечаниеПервичный ключ (Primary Key) обычно делается на первом поле или нескольких первых полях таблицы. Эти поля обычно имеют уникальный индекс и не могут быть пустыми. Уникальный индекс предписывает, что каждый элемент в данном поле должен быть уникальным. Например, определив как уникальный индекс поле Идентификатор_компании В таблице компания, можно быть уверенным в том, что никакие две компании не будут иметь одинаковые идентификаторы. Можно также указать, что поле не может быть пустым. Например, вы можете указать, что поле Идентификатор_компании Должно содержать значение; для этого вы говорите, что оно не может содержать пустые значения (null).

Miβa∣M*⅛iai*iΛβ к сожалению, от одной базы данных к другой точный результат задания первичного ключа несколько варьируется. Да и вообще, многие правила работы с база­ми данных изменяются от сервера к серверу. В большинстве случаев первичный ключ сделает именно то, о чем я говорил: создаст уникальное индексированное значение. Если вы не уверены, что делает ваша база данных, в большинстве случаев вы можете открыть табли­цу, о которой идет речь, например, в JBuiIder Database Pilot, и посмотреть, проиндексирован ли также ваш первичный ключ. Средство Database Pilot описывается в главе 40. Подводя итог, следует отметить, что может оказаться так, что поле первичного ключа не является индекси­рованным. Однако же, на практике большинство полей первичных ключей индексируются. C другой стороны, внешние ключи не всегда автоматически индексируются.

Основное назначение индекса — помочь сортировать данные и осуществлять по­иск данных. Ключ помогает в установлении связей между двумя таблицами, совмес­тно использующими общее поле. Чтобы вы могли лучше это понять, давайте рас­смотрим две таблицы, связанные посредством внешнего и первичного ключей.

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

Давайте вспомним таблицы компания и продажи, которые мы уже рассматривали в этой главе:

Таблица КОМПАНИЯ

Идентификатор_компании = 1

Название_компании = Elvenware

Адрес_хомпании = Санта-Круз

Телефон_компании = 333-333-3333

Таблица ПРОДАЖИ

Идентификатор_продажи = 22054

Наименование_товара = Книга по Java

Количество = 1

Стоимость = $2000

Идентификатор компании = 1

Экземпляр Идентификатор_компании В таблице компания будет неплохим кан­дидатом в первичные ключи, тогда как экземпляр Идентификатор_компании В таб­лице продажи подходит на роль внешнего ключа.

Индекс, который используется для сортировки данных и ускорения доступа в ходе поиска, называется просто Индексом (Index). Индексное поле является также ключевым полем, если оно участвует в связывании множества таблиц.

Сложив вместе все эти понятия, вы получаете индексированный первичный ключ на поле Идентификатор__хомпании, Который предписывает, что оно не может быть пустым. В SQL это будет выглядеть так:

CREATE TABLE КОМПАНИЯ

(

Идентификатор_компании IMT not null,

Название_компании VARCHAR(128),

Адрес_компании VARCHAR(128),

Телефонкомпании VARCHAR(15),

PRIMARY KEY(ИденФификатор_компании)

) ;

Обратите внимание на конструкцию Not Null В начале объявления и конструк­цию primary key в конце объявления.

Если вы работаете с MySQL, вам лучше объявлять свои таблицы как таблицы типа InnoDB. Таблицы InnoDB могут поддерживать внешние ключи и обладают другими преимуществами; о настройке InnoDB я расскажу в следующей главе. Доба­вить поддержку InnoDB в оператор create table можно следующим образом:

CREATE TABLE КОМПАНИЯ

(

Идентификатор_компании IMT not null,

Название_комлакии VARCHAR(128),

Адрес_компании VARCHAR(128),

Телефон_компании VARCHAR(15),

PRIMARY KEY(ИдекФификаФор_компании)

) TYPE=INNODB;

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

ALTER TABLE КОМПАНИЯ TYPE=IMNODB;

Поле Идентификатор_компании Объявлено как поле целочисленного типа, а дру­гие поля — как строки переменной длины. Поле Идентифихатор_компании Объявле­но как поле целочисленного типа потому, что оно должно содержать значение, дол­жно быть уникальным и будет индексироваться. Поскольку оно проиндексировано, можно будет очень быстро выполнять поиск по этому полю и быстро сортировать таблицу по этому полю Поскольку оно является ключом, оно может использовать­ся в отношениях между этой таблицей и другой таблицей, например, продажи. По­скольку оно является первичным ключом, в большинстве случаев можно предполо­жить, что значения в нем будут уникальными. При желании вы можете указать, что в первичный ключ будет входить несколько полей.

А вот как создать в MySQL таблицу продажи

CREATE TABLE ПРОДАЖИ (

Идентификатор_продажи INT not null,

Наименование_товара VARCHAR(128),

Количество INT,

Стоимость FLOAT,

Идентификатор_компании INT,

PRIMARY KEY(Идентификатор_продажи),

INDEX compid (Идентификатор_компании),

FOREIGN KEY(Идентификатор_компании) references

КОМПАНИЯ(Идентификатор_компании)

) TYPE=INNODB;

примечаниеОбратите внимание на использование InnoDB и явное создание индекса с име­нем compid на базе поля Идентификатор_компании.

Если в результате передачи такого оператора серверу MySQL вы по­лучаете ошибку с кодом 150, то, весьма вероятно, что-то не в порядке с сервером или логикой. Остальные ошибки особого смысла не имеют, обращать внимание следует Только на ошибку с кодом 150.

Однако в InterBase или Access конструкция index работать не будет. Вот что вам нужно написать в этом случае:

CREATE TABLE ПРОДАЖИ

(

ИденФифмкатор_продажи INT not null,

Наименование_товара VARCHAR(128),

Количество INT,

Стоимость FLOAT,

Идентификатор_компании INT,

PRIMARY KEY(Идентификатор_продажи),

FOREIGN KEY(Идентификатор_компании) references

КОМПАНИЯ(Идентификатор_компании)

) ;

CREATE INDEX compid ON ПРОДАЖИ(Идентификатор__компании);

Давайте взглянем на эти таблицы во встроенном в JBuilder инструментальном средстве, которое называется Database Pilot. Пока что просто примиритесь с его су­ществованием; в следующих главах я рассмотрю этот инструмент подробнее. В пер­вом примере, показанном на рис. 38.1, мы находимся в базе данных InterBase На рис. 38.2 мы видим базу данных MySQL.

Почему между этими двумя таблицами существует различие? Оказывается, в MySQL создание внешнего ключа не приводит к автоматическому созданию индек­са. C другой стороны, MySQL требует организацию индексов на внешних ключах, и вам придется создавать их явным образом.

Давайте протестируем то, что мы сделали, в реальных условиях:

Insert into КОМПАНИЯ values (1, ‘Elvenware*, ,Санта-Круз’, 1555-555-5555,);

Insert into ПРОДАЖИ values (1, ‘Книга’, 1, 2000, 1);

Delete from КОМПАНИЯ where Наэвание_компании = ‘ Elvenware, ;

После звода двух первых строк любая попытка удалить запись Elvenware должна

Приводить к генерации исключения. Исключение возникает потому, что таблица про­дажи содержит запись, в которой поле Идентификатор_компании Содержит значение 1.

примечаниеПри работе с Database Pilot исключения могут отображаться в панели сооб­щений. В программах-примерах, которые мы будем строить на протяжении нескольких сле­Дующих глав, вы увидите, что такие исключения генерируются более явным образом.

Изложенные нами правила на самом деле должны предписывать, что невозмож­но ввести значение в таблицу продажи, если значение ее поля Идентификатор_компа — Нии не соответствует какой-нибудь записи из таблицы компания. Например, при теку­щем состоянии наших таблиц следующий оператор Insert Должен привести к сбою:

Insert into ПРОДАЖИ values (1, ‘Книга* , 1, 25, 2) ;

Проблема здесь состоит в том, что в таблице компания отсутствует запись, в ко­торой ИденФификатор_компании Равен 2

К сожалению, не все базы данных будут принудительно применять данное пра­вило касательно ввода недействительных значений в таблицу продажи. Например, MySQL и Interbase обеспечат выполнение этого правила, a Access — нет.

r odtdhase pilot 7Θs
file view help 
 < tf""^ x «о o 

,Γ,able schem,dehniilon dalai enierbqlj,рис. 38.1. просмотр первичных и внешних ключей interbase- таблиц в database pilot,! ⅛ bl columns i s bl indexes t ’ ш rdbtprimaryi
i s bl prlmaiy key i s os primarykey
i ⅛ bl columns
s-tb8ale8
⅛ bl columns : ’ os saleld
` dflrtembold i dl quantity l по coετ
i i- dl companyid й bl indexes
я rdbtprimary2 й ^∣ primary key
æ wprimarykey s bl foreign keys
wbalebinteo
,.~,table type,’ paictblkp pilot r∏o ×∖
file view help 
tf ^' tf x
л——“ o o 

,.⅛i-*∏ columns a⅛ indexes
л primary ⅛a prlmarykey
s-w compenyld s bj columns
-я companytd
,tablewcat

tΛblewname _ __ :omoanv
[table type table 

,definition data] entarsqll,tltemslncompany,рис. 38.2. просмотр структуры mysql-таблиц company
(компания) и sales
,il,ι-l m sales
: s-β∣ columns - л saieid
i fl iiemsold
■ o tuantity
■ w cost
, л companyid fe ffi indexes _ wppimkry iprimarykey
sfl saleld s-bl cc,umns '∙∙ dbsaleld
,s-

Хороший учебник по SQL — неоценимый компаньон при создании приложений с базами данных. Таких учебников множество; большинство из них примерно оди­накового качества. Так, весьма полезным справочником я нахожу The Practical SQL Handbook, изданный компанией Addison-Wesley. JBuilder, однако, разработан для того, чтобы "защитить" вас от SQL и генерировать SQL-код автоматически всегда, когда это возможно. Поэтому для понимания этой книги наверняка окажется доста­точно поверхностных знаний SQL.

Что такое драйвер базы данных

В мире Java драйвер базы данных дает JDBC возможность взаимодействовать с базой данных. Проблема, конечно же, состоит в том, что каждая база данных реали­зована немного "по-своему". В результате только поставщик той или иной базы дан­ных решает, писать ли драйвер, соединяющий JDBC с его базой данных. В случае же баз данных с открытым исходным кодом написание такого драйвера ложится на плечи сообщества Open Source.

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

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

Драйвер — своего рода "клей", цементирующий эту систему. Каждый драйвер предоставляет мост между стандартом JDBC и той или иной базой данных. Очевид­но, что существуют различные драйверы для MySQL, Oracle, MSSQL, Access, dBASE, Paradox и InterBase.

Сравнение JDBC и ODBC

Существует, по меньшей мере, два различных типа драйверов, которые вы може­те установить. Один из них — драйвер JDBC, который написан на Java и работает на различных платформах. Второй тип драйвера называется драйвером ODBC.

ODBC также является межплатформенным стандартом, однако чаще всего он используется в среде Windows. Драйверы ODBC обычно не пишутся на Java, следо­вательно, для каждой операционной системы вам понадобится соотвествующая вер­сия драйвера. Об установке драйверов я подробно расскажу в главе 40.

Поставляемый в комплекте с Sun JDK инструмент под названием ODBC-JBDC Bridge обеспечивает связь между ODBC-драйверами и JDBC-кодом, используемым в Java-программах. Как пользоваться этим "мостом", вы узнаете в главе 40.

Различие между ODBC-драйвером и JDBC-драйвером заключается в том, что один двоичный JAR-файл JDBC может содержать драйвер, который будет работать на множестве платформ. ODBC-драйверы обычно пишутся на С/С++ и, стало быть, должны как минимум заново компилироваться под каждую платформу.

Резюме

В этой главе вы ознакомились с основными понятиями, необходимыми для про­граммирования баз данных на Java. В следующей главе вы прочитаете об установке и применении конкретных драйверов баз данных, а также о том, как настраивать со­единения ( некоторыми из этих баз данных.

чарли калверт

Глава 39

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *