
- •Занятие 4. "Версткаweb-страницы с помощью html и css"
- •Index.Html, fon.Png, prog.Jar
- •Занятие 6. "Создание поздравительного блокировщика Windows.Реализация интерфейса"
- •Import javax.Swing.*;
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •Import javax.Swing.*;
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •// Отключение выведение рамки окна -
- •If (str.Equals(test))
- •Занятие 7. "Создание поздравительного блокировщика Windows.Завершение"
- •Import javax.Swing.*;
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •// Подключение обработчика события при закрытии окна
- •Занятие 8. "Визуальные средства разработки. Создание интерфейса приложения"
- •Занятие 9. "Работа с файловой системой из Java. Создание,удаление, переименование файлов"
- •If (str.IsEmpty())
- •Занятие 11. "Базы данных.Язык запросов sql. Работа с базой данных MySqLиз Java"
- •Import java.Sql.*;
Занятие 11. "Базы данных.Язык запросов sql. Работа с базой данных MySqLиз Java"
На этом занятии вы узнаете, что такое база данных, где она используется, и как работать с базой данных на языке программирования Java.
Сегодня сложно представить разработку крупных приложений, как для интернета, так и для настольных компьютеров без использования базы данных. Практически все современные сайты построены на базах данных. Многие системы, которые пишутся, например, под операционную систему Windows, также очень часто используют базы данных.
База данных–оптимально организованное хранилище совокупности данных, физически находящееся в одном или нескольких файлах.
К совокупности данных прилагается удобный сервис для работы с ними: получения, изменения, удаления данных и т.д. Он называется системой управления базами данных.
Cистема управления базами данных (СУБД)–программное обеспечение, организующее работу с базами данных.
Существует много различных решений – различных систем управления базами данных.
Можно ли обойтись без СУБД и для хранения данных приложения воспользоваться обычными файлами – сохранять в файлах данные, затем, в приложении, эти файлы открывать, извлекать из них информацию?Можно, но при большом количестве данных,при сложной структуре их взаимосвязей через файлы, эта работа будет очень трудоёмкой.
Кроме того, можно столкнуться с проблемой, когда большое количество пользователей одновременно пытается получить доступ к одному файлу.
Простой пример – web-сайт в интернете:
Допустим, одновременное количество пользователей зашло на этот сайт, скажем, десять тысяч человек. Если данные из одного файла попытается получить или изменить большое количество пользователей одновременно, произойдет разрушение данных. Если сразу несколько пользователей начнут записывать и считывать файл, данные в нём станут некорректными.
Значит, для правильной организации работы пока один пользователь считывает файл, нужно блокировать его для других пользователей. Тогда каждый следующий пользователь получит доступ к файлу только после того, как с ним закончит работу предыдущий. Если пользователей много, выстроится очередь ожидающих своей работы с этим файлом. Скорость работы значительно упадёт.
Намного правильнее в таких случаях воспользоваться готовым специализированным решением: системой управления базы данных (СУБД).
Система управления базами данных используется как для разработки под операционную систему, так и для интернета. Принцип работы одинаков,поэтому достаточно разобраться, например,как использовать базу данных при разработке приложения для операционной системы Windows. В таком же качестве можно использовать базу данных при создании web-сайта и т. д.
Итак, основное понятие – СУБД (система управления базами данных) (см.рис. 11.1).
Рис. 11.1
База данных, как мы уже знаем, – это файл или группа связанных файлов (в зависимости от типа базы данных).
СУБД – оболочка,предоставляющая сервис для удобной и быстрой работы с базой данных.
Рассмотрим некоторые популярные решения СУБД на сегодняшний день. (см. рис. 11.2).
Рис. 11.2
Приложение –Access.
Accessпредназначен как для домашних пользователей, так и для малого бизнеса.Это решение компании Microsoft. Оно имеет некоторые ограничения. Если количество пользователей, одновременно работающих с базой данных, довольно велико, нужно пользоваться более мощным решением.
Следующая группа –бесплатные СУБД.
СУБД MySQL(одна из самых популярных на сегодняшний день, очень часто используется при web-разработке).
СУБД –PostgreSQL.
Указанные СУБД можно скачать из интернета, установить и пользоваться ими бесплатно. Это довольно мощные решения, их вполне достаточно для реализации многих крупных проектов.
Третья группа – платные СУБД:
Oracle Database
Microsoft SQL Server
У них есть, и бесплатные экспресс варианты, но их функционал существенно ограничен.
Мы будем работать с СУБДMySQL. Эту СУБД можно использовать и для разработки под Windows, и для web-разработки. Если вы хотите заниматься разработкой web-сайтов, или уже занимаетесь, вероятнее всего, вы обратитесь именно к MySQL.
Для работы с данными,хранящимися в базе данных, мы будем использовать, так называемый, язык структурированных запросов SQL.
Язык структурированных запросов SQLпозволяет получать данные из базы данных по определенным условиям, изменять, удалять эти данные и добавлять новые.
Сегодня мы рассмотрим несколько SQLзапросов, позволяющих выполнять основные операции над данными.
Но сначала подробно рассмотрим, что собой представляет база данных, какова её структура и каковы основные теоретические понятия.
Существуют две разновидности базы данных: реляционная и нереляционная модель.
Реляционные базы данных–это базы данных,построенные на таблицах.
Мы будем рассматривать реляционную модель, как правило,используемую на сегодняшний день. Все перечисленные выше СУБД являются реляционными базами данных (см. рис. 11.2).
Рис. 11.3
Если вы работали с приложением Excel,вы часто встречали таблицы, заполненные данными. Каждая таблица имеет определенное количество колонок и строк.
Создадим простую таблицу, содержащую данные: имя и фамилия. Также добавим колонку под названием idдля возможности задавать номера каждой записи.Приблизительно в таком же виде данные хранятся и в базе данных.
Итак, реляционная база данных – это база, в которой содержится определенное количество таблиц. Таблицы, конечно, могут быть по структуре значительно сложнее примера, приведённого выше, их может быть много, и эти таблицы могут быть, так или иначе, взаимосвязаны между собой.
Начнём с простых таблиц и постепенно будем двигаться к сложным.
Каждая таблица имеет колонку. Колонка называется полем, или ключом.
Поле, илиключ–колонка таблицы.
В нашей таблице три поля: id, имя и фамилия. Каждое поле имеет свой тип данных. Этот тип данных напоминает тип данных, используемый при объявлении переменных. Первое поле idимеет тип данныхчисло: 1, 2, 3 и т.д., а колонки (поля) имя и фамилия, имеют тип данных строка, так как представляют собой строковые записи. Эти типы данных напоминают тип intи типStringизязыкаJava.
Следующее важное понятие при работе с таблицами–строка таблицы.Строка таблицы называется записью.
Первое действие при формировании таблицы: создание полей(колонок). После этого в таблицу добавляются строки (записи). В нашем случае каждая строка имеет свой уникальный номер:1, 2, 3и т. д. По этому номеру можно однозначно идентифицировать строку. Первичный ключ–поле или несколько полей, однозначно идентифицирующие любую запись в таблице.
Это важное понятие, его нужно запомнить.
В нашем случае первичным ключом является поле id. Если первая строка имеет номер 1, в таблице больше нет строк, имеющих тот же номер. Таким образом, это поле однозначно идентифицирует каждую запись. Другими словами это значение уникально.
Работа с табличными базами данных осуществляется, как говорилось выше, при помощи языка запросовSQL. Для того,чтобы выполнить необходимые манипуляции с данными, мы будем использовать четыре основные команды: SELECT, INSERT,DELETE, UPDATE(см.рис. 11.4).
Рис. 11.4
Команда SELECTпозволяет выбрать данные.
Например, если имеется таблица, хранящая имя, фамилию, год рождения, при помощи команды SELECTможно выбрать всех людей, родившихся в пределах от 1960 по 1970год.
При помощи командыINSERTможно добавить в таблицу новые строки. При помощи команды DELETEможно удалить строки, соответствующие определенному условию.
И, наконец, при помощи команды UPDATEможно изменять значения в таблице.
Этих четырёх команд достаточно, чтобы производить основные манипуляции с базой данных: заполнять таблицу данными, извлекать их, изменять и удалять.
Чтобы начать работать с СУБД MySQL,необходимо её установить. Воспользуемся,так называемым, пакетом Denwer.
Пакет Denwerудобен: его установка производится легко и быстро, не требует сложных настроек. Скачать этот пакет можно на сайте www.denwer.ru
Переходим на сайт и выбираем "Скачать Denwer"(см. рис. 11.5).
Рис. 11.5
Появляется вопрос, какая версия PHP нужна?Оставляем предлагаемую по умолчанию,нажимаем кнопку "Скачать"(см. рис. 11.6).
Рис. 11.6
Предлагается ввести имя,фамилию, e-mail для того, чтобы получить ссылку на скачивание (см. рис.11.7).
Рис. 11.7
Вводим данные, указываем адрес электронной почты, переходим ниже и нажимаем "Получитьссылку на скачивание(см.рис. 11.8).
Рис. 11.8
Появляется сообщение:ссылка на скачивание отправлена на почту.Открываем свой почтовый ящик и находим письмо с сайта Denwer. В письме указана ссылка, по которой предлагается перейти (см.рис. 11.9).
Рис. 11.9
Переходим по ссылке и производим скачивание. В самом верху появляется сообщение, на какую ссылку нужно нажать, если загрузка не происходит.Далее появляется окно с возможностью сохранения файла (см. рис.11.10).
Рис. 11.10
Сохраняем его к себе на компьютер, открываем папку и, прежде чем запускать установку Denwer, закроем браузер.
Прежде, чем запускать установку Denwer,необходимо отключить такие программы какSkype,TeamViewer.
Если в данный момент запущен web-сервер Internet Information Servicesдля операционной системы Windows,его также нужно отключить. Это делается,поскольку Denwer и все эти вышеперечисленные программы используют, так называемый, 80-й порт. Если не отключить другие программы, они начнут конфликтовать, и, скорее всего, успешно запустить Denwerне получится.
Начнём установку пакета(см. рис. 11.11).
Рис. 11.11
Щёлкнем дважды мышкой.На экране появляется вопрос:
–Вы действительно хотите вставитьбазовый пакет?
Наш ответ будет:
– Да(см.рис. 12).
Рис. 11.12
Начнется распаковка архива. Появляется консольное окно, оно предлагает закрыть браузер. Браузер открывается автоматически установщикомDenwer, который сообщает, что происходит инсталляция.Закрываем это окошко. Далее – нажимаем клавишуEnter.
Появляется строка с предложением ввести папку, куда будет установлен Denwer.Выбираем путь, предлагаемый по умолчанию диск C:, папка Web-servers,указанная внутри квадратных скобок(см. рис. 11.13):
Рис. 11.13
Нажимаем Enter. Появляется вопрос,хотим ли установить пакет, выбираем: "Yes"..
Вновь нажимаем Enter. Предлагается указать диск. Оставляем диск, предлагаемый по умолчанию, Z:(см.рис. 11.14).
Рис. 11.14
Нажимаем два раза Enter–начинается установка пакета.
Дальше предлагается выбрать либо автоматический запуск при старте операционной системы, либо запуск пользователем. Выбираем пункт 2, нам удобнее запускать пакет Denwerпри необходимости. Программа задает следующий вопрос:
– Создать ярлыки на рабочем столе?
Отвечаем:
– Yes.
На этом установка пакета закончена. Открывается браузер, в нём появляется сообщение: Denwerуспешно установлен.
Браузер можно пока закрыть. На рабочем столе появились три ярлыка: Start Denver,Restart DenverиStop Denver(см. рис. 11.15).
Рис. 11.15
Эти ярлыки позволяют,запустить, перезапустить и остановитьDenwer. Для запуска нам понадобится ярлык Start Denver. Запустим программу.
Обратите внимание, после запуска продукта появляется диск Z:(см.рис. 11.16), указанный нами при установке. Физически этот диск отсутствует. Это, так называемый,виртуальный диск, он появляется в момент запуска пакета. После завершения работы(щелчком ярлыка Stop Denver), диск Z:исчезнет.
Рис. 11.16
Откроем браузер. Для того, чтобы использовать пакет Denver, необязательно иметь подключение к интернету. В строке браузера набираем localhost (см.рис. 11.17):
Рис. 11.17
Увидим приятное сообщение: "Ура,заработало!"(см. рис. 18).
Рис. 11.18
Это означает, что пакет установился успешно, и можно начать с ним работать.
При запуске пакета с помощью ярлыка Start Denver, запускается и MySQL. Появляется возможность создавать базы данных MySQL, задавать их архитектуру и работать с базами данных.
Для того, чтобы работать с базой данных, задавать и изменять её структуру, мы будем использовать, так называемый, интерфейс phpMyAdmin. Этот интерфейс написан на языке PHP.
После того, как мы перешли на localhost, в появившейся таблице выбираемphpMyAdmin (см. рис. 11.19).
Рис. 11.19
Загружается оболочка,при помощи которой можно работать со структурой базы данных.
Оболочка по умолчанию загружается на английском языке.Привыкайте, вам часто придётся использовать англоязычный интерфейс.Первое, что мы сделаем с помощью интерфейса, создадим новую базу данных:Create new database.
В первой строке указываем, например, base00–это имя базы данных,которую мы хотим создать.
Нажимаем кнопку Create (Создать) (см. рис. 11.20):
Рис. 11.20
Слева появилась новая база данных с названием base00. Дальше предлагается создать новую таблицу.
Создадим простую базу данных, состоящую всего из одной таблицы. В таблице будет три поля. Указываем имя таблицы, например, tab00. Дальше нужно указать количество полей, т. е. количество колонок в таблице:3(см. рис. 21).
Рис. 11.21
Открывается окно, в котором предлагается задать основные характеристики этих трех полей. Первое поле называем id.Это будет, так называемый первичный ключ, и поле будет автоматически нумероваться: 1, 2, 3, 4, 5 и т. д. – при добавлении каждой строки в таблицу. Тип поля оставляем INT (числовой), предлагаемый по умолчанию. Устанавливаем галочку AUTO_INCREMENT(см. рис. 11.22).
Рис. 11.22
Это необходимо, чтобы нумерация строк автоматически увеличилась на единицу при добавлении каждой новой строки.
Переходим ко второму полю. Назовём его imya. В этом поле будет храниться имя, имя– строковый тип - VARCHAR. Для строкового типа необходимо указать максимальную длину, которая будет храниться в этой колонке. Для имени вполне достаточно 50-ти символов (см.рис. 11.23).
Переходим дальше.Третье поле назовём famil, фамилия, указываем тип поля VARCHAR, также задаём 50символов (см. рис. 11.23).
Рис. 11.23
Мы создали одно числовое поле типа INTи два поля строкового типа VARCHAR. Для строкового типа также необходимо указывать максимальную длину. Естественно, можно ввести и 10 символов, главное задать максимально возможный предел. Тип VARCHAR хорош как раз тем, что если,например, ввести всего 10 символов из 50максимально возможных, пустые 40 символов не заполняются пробелами, в базе данных хранятся только те символы, которые вы ввели. Пустые значения, не содержащие символов, не хранятся в базе данных.
После того, как мы задали характеристики полей, называем кнопку Save(см. рис. 11.24), т.е. сохраняем то, что сейчас создали.
Рис. 11.24
После этой операции появилась таблица (см. рис.11.25).
Рис. 11.25
В ней указаны созданные нами поля: id,imyaи famil. Первое поле – целый тип,и два следующих типа – VARCHAR- строковый тип.
И последнее, что необходимо сделать: нужно указать, какое поле является первичным ключом. В нашем случае – полеid. Выделим его галочкой. Переходим правее и нажимаем на иконку с нарисованным ключиком (см. рис. 11.26).
Рис. 11.26
Нажимаем "Ok". Теперь поле idявляется первичным ключом, и у него установлена автонумерация.
Таким образом, у нас есть база данных под названием base00, и в базе данных –одна таблица под названием tab00.
Пока мы создали только структуру таблицы, в ней нет никаких данных. Для того, чтобы наполнить её данными, воспользуемся SQLзапросом. Переходим на закладку SQL(см. рис. 11.27).
Рис. 11.27
Здесь можно написатьSQL-запрос для того, чтобы добавить, например, какую-то строку.
Можно использовать команду INSERT для добавления новых строк в таблицу. ЗапишемINSERT INTO. Затем(через пробел) запишем имя таблицы(указанное при создании), в которую мы добавляем строку.
Затем (через пробел) в круглых скобках указываем список добавляемых полей. В нашем случае –imyaиfamil(имя и фамилия).
Обратите внимание,регистр букв здесь не важен, в отличие от языка Java. Вы можете использовать как маленькие, так и заглавные буквы. Обычно принято служебные слова писать заглавными буквами, а названия полей таблиц и какие-то значения – маленькими.Хотя, если писать всё маленькими или заглавными буквами, ошибки в этом не будет.
Далее, запишем словоVALUE (значение) и в круглых скобках указываем конкретные значения, помещаем их в эти колонки.
Так как две следующие колонки имеют строковый тип, записываем значения в одиночных кавычках. Пишем значение первой колонки –'Иван', ставим запятую,потом 'Петров'.Точно в таком же порядке, в каком указаны колонки (поля), идут их значения. Если имя'Иван'стоит на первом месте, значит оно будет вписано в колонку imya.Соответственно, famil– следующее поле, поэтому 'Петров'будет вписано в famil. Получился следующий запрос:
INSERT INTO tab00 (imya, famil) VALUES (‘Иван’, ‘Петров’);
Скопируем эту строку,она нам ещё пригодится. Нажимаем кнопкуGo(см. рис. 11.28)
Рис. 11.28
Вверху появилась зеленая галочка. Она означает, что запрос написан правильно и выполнен успешно(см. рис. 11.29).
Рис. 11.29
Здесь можно также посмотреть скорость, с которой был выполнен этот запрос, – всего лишь, за0,05 секунды.
Теперь переходим на закладку Browse(см. рис. 11.30).
Рис. 11.30
В таблице появилась следующая строка: Поле id равно 1, так как это первая строка (автонумерация начинается по порядку). Далее: Иван Петров –слова, указанные в запросе в заданном порядке (см. рис. 11.31).
Рис. 11.31
Вернёмся на закладкуSQL(см. рис. 11.28 ), вставим ещё пару строк с запросом и укажем другие имена и фамилии для заполнения таблицы.Получился следующий запрос:
INSERT INTO tab00 (imya, famil) VALUES (‘Петр’, ‘Семенов’);
INSERT INTO tab00 (imya, famil) VALUES (‘Дима’, ‘Гуляев’);
INSERT INTO tab00 (imya, famil) VALUES (‘Лена’, ‘Милова’);
Запрос выглядит следующим образом (см. рис.11.32):
Рис. 11.32
Нажмем кнопку Go. Запрос выполнился успешно.
Переходим на первую закладку Browseслева, позволяющую посмотреть данные в таблице. В ней появились еще три строки (см. рис. 11.33).Это новые, добавленные нами, строки.
В конце каждой SQLкоманды ставится точка с запятой, по такому же принципу, как и в языке Java.
Рис. 11.33
Теперь в нашей таблице присутствуют данные. Сделаем выборку данных при помощи команды SELECT:
Переходим снова на закладку SQL,выбираем SELECT,ставим пробел, указываем символ "*",затем снова ставим пробел.
Символ*("звездочка")означает, что будут выбраны все колонки из таблицы. В нашем случае их три.
Далее идет слово FROM (из). После этого слова указываем таблицу, из которой нужно получить данные. Затем указываем условия,по которым будет производиться отбор.Например: imya=Иван.
Таким образом, мы сформировали строку запроса, которая:SELECT (выбирать),* (все поля),FROM (из), tab00 (таблицы tab00), WHERE (где). В круглых скобках указываем: колонка imyaравна Иван.
SELECT * FROM tab00 WHERE (imya=’Иван’);
Получился следующий запрос:(см.рис. 11.34):
Рис. 11.34
Запрос позволит выбрать данные из таблицы. В нашу выборку попадут те строки, в которых есть записи 'Иван'в колонке imya.Запустим запрос на исполнение. Запрос выполнен успешно. Внизу получен результат запроса (см. рис. 11.35).
Рис. 11.35
Из таблицы, состоящей из четырех строк, была выбрана только одна строка, единственная, содержащая значение'Иван'в поле imya.
Вернёмся в таблицу,перейдем на самую левую закладку Browse. В таблице четыре строки.
Выполним следующую задачу: в третьей строке, где указанДима Гуляев,нужно имя Димазаменить на имя Вася. У нас появляется условие: изменитьДима на Вася только в той строке, где указана фамилия Гуляев.
Переходим на закладкуSQL, формируем следующий запрос:
UPDATE tab00 SET imya=’Вася’WHERE (famil=’Гуляев’);
UPDATE –изменение данных,tab00 – таблица, в которой мы будем его производить, SET–установить. Далее,указываем: imya=<новое значение>,WHERE–где. В круглой скобке указываем условиt: в нашем случае:(famil=’Гуляев’).
Например, нужно изменить поле imyaи присвоить ему значение 'Вася'. Если конструкциюWHERE не писать и запустить запрос на исполнение без неё,имя 'Вася'будет записано абсолютно во все строки таблицы. Поэтому дальше, при помощи условия WHERE,необходимо указать, в какие конкретно строки нужно вписать это имя: там, где значение поля familравно Гуляев: WHERE(famil=’Гуляев’). Запускаем на исполнение. Вверху зеленая галочка – значит, всё выполнилось успешно.
Переходим снова на самую левую закладку просмотра: там, где указана фамилия Гуляев, имя Димаизменилось на имя Вася(см. рис. 11.36):
Рис. 11.36
Таким образом, мы произвели изменение данных в таблице.
Теперь удалим одну из строчек таблицы, например, вторую. СделаемSQL-запрос,который удалит строку c id, равным2.
Снова переходим на закладку SQL,удаляем запрос, данный здесь по умолчанию.Записываем DELETE FROM (удалить из),указываем имя таблицы: tab00. И указываем условия: WHEREid=2. Получилось следущее:
DELETE FROM tab00 WHERE (id=2);
Таким образом, мы сформировали строку запроса, удаляющую из таблицы tab00строку с id, равным двум.
База данных редко содержит всего одну таблицу, как в нашем случае. Обычно таких таблиц большое количество. Поэтому таблицу, с которой вы работаете сейчас, нужно указывать конкретно.
Обратите внимание,idимеет целочисленный тип, поэтому значение указывается просто числом, а не в одиночных кавычках.
Далее – "Go". Появляется надпись: "Вы действительно хотите удалить?"Нажимаем кнопку: OK (см. рис. 11.37).
Рис. 11.37
Вверху появляется сообщение: запрос выполнен успешно.
Переходим на закладку просмотра данных и видим, что в таблице исчезла одна строка, строка с idномером 2 (см. рис.11.38).
Рис. 11.38
Когда в таблицу будут добавляться следующие строки, нумерация продолжится дальше, следующий номер будет5. Удаленные номера уже не занимаются новыми значениями, они так и остаются отсутствующими.
Мы создали базу данныхMySQL. Она расположена локально на нашем компьютере.localhost – это значит, база данных расположена локально.
В реальности база данных физически может быть расположена,например, где-нибудь на web-сервере или на удаленном компьютере. Не обязательно именно на нашем.
Создав простую базу данных, добавив в неё всего одну таблицу,теперь поработаем с ней среде разработки на языке Java. Не будем закрывать окно браузера, свернём его,оно нам еще пригодится. Перейдём на сайтwww.mysql.com(см. рис. 11.39):
Рис. 11.39
Это сайт MySQL. Здесь мы возьмем библиотеку, необходимую для работы с базой данных MySQLиз языка Java. Наwww.mysql.comвидим изображение дельфинчика. Перейдем на закладку Downloads– загрузки(см. рис. 11.40).
Рис. 11.40
Появится список, из него необходимо выбрать строку MySQL Connectors(см. рис.11.41).
Рис. 11.41
Connector–это функционал, позволяющий из различных языков программирования подключаться к базе данных.
Разработчики СУБДMySQLвыложили на своем сайте библиотеки,чтобы программисты могли ими воспользоваться и подключиться к их базе данных для возможности работы с MySQL. Нажимаем на ссылкуMySQLConnectors. Появился список для различных языков программирования.Например, есть библиотека для языка C, для С++, С#.
Нам нужен Connector/J.(J – язык Java). Внизу есть комментирующая подсказка, что эта библиотека как раз именно для языка Java(см.рис. 11.42).
Рис. 11.42
Выбираем эту строку,переходим по ссылке. Здесь нам предлагают скачать Connector 5.1.19. Версии периодически обновляются.Из двух видов архива выберем ZIP-архив. Нажимаем на кнопку "Скачать"(см. рис. 11.43).
Рис. 11.43
Предлагается либо выполнить регистрацию, либо указать свойe-mail и пароль. Так как мы не зарегистрированы, необходимо зарегистрироваться на сайте (см. рис. 11.44).
Рис. 11.44
Поля, помеченные звездочкой, обязательны для заполнения.Имя и фамилию можно указать произвольно,главное – адрес электронной почты обязательно должен быть правильный, действующий.(см. рис.11. 45):
Рис. 11.45
Среди писем в нашей электронной почте (указанной при регистрации), найдем письмо с сайта MySQL: "Welcome to MySQL" (см. рис.11.46). В письме есть пароль для скачивания (см. рис. 11.47).
Рис. 11.46
Рис. 11.47
В дальнейшем, если потребуется что-либо скачать с сайтаMySQL, мы сможем воспользоваться этим входом в личный кабинет. Вернёмся на сайт MySQL.
Вспомним, для скачивания библиотеки нужно перейти на закладку Download,выбрать MySQL Connectors. Затем выбрать библиотеку для языкаJava, перейти по ссылке и из двух предложенных архивов выбрать ZIP-архив. Нажимаем Скачать, появляется список для скачивания.
Выбираем любую строчку,например, HTTP(см. рис. 11.48).
Рис. 11.48
Здесь можно выбрать любой раздел. Сохраняем файл mysql-connector-javaк себе на компьютер (см. рис. 11.49).
Рис. 11.49
Происходит скачивание библиотеки. В самом начале, при установке комплекта разработчика для Java, мы выбрали стандартный пакет, позволяющий реализовывать многие задачи в программировании. Если же требуется функционал, не входящий в этот пакет, нужно найти необходимую библиотеку и подключить её к проекту. В нашем случае эту библиотеку мы смогли найти на сайте www.mysql.com.
Открываем скачанный архив. Выполняем извлечение –появляется папкаmysql-connector-java. В этой папке находим файл mysql-connector-java.Этот файл является jar-архивом (см. рис. 11.50).
Рис. 11.50
Именно в этомjar-архиве находится библиотека, позволяющая работать с MySQL.Скопируем её и поместим в корень дискаC:/.
Теперь здесь C:/находится файлmysql-connector-java.jar. С его помощью можно работать с базой данныхMySQLиз среды разработки Eclipse.. Сайт MySQLможно закрыть, мы из него уже взяли всё необходимое для работы. Откроем среду разработки EclipseдляJava.Создадим новый проект
Пусть браузер с phpMyAdminостанетсяоткрытым –здесь находится таблица с тремя строками: будем использовать её для проверки правильности загрузки данных.
Напишем программу,позволяющую получить данные для Java-приложения из базыMySQL.Итак, создаём новый проект.
Далее, к этому проекту добавляем класс.
Мы сейчас не будем создавать какой-то интерфейс, напишем небольшую программу, позволяющую подключиться к базе данных и получить из неё информацию.
Назовём класс prog, и поставим галочкуpublic static void main,нажимаем кнопку Готово.
Появилась заготовка программы, внутри которой мы будем писать программный код.
Прежде, чем приступить к написанию программного кода, подключим к проекту библиотеку, полученную с сайтаMySQL (см. рис.51).
Рис. 11.51
Для этого в контекстном меню выделенного названия проекта,выбираем команду "Свойства"(см. рис. 11.52).
Рис. 11.52
Выбираем слева Путь компоновки Java(см. рис. 11.53):
Рис. 11.53
Перейдем на закладку"Библиотеки", и выберем пункт "Добавить внешние JAR..."(см. рис. 11.54):
Рис.11.54
Переходим на дискC:/, где сохранена библиотека, выбираем ее,нажимаем на кнопку "Открыть", затем на кнопку "Ok".Библиотека добавлена к нашему проекту(см. рис. 11.55).
Рис. 11.55
Чтобы её увидеть, нужно открыть самую нижнюю ветвь (см. рис. 11.56).
Рис. 11.56
Чтобы воспользоваться в программе библиотекой для работы с базой данных MySQL,запишем команду import, подключим java.sql.*.
Для этого, перейдём в основную программу и в самом верху напишем:
// Подключаем библиотеку для работы с MySQL
import java.sql.*;
Далее, прежде всего,создадим переменную типа Connection – подключение:
Наберём первые несколько букв, нажмём <Ctrl>+Пробел. В списке найдём Connection, вставляем.
Не забывайте максимально эффективно использовать вспомогательную подсветку кода!
Создадим переменную под названием connect и перейдём на следующую строку:
// Подключаем библиотеку для работы с MySQL
import java.sql.*;
// Главный класс программы
public class prog {
// Метод запуска программы
public static void main(String[] args) {
// Переменная типа -Подключение
Connection connect;
}
}
Затем создадим конструкцию try ... catch. Почему try ... catch?
Дело в том, что подключение к базе данных и считывание из неё данных не всегда бывает успешным. Может возникнуть исключительная ситуация,например, если указать неправильное имя базы данных, логин или пароль пользователя. Чтобы отработать такую ситуацию, потребуется конструкция try ... catch.
// Конструкция попытка-исключение
try
{
}
catch(Exception ex) {}
Переходим к блокуtry, внутри которого и будет находиться основной функционал.
Сначала создаём переменную типа String–строка. Называем её, например, driverName, и в двойных кавычках, указываем имя драйвера com.mysql.jdbc.Driver, затем добавляем строку для использования этого драйвера:
try
{
// Переменная с именем драйвера для подключения
String driverName = "com.mysql.jdbc.Driver";
Class.forName(driverName);
}
catch(Exception ex) {}
Следующее, что нужно сделать – указать параметры подключения: Создаём переменную строкового типа, называём еёserverNameи присваиваем ей значение localhost. Что это означает?
Переменная servernameотвечает за имя сервера, или компьютера, на котором хранится базаMySQL, т. е. того,где установлен MySQL. В нашем случае приложение запускается с того же компьютера, на котором установлен MySQL. Т.к. MySQLбыл нами установлен локально указываемlocalhost. Если бы база данных была размещена удаленно, на сервере, нужно было бы указать другой путь– путь к этому серверу.
// Имя сервера базы данных
String serverName = "localhost";
Далее, создаём ещё одну переменную строкового типа, называем её,например, mybase. В двойных кавычках указываем имя базы данных, с которой собираемся работать:base00:
// Имя базы данных
String mybase = "base00";
Переходим на время вphpMyAdminи видим:имя базы –base00. Это созданная нами база.
Создадим еще одну переменную строкового типа. Прописываем в ней следующее:
// Строка подключения:указываются сервер и имя базы данных
String url_ = "jdbc:mysql://"+serverName+"/"+mybase;
serverName–имя сервера.В нашем случае за это отвечает переменнаяserverName, имеющая значение localhost.Mybase–это имя базы данных.
Далее создадим ещё две переменных для логина и пароля пользователя базы данных MySQL. Это будут переменные строкового типа:
// Имя пользователя базы данных
String username = "root";
// Пароль пользователя базы данных
String password = "";
При работе с базой данных могут создаваться различные пользователи, у которых есть логин и пароль. У них будут определённые права для работы с базой данных. У базы данных есть пользователь, который называется суперадминистратором. Суперадминистраторобладает полными правами доступа к базе данных.
В дополнение могут создаваться и другие пользователи.Неполный доступ к информации, хранящейся в базе данных, предусмотрен для защиты от умышленного или неумышленного изменения.Когда устанавливается MySQL, по умолчанию создается пользователь с именем root–это и есть суперадминистратор. Пароля у него изначально нет. В дальнейшем, при желании,этот пароль можно ввести, можно создать и других пользователей. П
Поэтому в создаваемой нами программе мы указали именно такие значения логина и пароля пользователя:
Логин – root;
Пароль –пустая строка.
Теперь можно выполнить подключение к базе данных. Для этого понадобится переменная connect, объявленная в самом начале:
// Установление подключения к базе данных
connect = DriverManager.getConnection(url_,username,password);
В круглых скобках указываем параметры, описанные выше:строку, содержащую имя сервера и базы данных url_, затемusername- имя пользователя, и, наконец, password - пароль для подключения к базе данных.
В этот момент, если все данные правильные, произойдёт подключение к базе данных.
Если имя пользователя,пароль или имя базы данных указаны неверно,или не запущен MySQL, (вспомним, для запуска MySQLнужно дважды щелкнуть на рабочем столе StartDenwer, для остановки–Stop Denwer),подключение к ней не выполнится.
Теперь создадим строку запроса, которую нужно выполнить. Возьмем переменную строкового типа и присвоим ей значение в двойных кавычках:
// Строка запроса SQL к базе данных
String query = "SELECT * FROM tab00";
Такой запрос позволит выбрать все строки и поля из таблицы tab00. По большому счету,в виде результата мы получаем всю таблицу,состоящую из трех строк.
Далее необходимо сформировать запрос к базе данных.Обращаемся к переменной connectи вызываем метод создания запроса.
// Создание запроса
Statement stmt = connect.createStatement();
Создаём переменнуюrs, которая будет получать результат. При запросе к базе данных (в нашем случае это запрос SELECT), результат вернётся тоже в виде таблицы. Этот результат и будет помещаться в переменнуюrs, переменную типа ResultSet:
// Выполнение запроса с получением результата
ResultSet rs = stmt.executeQuery(query);
Метод executeQueryвыполняет запрос, указанный виде строки в переменнойquery, т. е. SQL-запрос с командой SELECT.
Далее формируем циклwhile, чтобы обработать результаты, полученные после выполнения запроса в переменную rs.
Вернёмся в phpMyAdmin. Скопируем строку запроса, прописанную в программном коде:
SELECT * FROM tab00
Перейдём в phpMyAdminна закладкуSQL, и этот запрос поместим туда и выполним. Внизу появится результат в виде таблицы. Это и есть результат выполнения запроса executeQuery, который попадёт (вернётся) в переменную rs. В переменнуюrsв результате попадет вся таблица, в цикле whileмы будем перебирать строки полученной таблицы. Перед циклом создадим вспомогательную строковую переменную,которая понадобится нам внутри цикла:
String temp;
// Цикл для перебора записей (строк) результата запроса
while (rs.next())
{
}
Метод next()получает следующую строку из таблицы rs,получение происходит пока есть строки в таблицы, значит, цикл выполнится столько раз –сколько строк в полученной таблице. Внутри цикла while будем обрабатывать значения конкретных полей–значение переменной temp,объявленной перед циклом, присвоим значение интересующего нас поля и выведем это значение в консольное окно:
String temp;
// Цикл для перебора записей (строк) результата запроса
while (rs.next())
{
// Получение значение поля (колонки) по имени
temp = rs.getString("imya");
// Вывод в консольное окно
System.out.println(temp);
}
Например, возьмём полеimya. Указываем его в двойных кавычках, метод getString()возвращает значение по указанному имени колонки таблицы. Выводим полученное значение консольное окно.
После цикла whileнам осталось сделать последний шаг –закрыть наше подключение к базе данных. Не забывайте это делать!
// Закрытие подключения к базе данных
connect.close();
Запустим программу на исполнение.
Внизу, в консольном окне, появились три строки с именами.Сверим с базой данных. Если вы хотите получить значения в других колонках, то вместо imya- можно указать имена других колонок, в нашем случае familилиid.
Попробуйте это сделать и сверьте данные выводимые в консольное окно с данными из базы MySQL. Обратите внимание:если какие-то данные ошибочны, например,указано неверное имя поля, сформирован неправильный запрос, скажем, SELECT1, указано неверное имя пользователя, к примеру, root1, имя несуществующей базы данных, - запрос не выполнится успешно,и мы не получим требуемого результата.Полностью программный код нашей программы выглядит так:
// Подключаем библиотеку для работы с MySQL
import java.sql.*;
// Главный класс программы
public class prog {
// Метод запуска программы
public static void main(String[] args) {
// Переменная типа -Подключение
Connection connect;
// Конструкция попытка-исключение
try
{
// Переменная с именем драйвера для подключения
String driverName = "com.mysql.jdbc.Driver";
Class.forName(driverName);
// Имя сервера базы данных
String serverName = "localhost";
// Имя базы данных
String mybase = "base00";
// Строка подключения:указываются сервер и имя базы данных
String url_ = "jdbc:mysql://"+serverName+"/"+mybase;
// Имя пользователя базы данных
String username = "root";
// Пароль пользователя базы данных
String password = "";
// Установление подключения к базе данных
connect = DriverManager.getConnection(url_,username,password);
// Строка запроса SQL к базе данных
String query = "SELECT * FROM tab00";
// Создание запроса
Statement stmt = connect.createStatement();
// Выполнение запроса с получением результата
ResultSet rs = stmt.executeQuery(query);
String temp;
// Цикл для перебора записей (строк) результата запроса
while (rs.next())
{
// Получение значение поля (колонки) по имени
temp = rs.getString("imya");
// Вывод в консольное окно
System.out.println(temp);
}
// Закрытие подключения к базе данных
connect.close();
}
catch(Exception ex) {}
}
}
Рассмотренный пример программного кода взят из файлов,прилагаемых к библиотеке MySQL. Если вы вспомните,то после распаковки архива с библиотекой скачанной для MySQLмы взяли оттуда только JAR-архив,но там были и другие файлы и папки, в них можно найти примеры использования этой библиотеки. Другие подобные примеры можно почерпнуть, например, в специализированной литературе по языку Java. Некоторые моменты можно найти вИнтернете, а также на сайте MySQL.
Чтобы написать программный код, созданный на этом занятии,конечно, сначала нужно где-то найти пример,образец программного кода, где решается подобная задача. Потом этот образец можно использовать в своих целях.
Сохраняйте у себя программные коды как рецепты решения разных задач, создавайте свою коллекцию.Например, если перед вами встанет задача организовать базу данных и поработать с ней - у вас уже есть определенный рецепт.Вам не нужно будет тратить время на поиск информации в Интернете, вы сможете применить наработку, сделанную на этом занятии.
Таким образом, для организации взаимодействия баз данных с приложениями Javaнужно сделать следующие основные действия:
Создать переменную типа Connection, которая отвечает за подключение к базе данных.
Указать имя драйвера, используемого для работы. Это имя необходимо брать из примеров программного кода, поставляемого с библиотекой.
Указать параметры подключения к базе данных. Первый параметр – это сервер, т. е.компьютер, на котором расположена база данных. В нашем случае –localhost, т.к. база расположена на компьютере локально. Далее идёт имя базы, имя пользователя и пароль.Эти четыре основных параметра нужно обязательно указать, чтобы подключиться к базе данных.
Выполнить подключение к базе данных при помощи метода getConnection(). Если оно неуспешно, мы ничего не сможем с этой базой сделать. Если успешно, можем получать оттуда данные, либо изменять их.
Сформировать SQL-запрос, который нужно выполнить,после его выполнения результат возвращается в переменную rsв виде набора строк.
Обработать полученный результат, то есть перебрать полученные строки. Для этого использован цикл while, внутри которого сделан перебор строк, и выведены данные в консольное окно.
Закрыть соединение с базой данных–close()после окончания работы с базой.
Конструкция catchничего не выполняет, если работа с базой данных оказывается неуспешной, она не срабатывает, никаких действий не происходит.
Если в данном случае мы выводили данные в консольное окно, в приложении для Windowsэти данные можно выводить, в текстовые поля, в различные списки.Пользователь эти данные сможет изменять, а мы сможем обновлять базу данных. Эти данные будут храниться после того, как пользователь закончил работу с приложением.
При следующем открытии приложения эти данные будут автоматически загружаться из базы данных.
Занятие 12. "Создание игры "Предсказание будущего" с использованием базы данных"
На прошлом занятии мы познакомились с понятием "база данных".Рассмотрели основные характеристики базы данных, научились их создавать, формировать таблицы и простые SQL-запросы, а также узнали, как можно работать с базой данных из языка программирования Java.На сегодняшнем занятии рассмотрим практический вариант применения базы данных – при создании компьютерной игры.
Напишем небольшую компьютерную игру под названием "Предсказание будущего". Для хранения данных, при написании этой игры используем небольшую базу данных.
Сначала вкратце опишем, в чём будет заключаться игра. Игра довольно известна, в Интернете можно найти её различные варианты. Принцип игры следующий: формируется окно, внутрь него помещается своеобразный магический квадрат. Пользователь должен посмотреть на этот квадрат, подумать о том, чего он хочет от будущего, нажать на кнопку "Узнать", - программа должна ему выдать некоторую фразу. Фразы,выдаваемые программой, будут храниться в базе данных. Программа будет выбирать одну из них абсолютно произвольно.
Как показывает практика,при таких случайных ответах, предсказания оказываются весьма "точными", так как все формулировки предсказаний довольно приблизительные.
Мы будем использовать около двадцати различных фраз. Все они будут храниться в нашей базе данных.
Прежде, чем приступить к разработке самой игры на языке Java, создадим базу данных, заполним её данными, а затем приступим к написанию приложения.
Запустим Denwer – щёлкнем ярлычокStart Denwerна рабочем столе (см. рис. 12.1) (это пакет, который мы установили на прошлом занятии).
Рис. 12.1
Вспомним, если в этот момент на компьютере окажутся работающие программы, такие как Skypeили TeamViewer, или будет запущен какой-то другой web-сервер,воспользоваться Denwerне удастся, так как программы будут конфликтовать. Поэтому не забудьте временно отключить другие программы перед запуском Denwer.
После запуска Denwerоткрываем браузер и набираем localhost(см. рис.12.2) – открывается уже знакомая нам страничка с надписью "Ура, заработало!".
Рис. 12.2
Перемещаемся ниже,доходим до таблицы, находим в ней строчкуphpMyAdmin(см. рис. 12.3).
Рис. 12.3
Переходим по этой ссылке и попадаем в панель, позволяющую администрировать базы данных MySQL.
Первое, что мы делаем–создадим новую базу данных для нашей игры. Назовем базу game(см. рис. 12.4).
Рис. 12.4
Нажимаем кнопку Создать (Create).Появляется база данных –в левой части окна мы видим её в списке. В базе пока ещё нет ни одной таблицы, поэтому добавляем в неё таблицу под названием tablи указываем количество необходимых полей (см. рис. 12.5).
Рис. 12.5
Нажимаем кнопку Go (Выполнить)-появляется следующее окно.
Здесь нужно указать наименование полей, а также тип данных,которые будут храниться в них. Первое поле называем id – это порядковый номер строки в таблице. Данное поле будет являться первичным ключом. Второе поле назовёмtext. Тип данных первого поля оставим целочисленным –INT, тип данных второго поля выбираем VARCHAR–текстовый, строковый тип данных, и указываем максимальное количество символов, возможных в этой строке. Выбираем255 (с некоторым запасом, хотя фразы будут намного меньше по размеру) (см. рис. 12.6).
Рис. 12.6
Тип VARCHAR хорош тем, что если количество хранимых символов в строке меньше максимального количества,храниться будет ровно то количество символов, которое указано в строке, пустые символы не будут заполняться пробелами.Нажмем на кнопку "Сохранить(Save)".
Далее,
создадим ещё одну настройку для поля
id.
Необходимо сделать автонумерацию и
назначить это поле первичным ключом.Нажимаем
кнопку
("карандаш")(см.
рис. 12.7):
Рис. 12.7
Перейдем в режим редактирования этого поля, и поставим галочку AUTO_INCREMENT(см. рис. 12.8):
Рис. 12.8
Нажав на кнопку Сохранить (Save), мы увидим наверху окно с сообщением об ошибке(см. рис. 9). Если какая-то операция, которую мы пытаемся выполнить, будет неуспешной, т. е. если есть ошибка, сверху будет появляться таблица с соответствующим сообщением.
Рис. 12.9
Вернёмся
в таблицу,выделим галочкой поле
idи
нажмём на кнопку
("ключик"),
находящийся справа (см.
рис. 12.10):
Рис. 12.10
Нажмем на кнопку "Ok". После этого выбранное поле становится первичным ключом, т. е. поле idоднозначно идентифицирует любую запись с таблицей.
Теперь вновь выберем поле id,переходим в режим редактирования и ставим галочку AUTO_INCREMENT. Операция выполнилась успешно, о чём свидетельствует другое окно с зелёной галочкой (см. рис. 12.11).
Рис. 12.11
Поле idявляется первичным ключом, т. е. каждая строка таблицы однозначно идентифицируется по номеру, так как одинакового номера у двух различных строчек быть не может.
Таким образом, таблица создана, но в ней пока нет никаких данных.Чтобы добавить какую-либо строчку в таблицу, переходим на закладку SQL, где можно сформировать SQL-запрос. СформируемSQL-запрос на добавление одной строки:
INSERT INTO tabl (text) VALUES ('Тест');(см. рис. 12.12).
Рис. 12.12
Используем командуINSERT INTOдля таблицы tabl,указываем в круглых скобках поле text, в которое нужно занести значение. Далее идёт слово VALUES, значения, которые нужно занести. В круглых скобках указываем значение, помещаемое в поле text. Так как поле textстроковое, в одиночных кавычках помещаем надпись"Тест",чтобы проверить, попадут ли данные в таблицу. Поле idне указываем, т.к. оно является автоматически нумерующимся, и номер будет присваиваться автоматически.
Нажимаем на кнопкуGo(Выполнить),видим зеленую галочку, свидетельствующую об успешном выполнении SQL-запроса,переходим на крайнюю левую закладку, и видим, что в списке появилась одна строка с номером 1 (см. рис. 12.13):
Рис. 12.13
Таким образом, при помощи подобных запросов на добавление строк можно добавлять записи в таблицу.
Мы сейчас посмотрели,какую именно базу данных мы будем использовать для хранения данных игры и как создать структуру хранения информации в этой базе. Теперь загрузим заранее подготовленные данные в таблицу, чтобы не набивать их с самого начала.
Загружаемые данные будут в точности совпадать (имя базы и таблицы) с уже существующими.
Для того чтобы между ними не возникло конфликтов, на всякий случай, удалим созданную только что базу данных. Мы создали её как тестовый экземпляр, чтобы посмотреть, какую именно структуру использовать, когда формировали данные базы. Теперь загрузим базу полностью. Для этого нажимаем Server: localhost(см. рис. 12.14).
Рис. 12.14
Выбираем Databases(см.рис. 12.15), базы данных,переходим на эту закладку:
Рис. 12.15
В
списке баз видим базуgame,
удаляем её,нажав на кнопку
(см.
рис.12.16).
Рис. 12.16
Задается вопрос на подтверждение удаления, соглашаемся, и база данных удаляется.
Данные базы можно, при желании, выгружать и загружать обратно.Можно перенести их, например, на другой компьютер, или сделать архивную копию. Для этого служат закладки Exportи Import, соответственно выгрузка и загрузка данных. Выполним загрузку данных. Переходим на закладкуImport(см. рис. 12.17).
Рис. 12.17
Нажмем на кнопку "Обзор" (см. рис. 12.18).
Рис. 12.18
Выберем файл, в котором находятся данные нашей базы. Они подготовлены и лежат в корне дискаC:\. Выберем файл с названием localhost.sql.Нажмем на кнопку "Открыть"(см. рис. 12.19):
Рис. 12.19
Нажмем на кнопку Go (Выполнить)Сверху появляется сообщение об успешной операции(см. рис. 12.20).
Рис. 12.20
В списке появилась база с названием game(см. рис.12.21):
Рис. 12.21
Структура её в точности совпадает с той, которую мы только что создали как тестовый вариант. Нажимаем на неё, открывается список таблиц этой базы.Выбираем единственную таблицу tabl(см.рис. 12.22).
Рис. 12.22
Загрузились данные,которые мы подготовили в файле, заранее выгрузив его из наполненной базы.
Таблица теперь заполнена: id – это номера строк, и в поле textнаходятся конкретные фразы –они могут случайным образом выдаваться пользователю. Фразы достаточно простые: "Да", "Нет", "Не знаю", "Затрудняюсь ответить", "Как бог пошлёт", "Остерегайся этого"и т. д.(см. рис. 12.23):
Рис. 12.23
Эти расплывчатые по смыслу фразы можно выдать в качестве предсказания.
Для выполнения выгрузки базы данных необходимо нажать на ссылкуServer: localhost(находится сверху) (см. рис.14), далее перейти на закладкуExport (выгрузка данных ) (см. рис.12.24):
Рис. 12.24
В списке выбрать нужную базу, например, game(см. рис. 12.25).
Рис. 12.25
Поставим галочку Save as file ( сохранить в файл) и нажмем на кнопку Go (Выполнить) (см. рис. 12.26):
Рис. 12.26
Появилось окошко,предлагающее выполнить сохранение файла(см. рис. 27). Этот файл будет содержать в себе все данные, находящиеся в базе game, только что выбранной в списке.
Рис. 12.27
Если нажать "Ok", происходит сохранение в файл с расширением .sql. Для осуществления выгрузки базы данных пользуются именно этой операцией. Вновь вернёмся к данным,находящимся в таблице. Второй вариант для загрузки данных в базу –это выполнение следующего SQL запроса:
INSERT INTO tabl (id, text) VALUES
(1, 'Да'),
(2, 'Нет'),
(3, 'Не знаю'),
(4, 'Скорее всего'),
(5, 'Скорее нет, чем да'),
(6, 'Скорее да, чем нет'),
(7, 'Вероятно'),
(8, 'Вполне возможно'),
(9, 'Затрудняюсь ответить'),
(10, 'Даже и не думай'),
(11, 'Мечтать не вредно!'),
(12, 'Тебе помогут'),
(13, 'Надейся на себя'),
(14, 'Как бог пошлет'),
(15, 'Придется хорошо заплатить'),
(16, 'Остерегайся этого!'),
(17, 'А оно тебе надо?'),
(18, 'Будет тяжело'),
(19, 'Все получится'),
(20, 'С этим повезет'),
(21, 'Будущее видно не четко');
Для выполнения этого запроса необходимо иметь базу gameи в ней одну пустую таблицу tabl. Это именно то, что мы создавали на предыдущем этапе. Другими словами, необходимо поместить в таблицу двадцать одну строку с фразами, указанными в запросе.
Браузер не закрываем,свернём его: в дальнейшем к нему вернемся. Перейдём в среду разработкиEclipseдля того,чтобы начать формировать приложение.Теперь база данных готова, данные в ней есть, остаётся написать компьютерную игру.Создаём новый проект, называем его lesson_24, нажмем на кнопкуГотово.Выбираем в списке проектов только что созданный проект, выделяем его мышью,нажимаем правую клавишу, выбираем "Создать", переходим на закладку "Прочие"(см. рис. 12.28).
Рис. 12.28
Воспользуемся визуальным конструктором для разработки интерфейса нашей игры. В появившемся окне выбираем закладку Window Builder, открываем её, затем выбираем Swing Designer, в списке находим JFrame(см.рис. 12.29).
Рис. 12.29
Нажимаем кнопку Далее, имя указываемprog(см. рис. 12.30),нажимаем кнопку Готово.Сформировалась форма, но пока она ещё пуста:
Рис. 12.30
Для нашей задачи, кроме формы JFrame,необходимо добавить к проекту еще одну составляющую. Снова вернёмся к структуре пакетов. Выделяем lesson_24(см. рис. 12.31):
Рис. 12.31
В контекстном меню выбираем команду "Создать"и переходим на закладку Прочие(см. рис. 28):В том же самом разделе (Swing Designer) выбираемJPanel(см. рис. 12.32).
Рис. 12.32
Нажимаем кнопку Далее, и указываем имяpanel (см. рис. 12.33).
Рис. 12.33
Имя, конечно, может быть и другим. Нажимаем кнопку Готово, сверху появляется еще одна закладка. Таким образом, проект содержит в себе два файла с расширением .java(см. рис. 12.34).
Рис. 12.34
В одном находится классJFrame, т. е.основное окно, во –JPanel,панель, которая вкладывается в окно JFrame. Класс JPanelбыл создан дополнительно, для возможности вносить изменения в панель, вкладываемую в окно. На панели будет отображаться своеобразный магический квадрат,используемый в приложении.
Для возможности модернизировать эту панель и был создан отдельный класс, наследуемый от классаJPanel. Переходим на закладку panel.java, там находится начальный программный код:
import javax.swing.JPanel;
public class panel extends JPanel {
/**
* Create the panel.
*/
public panel() {
}
}
Внутри этого класса добавим функционал, отвечающий за графическое отображение на этой панели.Создадим отрисовку магического квадрата на панели. Удалим исходный программный код и поместим следующий:
// Добавляем необходимые библиотеки
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class panel extends JPanel {
// Добавляем необходимые библиотеки
private int val=0;
public panel() {
// Включаем режим произвольного размещения
// элементов на панели
setLayout(null);
Timer tm = new Timer(200,new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// Увеличиваем переменную на единицу
val++;
// Если значение становится 256 обнуляем его
if (val==256) val=0;
// Вызываем метод перерисовки панели
repaint();
}
});
// Запускаем таймер
tm.start();
}
// Метод отрисовки панели
public void paintComponent(Graphics gr)
{
// Перерисовка панели(очищение панели)
super.paintComponent(gr);
// Цикл для отрисовки магического квадрата
for (int i=0;i<=255;i++)
{
// Устанавливаем нужный цвет
gr.setColor(new Color(0,(i*val)%255,0));
// Рисуем прямоуогольник
gr.drawRect(250-i/2, 220-i/2, i, i);
}
}
}
Сначала мы добавим необходимые библиотеки.
Затем перейдем к классу панели и произведём некоторые модернизации. Добавим таймер.
Создаём переменную типаTimer, далее–объектTimer. Первый параметр – это временная задержка, с которой будет срабатывать таймер, укажем 200/1000секунды. Таким образом, таймер будет срабатывать пять раз в секунду.
Метод actionPerformed()будет срабатывать и запускаться в момент срабатывания таймера, т. е. будет выполняться пять раз в секунду.Следовательно, всё, прописанное внутрь метода actionPerformed(), будет выполняться через определённый временной интервал.
Теперь на панели JPanelмы сможем изобразить квадрат, переливающийся зелёными цветами. Только что созданный таймер нужен, чтобы квадрат менял цвет постоянно через определенный интервал времени, т. е., перерисовывался.
Перерисовку, как обычно выполняем при помощи метода paintComponent(). Под конструктором класса сразу же создадим этот метод.
Запишем public void paintComponent(), в круглых скобках создадим переменную типаGraphics, назовём её, например, gr.
Создадим тело методаpaintComponent() – этот метод мы уже многократно использовали. В данном случае,он будет использоваться для тех же целей–выполнять отрисовку на панели.
Сначала перерисовываем–очищаем панель. Т. е., сначала, будет выполняться,так называемая, перерисовка по умолчанию.Эта перерисовка, по большому счету, будет выполнять очищение всей панели,перерисовывая её по умолчанию серым цветом, а затем уже будет выполняться заданная нами отрисовка.
Выведем определенное количество прямоугольников. Пусть рамка каждого прямоугольника отличается цветом от рамки предыдущего. Таким способом можно добиться некоторого перелива цвета,воспроизводя это действие в цикле.
Для того чтобы магический квадрат менял свою цветовую гамму при срабатывании таймера, в самом верху создана переменная класса. Она названа valи ей присвоено начальное значение 0. Это числовая переменная целого типа. Это будет вспомогательная переменная, она будет изменяться каждый раз при срабатывании таймера. Тогда отрисовка магического квадрата каждый раз после срабатывания таймера будет происходить несколько иным образом. Посмотрим, как именно.
Внутри метода actionPerformed()запишем val++ – это значит, что значение переменной пять раз в секунду (при срабатывании таймера) будет увеличиваться. Далее запишем конструкциюif(), если. if (val==256), переменной valприсваивается значение 0, т. е.,переменная обнуляется. Эта конструкция нужна для того, чтобы значение переменнойvalникогда не превышало значение255. После превышения значение переменной обнуляется, и с нуля начинается новый отсчёт. Таким образом, значение переменойval изменяется по кругу от 0 до 255 по возрастанию. Задействуем эту переменную для отображения цветовой гаммы. Интенсивность трех составляющих цвета (RGB – красный, зеленый и синий) указываются в диапазоне от 0до 255.
Затем вызываем методrepaint(),перерисовка. Метод repaint()– это вызов методаpaintComponent(),который будет выполняться каждый раз, при срабатывании таймера. Он будет производить рисование магического квадрата. Внутри метода paintComponent()записываем цикл for. Внутри цикла forобъявляем счетчик цикла, присваиваем ему изначальное значение 0,записываем условие i<=255. Число 255–ограничение значения переменной val (компоненты RGBне могут превышать значение 255).
Далее записываем i++ – на каждом шаге цикла значение переменной iувеличивается на единицу. При помощи фигурных скобок ограничиваем тело цикла. Внутри тела цикла обращаемся к переменной типа Graphics, устанавливаем цвет при помощи метода setColor() (установить текущий цвет).
В круглых скобках указываем нужный цвет. Для этого создаём новый объект типа Сolor, он и является цветом. Внутри зададим три параметра,разделенные запятыми. Это и есть составляющие RGB,их значения меняются в диапазоне от 0до 255включительно.Изменяя эти компоненты, можно получать различные цвета.
Всего существует более16-ти миллионов всех возможных комбинаций этих трёх составляющих, т. е. при задании цвета можно перебрать более 16-ти миллионов цветов. Большего количества цветов человеческий глаз уже не различает.
Для изменения на каждом шаге цикла находящейся по центру зелёной компоненты квадратов, записываем формулу.Берём счётчик цикла i, умножаем его на переменную val. Счётчик цикла будет меняться от 0 до255, и на каждом шаге будут получаться различные цвета.Точно так же переменная valбудет изменяться по таймеру: Когда таймер срабатывает первый раз, значение переменной valравно 0. Далее значение переменной valстановится равным 1, и в следующий раз цикл forвыполняется со значением val, равным 1. iв цикле будет изменяться от 0до 255, а значение val –будет равно 1.
На следующем шаге срабатывания таймера значение переменнойval изменяется на2, таким образом,следующий раз цикл forбудет каждый раз использовать значение 2.Умножая iнаval, мы будем получать различные оттенки зелёного цвета,меняющиеся со временем, так как, при срабатывании таймера, значение переменнойvalизменяется.
Произведение заключаем в круглые скобки и выполняем такую операцию: %255.
Знак % – это остаток от деления. Допустим, если число 17 разделить на 5, остаток от деления будет равен2. Для данного случая, можно написать: 17%5=2. Эта операция необходима, чтобы текущее значение никогда не превышало 255,т. к. остаток от деления при делении на255никогда не может превышать это число. Произведениеiна valиногда будет превышать 255. Чтобы этого избежать, приходится выполнять операцию деления на 255 и взятие остатка.
Далее, вновь обращаемся к переменной gr и вызываем метод drawRect(). Метод drawRect()рисует прямоугольный контур, у него внутри четыре параметра:первые два – координаты верхней левой угловой точки,третий – его ширина и четвертый – его высота. В качестве третьего и четвертого параметра указываем значениеi. Значит, ширина и высота квадрата на каждом шаге цикла увеличатся на 1.Таким образом, квадраты и их рамки будут идти рядом друг с другом.
Вместо угловой точки записываем следующее: возьмём некоторое смещение, чтобы квадрат выводился с отступами от левой и верхней границы окна.Получим выражения: для x: 250 – i / 2, для y: 220 – i / 2.
Зачем здесь выполнять вычитание и деление счетчика iна 2? Счетчик iотвечает за ширину и высоту. Мы хотим вывести все квадраты так,чтобы их центр находился в одной точке. Так как первые два параметра являются параметрами не центральной точки, а верхней левой угловой точки квадрата,необходимо брать ровно половину ширины и высоты квадрата и производить вычитание из некоторого числа. Таким способом мы добьёмся того, что центр всех квадратов будет находиться в одной точке. После запуска посмотрим, как всё это будет выглядеть в рабочем виде.
На этом формирование класса panelзакончено, можно сохранить проект и перейти на соседнюю закладку –prog.java. Там находится программный код, который был создан автоматически при создании проекта. Здесь необходимо сделать небольшое исправление.
Панель, в которой мы произвели отрисовку магического квадрата,должна быть вложена в окно JFrame. Именно её необходимо указать как используемую там панель. Таким образом, вместо JPanel, указываем название класса panel. Если перейти в его закладку, видно,–только что доработанный класс, который наследуется из класса JPanel,называется как раз panel.
public class prog extends JFrame {
// В этом месте необходимо вместо JPanel
// указать panel
private panel contentPane;
/**
* Launch the application.
*/
Далее, переходим в самый низ, где необходимо ещё в одном месте поменять JPanel на название класса panel. Теперь класс panelбудет являться панелью, вложенной в окно JFrame. На этой панели отрисовывается магический квадрат.
public prog() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
// В этом месте также заменяем JPanel на panel
contentPane = new panel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
}
Запустим приложение на исполнение. Появился магический квадрат,он начинает переливаться зелеными цветами с определенным интервалом времени.
Первое заметное неудобство: квадрат полностью не помещается в окно. Перейдём на закладку,где находится JFrame, далее –на закладку Design,внесём некоторые коррективы.
Прежде всего, выделяем панель окна. Щёлкаем левой клавишей мыши внутри панели. Внутренняя панель окна выделилась квадратиками и рамочкой,значит, именно панель сейчас является текущей выбранной.
В свойствах Layoutвыбираем Absolute layout, т. е.,разрешаем произвольное размещение элементов на панели. Это понадобится при формировании надписей, текстового поля и кнопки, которые будут присутствовать в окне.
Далее, увеличиваем окно по высоте, чтобы квадрат помещался в нём полностью, и вновь запускаем приложение на исполнение.
Теперь квадрат полностью помещается в окне. Что собой представляет этот квадрат (см. рис. 12.35)?
Рис. 12.35
Если присмотреться, у него есть центральная точка, являющаяся таковой для многих квадратных рамок, цвет каждой из них чуть-чуть отличается от цвета предыдущей. Центр всех этих рамок находится в одной центральной точке квадрата. Сдвиг между рамками квадрата– один пиксель.
Если перейти на закладку panelи немного поэкспериментировать с циклом,можно будет увидеть, как изменяется отображение этой области. Станет понятнее,как отрисовываются квадраты.
Теперь необходимо сформировать интерфейс –создать элементы окна, оформить его.
Щёлкаем на заголовок окна, таким образом, выбираем всю форму.Переходим в Cвойства, находим свойство под названиемtitle (заголовок).Записываем заголовок "Предсказание будущего"(см. рис. 12.36).
Рис. 12.36
Вверху появился заголовок: "Предсказание будущего" (см. рис.12.37).
Рис. 12.37
Теперь добавим надпись.Для этого необходимо выбрать из спискаJLabel(см. рис. 12.38).
Рис. 12.38
Находим в центральной части окна JLabel,добавляем его на форму и записываем(свойство text): "Посмотрите на магический квадрат…"(см.рис. 12.39).
Рис. 12.39
Поменяем шрифт надписи,для этого перейдём в палитру свойств и найдём свойство font (шрифт) (см. рис.12.40):
Рис. 12.40
Сделаем его размер побольше, например, 18, а также поменяем его цвет в свойстве foreground.Выберем, к примеру, синий. Нажмём Ok. Надпись увеличилась в размерах и стала синего цвета. Раздвинем надпись так, чтобы она полностью помещалась на экране. Первая надпись сформирована.
Добавляем еще одну надпись. Снова выбираем JLabel, помещаем элемент на форму и в для свойства textустанавливаем значение: "Вглядитесь в будущее…". Так же при помощи свойства font поменяем его размер,сделаем установим, например, 17. Поменяем цвет(свойство foreground)–установим красный. Изменим размеры надписи так, чтобы она полностью помещалась на экран.
На нашем игровом поле сейчас написано: "Посмотрите на магический квадрат… Вглядитесь в будущее…".
В этот момент пользователь должен посмотреть на квадрат и задуматься.
Теперь под квадратом добавим ещё одну надпись и поместим в ней текст: "Подумайте о том, что вы хотите….".
Точно также установим размер шрифта – 16,изменим цвет (может выбрать любой).
Вставим ещё одну,последнюю надпись. Выбираем JLabel, помещаем элемент на форму, вставляем текст: "… и нажмите,чтобы".Размер шрифта пусть будет 16, а цвет - любой, например, оранжевый.Если надписи получились слишком маленькие,можно их увеличить, установив размер,например, 20. Но изменяйте их размеры так, чтобы они полностью помещались на экране.
Еще нам понадобится кнопка, которую нужно нажать, чтобы узнать предсказание. Добавим ее на форму.
Выберем элемент JButton, поместим его на форму. В разделе Cвойства установим текст кнопки: "Узнать". Зададим размер шрифта 20, изменим цвет на темно-синий. Запустим приложение (см. рис. 41).
Рис. 12.41
При нажатии на кнопку,текстовое поле, которое мы добавим ниже,будет выводить предсказание.
Для создания поля выберем элемент JTextField- однострочное текстовое поле. Можно изменить шрифт на 20и поменять цвет текста на красный или любой другой.
Ещё раз запустим на исполнение (см. рис. 12.42).
Рис. 12.42
При нажатии на кнопку"Узнать"пока ничего не происходит, мы ещё не написали программный код. Создадим обработчик нажатия на эту кнопку, щелкнув по ней два раза левой кнопкой мыши. Мы попадём в программный код, где уже автоматически сформировался метод actionPerformed():
public void actionPerformed(ActionEvent arg0) {
}
Внутри этого метода необходимо сформировать запрос к базе данных, созданной в начале занятия. Оттуда случайным образом будет выбираться одна из строк. Вернёмся к нашей базе данных.
В единственной таблице базы находится 21строка, в каждой строке есть некоторая надпись. Необходимо сделать так,чтобы надпись выбиралась случайно. Для выбора случайного значения понадобитсяметод random()класса Math. Таким образом, мы сформируем случайное число от1до 21. Затем, когда число будет сформировано (допустим, это будет цифра 7),произойдёт запрос к базе данных. При помощи команды SELECTбудет выбрана строка из базы данных, и текст, находящийся в поле textбудет выведен в текстовое поле в нашем окне (см. рис. 12.43).
Рис. 12.43
Прежде, чем создавать этот запрос в программном коде приложения,давайте перейдем на закладку SQLи сформируем для начала этот запрос здесь. Допустим,случайное число оказалось 7, тогда записываем:
SELECT * FROM tabl WHERE (id=7);
Такой запрос к базе данных необходимо сформировать, чтобы получить то, что нужно (см.рис. 12.44).
Рис. 12.44
Выполняем запрос нажатием Go.Запрос срабатывает, и мы видим результат(см. рис. 12.45).
Рис. 12.45
Мы выбрали всего одну строку, необходимую для возможности вывести нужный текст в нашу форму.
Теперь такой запрос сформируем из нашего приложения. Для этого снова вернемся в среду разработки Eclipse.
Сначала добавим библиотеку, чтобы можно было работать с базой данных MySQL. Эту библиотеку мы использовали на предыдущем занятии. Выбираем проект lesson_24(см.рис. 12.46).
Рис. 12.46
Нажимаем правую клавишу, затем, в самом низу, Свойства(см. рис. 12.47).
Рис. 12.47
Выбираем слева путь компоновки Java(см. рис. 12.48).
Рис. 12.48
В появившемся окне выбираем закладку Библиотеки и нажимаем на кнопку Добавить внешниеJAR...(вторая кнопка сверху) (см. рис.12.49).
Рис. 12.49
На диске C:находитсяMySQL-коннектор, мы скачали его из Интернета и пользовались им на предыдущем занятии(см. рис. 12.50).
Рис. 12.50
Выбираем его, нажимаем на кнопку "Открыть", потом на кнопку "Ok". Теперь коннектор подключен к проекту, и им можно пользоваться. Воспользуемся алгоритмом,сформированным на предыдущем уроке.Перейдём к проекту lesson_23, откроем программу, написанную на предыдущем занятии (см. рис. 12.51).
Рис. 12.51
Сверху подключена библиотека Java.sql, чтобы можно было работать с базой данных MySQL(см. рис. 12.52).Основная часть программного кода – это и есть запрос к базе данных.
Рис. 12.52
Таким образом, чтобы заново не набирать программный код, а лишь подкорректировать его под нужную задачу,возьмём этот программный код и воспользуемся им, как алгоритмом.
// Подключаем библиотеку для работы с MySQL
import java.sql.*;
// Главный класс программы
public class prog {
// Метод запуска программы
public static void main(String[] args) {
// Переменная типа -Подключение
Connection connect;
// Конструкция попытка-исключение
try
{
// Переменная с именем драйвера для подключения
String driverName = "com.mysql.jdbc.Driver";
Class.forName(driverName);
// Имя сервера базы данных
String serverName = "localhost";
// Имя базы данных
String mybase = "base00";
// Строка подключения:указываются сервер и имя базы
// данных
String url_ = "jdbc:mysql://"+serverName+"/"+mybase;
// Имя пользователя базы данных
String username = "root";
// Пароль пользователя базы данных
String password = "";
// Установление подключения к базе данных
connect = DriverManager.getConnection(url_,username,password);
// Строка запроса SQL к базе данных
String query = "SELECT * FROM tab00";
// Создание запроса
Statement stmt = connect.createStatement();
// Выполнение запроса с получением результата
ResultSet rs = stmt.executeQuery(query);
String temp;
// Цикл для перебора записей (строк) результата запроса
while (rs.next())
{
// Получение значение поля (колонки) по имени
temp = rs.getString("imya");
// Вывод в консольное окно
System.out.println(temp);
}
// Закрытие подключения к базе данных
connect.close();
}
catch(Exception ex) {}
}
}
Это пример того, как созданный для решения какой-либо задачи фрагмент программного кода, сохраняется в файлах или просто выписывается, а потом,когда возникает похожая задача,используется снова. Не нужно снова тратить время на её решение.
Копируем строку import, переходим на закладку prog.java и вставляем ее в начало.