Например, возьмём поле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";
// Строка подключения:указываются сервер и имя базы данных
// Цикл для перебора записей (строк) результата запроса
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.