
- •Программирование на Java
- •Глава 1 Введение в java. Основы языка.
- •Тема 1.1 Язык программирования java.
- •Тема 1.2 Состав пакета Java2.
- •Тема 1.3 Настройка среды окружения.
- •Тема 1.4 Структура Java-программы.
- •Тема 1.5 Набор текста, запуск и компиляция простейшей программы.
- •Тема 1.6 Подробное рассмотрение кода простейшей программы.
- •Тема 1.7. Создание программы в разных средах разработки.
- •Тема 1.8 Лексические основы языка
- •Тема 1.9 Элементарные типы данных.
- •Тема 1.10 Преобразование типов.
- •Арифметические операции
- •Операции сравнения
- •Тема 1.11 Кoнсольный ввод с помощью класса java.Util.Scanner
- •Тема 1.12 Классы-оболочки
- •Тема 1.13 Автоупакока и автораспаковка.
- •Тема 1.14 Операторы
- •1.14.1 Блок
- •1.14.2 Условный оператор if
- •1.14.4 Оператор цикла while
- •1.14.5 Оператор цикла do-while
- •1.14.6 Оператор цикла for
- •1.14.7 Оператор continue и метки
- •1.14.8 Оператор break
- •1.14.9 Оператор варианта switch
- •Тема 1.15 Статический импорт
- •Тема 1.16 Класс Math
- •Задания
- •Тема 1.17 Псевдослучайные числа
- •Тема 1.18 Генерация случайных чисел
- •Тема 1.19 Массивы в Java
- •1.19.1 Объявление и заполнение массива
- •1.19.2 Сортировка массива
- •Сортировка выбором
- •Сортировка методом пузырька
- •1.19.3 Многомерные массивы
- •Задания
- •1.19.4 Нерегулярные массивы
- •Глава 2 классы
- •Тема 2.1 Основы классов
- •Тема 2.2 Общая форма класса
- •Тема 2.3 Объявление объектов
- •Тема 2.4 Более подробное рассмотрение операции new
- •Тема 2.5 Присваивание переменных объектных ссылок
- •Тема 2.6 Знакомство с методами
- •Тема 2.7 Возвращение значения из метода
- •Тема 2.8 Добавление метода, принимающего параметры
- •Тема 2.9 Конструкторы
- •Тема 2.10 Сборка мусора
- •Тема 2.11 Перегрузка методов
- •Тема 2.12 Перегрузка конструкторов
- •Тема 2.13 Использование объектов в качестве параметров
- •Тема 2.14 Более пристальный взгляд на передачу аргументов
- •Тема 2.16 Рекурсия
- •Тема 2.17 Введение в управление доступом
- •Тема 2.18 Ключевое слово static
- •Тема 2.19 Ключевое слово final
- •Тема 2.20 Аргументы переменной длины
- •Тема 2.21 Строки и числа
- •Тема 2.22 Нумерованные типы
- •Глава 3 наследование и интерфейсы
- •Тема 3.1 Основы наследования
- •Тема 3.2 Наследование и доступ к членам класса
- •Тема 3.3 Конструкторы и наследование
- •Тема 3.4 Использование ключевого слова super для вызова конструктора суперкласса
- •Тема 3.5 Использование ключевого слова super для доступа к членам суперкласса
- •Тема 3.6 Многоуровневая иерархия
- •Тема 3.7 Когда вызываются конструкторы
- •Тема 3.8 Объекты подклассов и ссылки на суперклассы
- •Тема 3.9 Переопределение методов
- •Тема 3.10 Переопределение методов и поддержка полиморфизма
- •Тема 3.11 Использование абстрактных классов
- •Тема 3.12 Использование ключевого слова final
- •Тема 3.13 Предотвращение переопределения методов
- •Тема 3.14 Предотвращение наследования
- •Тема 3.15 Класс Object
- •Тема 3.16 Интерфейсы
- •3.16.1 Объявление интерфейса.
- •3.16.2 Реализация интерфейсов
- •3.16.3 Использование ссылок на интерфейсы
- •3.16.4 Переменные в составе интерфейсов
- •3.16.5 Наследование интерфейсов
- •Тема 3.17 Пакеты и ограничение доступа
- •Тема 3.18 Внутренние классы
- •3.18.1 Внутренние (inner) классы
- •3.18.2 Вложенные (nested) классы
- •3.18.3 Анонимные (anonymous) классы
- •Глава 4 Обработка исключительных ситуаций
- •Тема 4.1 Исключения в Java
- •Тема 4.2 Типы исключений
- •Тема 4.3 Неперехваченные исключения
- •Тема 4.4 Ключевые слова try и catch
- •Тема 4.6 Ключевое слово throw
- •Тема 4.7 Ключевое слово throws
- •Тема 4.8 Ключевое слово finally
- •Ошибка при выполнении метода1 java.Lang.ArithmeticException: Demo
- •Тема 4.9 Потомки Exception или написание своих классов ошибок
- •Глава 5 Универсальные типы. КоллекциИ
- •Тема 5.1 Общие сведения об универсальных типах
- •Тема 5.2 Универсальный класс с двумя параметрами типа
- •Тема 5.3 Ограниченные типы
- •Тема 5.4 Использование групповых параметров
- •Тема 5.5 Универсальные методы
- •Тема 5.6 Универсальные интерфейсы
- •Тема 5.7 Ошибки неоднозначности
- •Тема 5.8 Ограничения универсальных типов
- •Тема 5.9 Краткий обзор коллекций
- •5.9.1 Класс ArrayList
- •5.9.2 Класс LinkedList
- •5.9.3 Класс HashSet
- •5.9.4 Класс TreeSet
- •5.9.5 Доступ к коллекции через итератор
- •5.9.6 Алгоритмы коллекций
- •Глава 6 jdbc (Java DataBase Connectivity) Тема 6.1 Драйверы, соединения и запросы
- •Тема 6.2 Простое соединение и простой запрос
- •Тема 6.2 Класс ResultSet
- •Тема 6.3 Метаданные
- •Тема 6.4 Подготовленные запросы
- •Глава 7 Swing и пользовательский интерфейс
- •Тема 7.1 Общие сведения о swing
- •Тема 7.2 Архитектура mvc
- •Тема 7.3 Контейнер и компоненты
- •Тема 7.4 Простая программа, использующая средства Swing
- •Тема 7.5 Поддержка событий
- •Тема 7.6 Использование кнопок и обработка событий
- •Тема 7.7 Краткие сведения о диспетчерах компоновки
- •Тема 7.8 Пример использования jdbc и swing вместе
Тема 6.4 Подготовленные запросы
Для представления запросов существуют еще объекты PreparedStatement. Объекты этого класса используются при выполнении часто повторяющихся запросов SQL. Такой оператор предварительно готовится и хранится в объекте, что ускоряет обмен информацией с базой данных.
Одно из важных свойств метода prepareStatement – возможность обработки входных параметров. Они помечаются в операторе SQL символом "?" на месте фактического значения. В программе Java проводится соответствие между параметрами и методами setXXXX() – setInt, setFloat, setString и т.д., в соответствии с типами входных параметров. Все методы setXXXX() принимают в качестве параметров значение параметра и указатель parameterIndex, который равен 1 для первого "?", 2 – для второго и т.д. Выполнение sql-оператора обеспечивается методами объекта PreparedStatement:
executeQuery() – для выполнения запроса выборки SELECT ;
executeUpdate() – для выполнения запроса модификации данных INSERT, UPDATE или DELETE.
Объект PreparedStatement обеспечивает более быстрое выполнение оператора SQL. Оценить преимущества во времени можно, выполнив большое число повторяемых запросов с предварительной подготовкой запроса и без нее.
PreparedStatement ps = null;
String sql = "INSERT INTO user (id, name) VALUES(?,?)";
//компиляция (подготовка) запроса
ps = (PreparedStatement) cn.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2, name);
//выполнение подготовленного запроса
ps.executeUpdate();
В таблице каждая строка содержит данные об одном объекте и, прежде чем создавать таблицу, удобно создать класс-сущность, имя которого будет совпадать с названием таблицы, а поля – с названиями столбцов.
В листинге 6.5 приведен пример использования подготовленного запроса и класса сущности.
Листинг 6.5
public class User {
private int id;
private String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return super.toString(); //To change body of generated methods, choose Tools | Templates.
}
}
import java.sql.*;
public class DB {
private Connection cn;
private Statement st;
private ResultSet rs;
public DB(String path, String nameDB, String login, String pass) {
try {
Class.forName("com.mysql.jdbc.Driver");
try {
cn = DriverManager.getConnection(path + nameDB, login, pass);
try {
st = cn.createStatement();
} catch (SQLException ex) {
System.out.println("Error in Statement " + ex);
}
} catch (SQLException ex) {
System.out.println("Error in create Connection " + ex);
}
} catch (ClassNotFoundException ex) {
System.out.println("Error in download Driver " + ex);
}
}
public void update(String sql) {
try {
st.executeUpdate(sql);
} catch (SQLException ex) {
System.out.println("Error in update " + ex);
}
}
public ResultSet query(String sql) {
try {
rs = st.executeQuery(sql);
} catch (SQLException ex) {
System.out.println("Error in query " + ex);
}
return rs;
}
public void close() {
try {
st.close();
cn.close();
} catch (SQLException ex) {
System.out.println("Error in close " + ex);
}
}
public void showDatabaseMetaData() {
try {
//получаем метаданные
DatabaseMetaData dbmd = cn.getMetaData();
//выводим информацию про БД
System.out.println(dbmd.getDatabaseProductName());
System.out.println(dbmd.getDatabaseProductVersion());
System.out.println(dbmd.getDriverName());
System.out.println(dbmd.getDriverVersion());
} catch (SQLException ex) {
System.out.println("Error in showDatabaseMetaData " + ex);
}
}
public void showResultSet(ResultSet rs) {
try {
//получаем метаданные
ResultSetMetaData rsmd = rs.getMetaData();
//выводим названия столбцов
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.print(rsmd.getColumnName(i) + "\t");
}
// выводим строки
while (rs.next()) {
System.out.println();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.print(rs.getString(i) + "\t");
}
}
System.out.println();
} catch (SQLException ex) {
System.out.println("Error in showResultSet " + ex);
}
}
public void addUser(User user) {
try {
PreparedStatement ps = null;
String sql = "INSERT INTO " + user.getClass().getSimpleName() + " (id, name) VALUES(?,?)";
//компиляция (подготовка) запроса
ps = (PreparedStatement) cn.prepareStatement(sql);
ps.setInt(1, user.getId());
ps.setString(2, user.getName());
//выполнение подготовленного запроса
ps.executeUpdate();
} catch (SQLException ex) {
System.out.println("Error in addUser " + ex);
}
}
public void changeNameUser(User user) {
try {
PreparedStatement ps = null;
String sql = "UPDATE " + user.getClass().getSimpleName() + " SET name=? WHERE id=" + user.getId();
ps = (PreparedStatement) cn.prepareStatement(sql);
ps.setString(1, user.getName());
ps.executeUpdate();
} catch (SQLException ex) {
System.out.println("Error in changeNameUser " + ex);
}
}
public void deleteUser(User user) {
String sql = "DELETE FROM " + user.getClass().getSimpleName() + " WHERE id=" + user.getId();
update(sql);
}
}
public class Main {
public static void main(String[] args) {
DB db = new DB("jdbc:mysql://localhost/", "my_db", "root", "");
System.out.println("Вывод текущего состояния таблицы");
db.showResultSet(db.query("SELECT * FROM user"));
db.addUser(new User(4, "user4"));
db.addUser(new User(5, "user5"));
db.addUser(new User(6, "user6"));
System.out.println("Вывод таблицы после добавления нескольких объектов");
db.showResultSet(db.query("SELECT * FROM user"));
db.changeNameUser(new User(6, "new_user6"));
User mas[] = {new User(7, "user7"), new User(8, "user8"), new User(9, "user9")};
for (int i = 0; i < mas.length; i++) {
db.addUser(mas[i]);
}
System.out.println("Вывод таблицы после добавления массива объектов");
db.showResultSet(db.query("SELECT * FROM user"));
for (int i = 0; i < mas.length; i++) {
db.deleteUser(mas[i]);
}
System.out.println("Вывод таблицы после удаления массива объектов");
db.showResultSet(db.query("SELECT * FROM user"));
db.close();
}
}
В результате выполнения данной программы получим:
Вывод текущего состояния таблицы
id name
1 user1
2 user2
3 user3
Вывод таблицы после добавления нескольких объектов
id name
1 user1
2 user2
3 user3
4 user4
5 user5
6 user6
Вывод таблицы после добавления массива объектов
id name
1 user1
2 user2
3 user3
4 user4
5 user5
6 new_user6
7 user7
8 user8
9 user9
Вывод таблицы после удаления массива объектов
id name
1 user1
2 user2
3 user3
4 user4
5 user5
6 new_user6
Выводы к главе:
JDBC (Java DataBase Connectivity) – стандартный прикладной интерфейс (API) языка Java для организации взаимодействия между приложением и СУБД.
При работе с базой данных необходимо:
1). Загрузить драйвер в память
2). Создать соединение с базой данных
3). Создать объект для передачи запросов
4). Отправить запрос в базу данных
5). Обработать результат работы запроса
6). Закрыть соединение с базой данных
ResultSet представляет результирующий набор базы данных. Он обеспечивает приложению построчный доступ к результатам запросов в базе данных.
Метаданные позволяют получить различные данные про базу данных и про выборку.
Объект PreparedStatement обеспечивает более быстрое выполнение оператора SQL и имеет возможность обработки входных параметров. Используется для часто передаваемых запросов.
Прежде чем создавать таблицу, удобно создать класс-сущность, имя которого будет совпадать с названием таблицы, а поля – с названиями столбцов.
Задания к главе:
1). Производство
Минимальный список характеристик:
Код изделия, название изделия, является ли типовым, примечание - для каких целей предназначено, годовой объем выпуска;
код, название, адрес и телефон предприятий, выпускающих изделия;
название, тип, единица измерения материала, цена за единицу, отметка об использовании материала в данном изделии;
количество материала в спецификации изделия, дата установления спецификации, дата отмены;
год выпуска и объем выпуска данного изделия предприятием.
Одно изделие может содержать много типов материалов и один и тот же материал может входить в состав разных изделий.
Выборки:
Определить изделие, в которое входит больше всего материалов типа 'цветной металл'.
Вывести список изделий, которые не производились в 2000 г.
Вывести список изделий, для которых затраты на материалы в 2000 г. снизились по сравнению с предыдущим годом.
Вывести среднемесячный расход материала 'лапша' в 2000 г.
2). Сеть магазинов
Минимальный список характеристик:
Номер, ФИО, адрес, телефон владельца магазина, размер вклада в магазин, номер регистрации;
номер, название, адрес и телефон магазина, уставной капитал, профиль;
номер, ФИО, адрес, телефон поставщика, а также стоимость поставки данного поставщика в данный магазин.
Один и тот же магазин может иметь несколько владельцев и один и тот же владелец может иметь в собственности много магазинов.
Примечание: профиль - продуктовый, галантерейный, канцелярский и т.п.
Выборки:
Определить самого молодого предпринимателя, владеющего собственностью в районе 'Киевский'.
Определить случаи, когда регистрировалось владение лицами, не достигшими 18 лет.
Определить случаи, когда больше 50% уставного капитала магазина внесено предпринимателем, проживающим в другом районе.
Вывести список профилей магазинов, которыми владеет предприниматель 'Кузнецов' в порядке убывания вложенного в них капитала.
3). Телефонная станция
Минимальный список характеристик:
Номер абонента, фамилия абонента, адрес, наличие блокиратора, примечание;
Код АТС, код района, количество номеров;
Номер спаренного телефона абонента, задолженность.
Один спаренный номер одной АТС может использоваться несколькими абонентами и один и тот же абонент может использовать телефоны разных АТС.
Выборки:
Выбрать пары сблокированных телефонов.
Определить АТС, районы действия которых перекрываются.
Выбрать телефоны группового пользования, Вывести их номера и фамилии абонентов.
Выбрать список абонентов АТС 47, имеющих задолженность больше 100 руб.
4). Городской транспорт
Минимальный список характеристик:
Вид транспорта, средняя скорость движения, количество машин в парке, стоимость проезда;
номер маршрута, количество остановок в пути, количество машин на маршруте, количество пассажиров в день;
начальный пункт пути, конечный пункт, расстояние.
Один и тот же вид транспорта может на разных маршрутах использовать разные пути следования.
Выборки:
Определить оптимальный по времени маршрут между пунктами 'Холодная Гора' и 'Парк '.
Определить среднее время ожидания на остановке троллейбуса №39.
Вывести маршруты трамваев в порядке убывания их протяженности.
Вывести список ежедневных денежных поступлений для всех видов транспорта.
5). Шахматы
Минимальный список характеристик:
Фамилия спортсмена, дата рождения, страна, спортивный разряд, участвовал ли в борьбе за звание чемпиона мира, рейтинг, примечание
Турнир, страна, город, дата проведения, уровень турнира;
Стартовый номер спортсмена в данном турнире, занятое место.
Один шахматист может участвовать в разных турнирах.
Выборки:
Выбрать турнир с самым высоким рейтингом участников.
Выбрать те турниры, где все призовые места заняли представители страны-хозяина турнира.
Определить турниры, в которых участник с самым высоким рейтингом занял последнее место.