Вы находитесь на странице: 1из 58

Быстрый старт в Java

Конспект по видеоурокам тренинга


Оглавление
Введение в Java.............................................................................................................................................................. 6
Основные понятия ..................................................................................................................................................... 6
Объекты в памяти ...................................................................................................................................................... 6
Класс и объект ............................................................................................................................................................ 7
Инициализация объекта ............................................................................................................................................ 8
Типы переменных ...................................................................................................................................................... 8
Почему String – ссылочный тип ................................................................................................................................. 8
Значение NULL............................................................................................................................................................ 8
Компиляция ............................................................................................................................................................... 8
Метод ......................................................................................................................................................................... 9
Модификаторы доступа............................................................................................................................................. 9
Схема создания класса .............................................................................................................................................. 9
Объектно-ориентированное программирование (ООП) ............................................................................................ 10
Введение .................................................................................................................................................................. 10
Гетеры и сетеры ....................................................................................................................................................... 10
Инкапсуляция ........................................................................................................................................................... 11
Для чего нужно ........................................................................................................................................................ 11
Правильно построенный класс ................................................................................................................................ 12
Конструктор ................................................................................................................................................................. 12
Вызов конструктора для создания объекта............................................................................................................. 12
Передача параметров в конструктор ...................................................................................................................... 13
Наследование .............................................................................................................................................................. 13
Использование ......................................................................................................................................................... 14
Модификаторы доступа при наследовании............................................................................................................ 14
Принцип наследование объектов ........................................................................................................................... 14
@Override и super .................................................................................................................................................... 15
Разрешенные варианты наследования ................................................................................................................... 15
Запрещенные варианты наследования................................................................................................................... 15
Полиморфизм .............................................................................................................................................................. 16
Приведение.............................................................................................................................................................. 16
Нисходящее приведение ......................................................................................................................................... 17
Абстрактные классы и интерфейсы ............................................................................................................................. 17
Интерфейс ................................................................................................................................................................ 18
Отличия абстрактного класса от интерфейса .......................................................................................................... 18
Особенности............................................................................................................................................................. 19
Ключевое слово static .................................................................................................................................................. 19

http://javabegin.ru 2
Композиция ................................................................................................................................................................. 20
Перегрузка метода ...................................................................................................................................................... 20
Передача параметров в метод .................................................................................................................................... 20
JavaDocs........................................................................................................................................................................ 21
Правила написания кода на Java ................................................................................................................................. 21
Графический интерфейс в Java .................................................................................................................................... 22
JavaBeans .................................................................................................................................................................. 23
Правила написания JavaBeans ................................................................................................................................. 23
Правила написания графических компонентов ...................................................................................................... 23
Контейнеры .............................................................................................................................................................. 23
Менеджеры размещения ........................................................................................................................................ 24
Flow Layout ............................................................................................................................................................... 24
Border Layout ............................................................................................................................................................ 25
Box Layout ................................................................................................................................................................. 25
Grid Layout ................................................................................................................................................................ 26
Абсолютная позиция................................................................................................................................................ 26
Рекомендации от Oracle .......................................................................................................................................... 27
Использование вложенных менеджеров................................................................................................................ 27
События компонентов ................................................................................................................................................. 28
Реализация слушателей ........................................................................................................................................... 28
Анонимный класс ..................................................................................................................................................... 28
Классы-адаптеры слушателей ................................................................................................................................. 29
JAR файл ....................................................................................................................................................................... 29
Файл MANIFEST.MF .................................................................................................................................................. 29
JAVA WEB START ....................................................................................................................................................... 29
Java - апплеты............................................................................................................................................................... 29
Методы Java – апплета ............................................................................................................................................ 30
Примеры Java - апплетов ......................................................................................................................................... 30
Дизайнер форм NetBeans ............................................................................................................................................ 30
Массивы ....................................................................................................................................................................... 31
Значения по умолчанию .......................................................................................................................................... 31
Хранение в памяти ................................................................................................................................................... 31
Типы данных ............................................................................................................................................................ 31
Ограничения ............................................................................................................................................................ 31
Двумерные массивы ................................................................................................................................................ 31
Доступ к элементам двумерного массива .............................................................................................................. 32
Коллекции .................................................................................................................................................................... 32

http://javabegin.ru 3
Типы коллекций ....................................................................................................................................................... 33
ArrayList .................................................................................................................................................................... 33
Типизированные коллекции .................................................................................................................................... 33
Файлы ........................................................................................................................................................................... 34
Структура классов записи данных ........................................................................................................................... 35
Структура классов чтения данных ........................................................................................................................... 35
Буферизация ............................................................................................................................................................ 36
Входящие и исходящие потоки ............................................................................................................................... 36
Чтение с консоли...................................................................................................................................................... 37
Работа с файловой системой ................................................................................................................................... 37
Исключения.................................................................................................................................................................. 37
Cтруктура классов .................................................................................................................................................... 37
Обработка ................................................................................................................................................................ 38
«Пробрасывание» исключения ............................................................................................................................... 39
Информация об ошибке .......................................................................................................................................... 39
Базы данных................................................................................................................................................................. 40
Типы ......................................................................................................................................................................... 40
Реляционная база данных ....................................................................................................................................... 40
Таблица .................................................................................................................................................................... 42
Первичный ключ ...................................................................................................................................................... 43
Внешний ключ .......................................................................................................................................................... 43
Индекс ...................................................................................................................................................................... 44
Советы ...................................................................................................................................................................... 44
База данных SQLite................................................................................................................................................... 44
Основы проектирования таблиц ............................................................................................................................. 45
Важный моменты и понятия .................................................................................................................................... 46
Отношение: один к одному (1:1) ............................................................................................................................. 46
Отношение: один ко многим (1:N) .......................................................................................................................... 47
Отношение: много ко многим (M:N) ....................................................................................................................... 48
Нормальные формы ................................................................................................................................................ 48
Основы SQL .................................................................................................................................................................. 48
Select (выборка) ....................................................................................................................................................... 49
Примеры без условий .............................................................................................................................................. 49
Выборка уникальных значений столбца ................................................................................................................. 50
Примеры с условиями ............................................................................................................................................. 50
Сортировка результата ............................................................................................................................................ 51
Граница выборки ..................................................................................................................................................... 51

http://javabegin.ru 4
Агрегатные функции ................................................................................................................................................ 52
Группировка ............................................................................................................................................................. 52
Основные моменты ................................................................................................................................................. 53
JOIN............................................................................................................................................................................... 53
Подзапросы.................................................................................................................................................................. 54
Подзапросы в условии WHERE ................................................................................................................................ 54
Перечисление таблиц .............................................................................................................................................. 55
JDBC .............................................................................................................................................................................. 55
Преимущества и недостатки.................................................................................................................................... 56
2-х звенная архитектура........................................................................................................................................... 57
3-х и многозвенная архитектура .............................................................................................................................. 57
Подключение к SQLite через JDBC ........................................................................................................................... 58
JTable ............................................................................................................................................................................ 58

http://javabegin.ru 5
Введение в Java

Редакции Java

1. Java Standard Edition (J2SE) - для настольных приложений, стандартный набор классов

2. Java Micro Edition (J2ME) – для мобильных устройств, дополнительный набор классов

3. Java Enterprise Edition (J2EE) - для распределенных корпоративных приложений, дополнительные наборы
классов

* Не нужно быстро переходить от J2SE к J2EE или J2ME. Сначала необходимо уверенно освоить J2SE

Основные понятия
• Виртуальная машина Java (JVM) – среда, для запуска java программ и их управления. Обеспечивает
кроссплатформенность.

• Кроссплатформенность – «написано однажды, запускается везде», запуск программы в любой


операционной системе

• Сборщик мусора (Garbage Collector) – служебная программа в JVM для освобождения памяти, удаления
ненужных объектов (на которых нет ссылок в программе)

• Компиляция – преобразование java кода (текст) в байт-коды (двоичные данные) для запуска в JVM.
Компиляцию можно делать вручную или в среде разработки (для начинающих желательно в среде)

• JDK и JRE – набор инструментов + JVM. JDK – для запуска и создания java программ, JRE – только для
запуска (урезанная версия JDK без инструментов разработки и компиляции)

• Версию JDK или JRE для установки нужно выбирать в зависимости от операционной системы и
разрядности (32/64 бит)

Объекты в памяти
• Созданный объект занимает определенное место в оперативной памяти

Объект Объект Объект Свободная


«Машина» «Человек» «Дом» память
»

Ячейки оперативной памяти

* Запись объектов в память происходит при выполнении программы, а не при


написании кода.

http://javabegin.ru 6
• Во многих языках программирования может возникнуть проблема: запись объекта уже в занятую область
памяти, где находится другой объект – это может привести к краху программы

• Можно заполнить объектами всю свободную память (если не удалять ненужные) – тогда произойдет
«утечка памяти»

• В C++ есть прямой доступ к памяти, в Java – нет

• Виртуальная машина Java самостоятельно управляет объектами в памяти

• Сборщик мусора избавляет программиста Java от проблем управления памятью вручную. Он удаляет
старые объекты, на которых уже нет ссылок в программе

• Периодичность работы сборщика мусора – неизвестна

Класс и объект
• Класс – шаблон(трафарет) для создания объектов во время работы программы.

• Объекты создаются во время работы программы

• Классы создаются во время написания кода

• Количество объектов - бесконечное число, насколько хватит оперативной памяти

• Для создания объекта – ключевое слово new

Программный код Выполнение программы

Объект Computer1

Класс Computer
Объект Computer2

Объект Computer3

http://javabegin.ru 7
Инициализация объекта
Computer comp = new Computer();

1. Создалась переменная comp типа Computer

2. В памяти создался объект Computer

3. Присвоили переменной comp созданный объект.

4. После этого переменная comp ссылается на созданный объект Computer

Типы переменных
1. Примитивные

1) boolean
2) byte
3) char
4) short
5) int
6) long
7) float
8) double
9) Ссылочные (от слова ссылка) - String, Computer и пр. объекты.

В нашем примере:

Computer comp = new Computer();

comp – ссылочная переменная, т.к. содержит ссылку на объект

Почему String – ссылочный тип


1. При создании переменной типа String всегда создается объект в памяти

2. String str = “abc”;

Создается объект типа String со значением “abc”, ссылка на объект находится в переменной str

Значение NULL
• Используется для ссылочных переменных

• Если переменная имеет значение NULL – она не имеет указатель на какой-либо объект

Компиляция
• Преобразование исходного кода (файл *.java) в байт-коды (файл *.class) для запуска программы
виртуальной машиной

http://javabegin.ru 8
Исходный программный компиляция Байт код (двоичный код,
код (файлы *.java) файлы *.class)

Запуск программы Виртуальная машина Java

Метод
• Именованный участок кода, который выполняет определенный функционал.

• Может возвращать значение, а может ничего не возвращать.

• Имеет имя и список параметров

Модификаторы доступа
• Применяется к переменным, методам, классам.

• 4 модификатора:

• public – доступ c любого места - чаще всего используется для внешнего интерфейса

• protected – внутри пакета и в дочерних классах - чаще всего используется при наследовании

• default/package-private (без указания) – доступ внутри пакета – нежелательно использовать, часто


происходит путаница при рефакторинге

• private – доступно только внутри класса – для скрытия реализации (инкапсуляции)

* Список модификаторов дан в порядке уменьшения области видимости (сверху-вниз)

Схема создания класса


1. Объявление пакета класса (package)

2. Подключение необходимых библиотек (import)

3. Создание public класса, имя которого совпадает с именем файла

4. Создание тела класса с методами и переменными

http://javabegin.ru 9
Объектно-ориентированное программирование (ООП)

Введение
 ООП – основа основ
 Не беритесь за дальнейшее изучение Java, пока не освоите принципы ООП
 На принципах ООП основана вся разработка на языке Java
 Отличия ООП от других парадигм
 Упрощение написания программ
 Оперирование объектами реального мира
 Возможность быстрого расширения программного кода
 Наличие типовых шаблонов проектирования
 Состав объекта
 Характеристика (свойства, переменные класса)
 Поведение (действия, методы)

• Даже если программа простейшая – всегда нужно создавать объекты и писать код в ООП стиле!

• Это должно быть привычкой

• В программе не должно быть лишних объектов

• Никогда не давайте объекту чужие понятия и действия

Гетеры и сетеры
Использование модификатора доступа public для переменных класса – нежелательно:

• нарушается безопасность объекта

• любой может напрямую изменить свойства объекта

• от состояния объекта (значений переменных класса) зависит правильная работа объекта

• задача программиста – обеспечить безопасность изменения состояния объекта (безопасность изменения


переменных класса)

• get и set - получить и передать

• в коде представляют собой обычные методы с префиксом get или set (getName, setName)

Безопасный доступ:

• Запись значения

• Получение значения

• нужно учитывать как можно больше факторов, которые могут «поломать» объект

http://javabegin.ru 10
Инкапсуляция

Часть, которая видна


другому
программисту
Класс (объект)

Скрытая внутренняя метод 1


реализация

интерфейс
метод 1 метод 2

метод 2 метод 3 Программист,


… использующий
ваш класс
метод N метод 4

Описание класса

Для работы с объектом доступна только видимая часть (интерфейс)

Пример инкапсуляции из жизни

Пульт управления телевизором: скрытая реализация – схемы, провода, наружный интерфейс - кнопки

Для чего нужно


• Программист не может вмешаться во внутренние процессы работы класса, т.к. ему видны только
внешние методы интерфейса

• Класс работает именно так, как вы задумали

• Упрощение взаимодействия с этим классом другому программисту (или вам самим при доработке)

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

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

Необходимо сделать элементы класса максимально недоступными:

• Скрывать открытые поля (переменные класса) . В отдельных случаях это оправдано, но в основном нет
(например константы)

http://javabegin.ru 11
• Для доступа к переменным использовать гетеры и сетеры

• Все методы (внутренние и в особенности внешние) должны иметь понятные названия. Чтобы по
названию можно было определить назначение этого метода.

Правильно построенный класс


• программисту приятно и легко с ним работать

• у класса нет лишних видимых методов и переменных

• все методы названы понятно и отражают в названии свою суть

• класс правильно отрабатывает свой функционал

Конструктор
• Главная цель - создание экземпляра класса с начальным состоянием (значениями переменных)

• Не путать с методом (у них разный смысл и назначение)

• В классе может быть несколько конструкторов (в зависимости от кол-ва переменных класса)

• Нельзя создавать два конструктора с одинаковым порядком типов переменных

• Нужно следить, чтобы не было избыточных конструкторов (например, те же параметры, но в другом


порядке)

• Если не указано ни одного конструктора – компилятор создает конструктор по-умолчанию без


параметров

• Если вручную создан хотя бы один конструктор – конструктор по-умолчанию не создается

• Следует различать конструктор по-умолчанию (от компилятора), и конструктор без параметров (от
программиста)

Вызов конструктора для создания объекта

Класс (объект)

Конструктор 1
Инициализация
конструкторы
Доступные

(создание) Конструктор 2
объекта с Вызывающая
определенным сторона
Конструктор 3
начальным
состоянием
Конструктор 4

http://javabegin.ru 12
Передача параметров в конструктор
• Конструктор и метод внешне похожи

• Конструктор имеет имя как у класса

• В конструкторе не должно быть лишней логики

• Из конструктора можно вызывать методы класса

• Конструктор имеет модификатор доступа

• При создании объекта используется только один конструктор (который внутри объекта может вызывать
другой конструктор)

Класс Computer Вызов


конструктора и
Поля класса Конструктор передача
значений
Параметр 1
public String name;
(name)
public int ram; Параметр 2 Вызывающая
(ram) сторона
public int hdd;
Параметр 3
(hdd)
Параметр 4
Создание объекта (weight)
Computer

Наследование
• Повторное использование кода

• Расширение родительского класса

• Дочерний класс будет уметь все, что умел родительский, плюс добавляет что-то свое

• Все объекты наследуются от Object, даже если не указан extends Object

• Родительские класс не наследует элементы дочернего класса!

• В дочерних классах при наследовании можно расширять модификатор доступа, но нельзя сужать.

• Нет множественного наследования как в C++

http://javabegin.ru 13
Использование
• Когда есть общее поведение для каких либо объектов - нужно выносить их в родительский класс

• Нужно уметь правильно наследоваться, т.е. уметь выделять общие классы.

• Наследование избавляет вашу программу от избыточности

• Если нужно изменить общее поведение - то наследование автоматически передаст это изменения для
всех дочерних классов

• Дочерний класс наследует доступные методы и переменные от родительского класса и может


прибавлять свои собственные методы и переменные.

• Наследоваться могут методы и переменные

• При создании дочернего объекта по цепочке вызываются все конструкторы родительских классов
(начинаю с самого верхнего)

• Если в дочернем классе нет явного вызова родительского конструктора через super – компилятор
вызывает конструктор без параметров

• Для запрета наследования используется final

Модификаторы доступа при наследовании


Дочерний класс видит:

• Открытые методы и переменные, указанные с модификатором доступа public.

• Защищенные (protected) методы и переменные.

• Методы и переменные, защищенные на уровне пакета (то есть те, где не указан модификатор доступа),
если суперкласс находится в том же пакете, что и дочерний – нежелательно так делать

Принцип наследование объектов


• Наследование происходит по принципу «от общего к частному»

• Отношение объектов – «является». Например машина является транспортом (машина расширяет


транспорт)

Транспорт …

Машина Мотоцикл

Toyota BMW Suzuki …

Camry RAV4 X5 X6 … …

http://javabegin.ru 14
@Override и super
• Аннотации – дополнительные служебные данные, которые используются в процессе анализа кода
компилятором для указания каких-либо инструкций.

• Если используется слово super - компилятор сразу будет искать этот метод в родительском классе, минуя
текущий

• Можно и не указывать слово super, тогда компилятор будет искать его в текущем классе, а затем в
родительском.

• Желательно всегда строго указывать super и @Override если они необходимы, таким образом
вероятность ошибки меньше

Разрешенные варианты наследования


Для каждого объекта - один родитель

Computer

Notebook

Acer HP Dell

Запрещенные варианты наследования


Несколько родителей для одного объекта

Computer Notebook

Acer

http://javabegin.ru 15
Полиморфизм
• Одно поведение – разная реализация

• Пример - метод «говорить»: смысл один, но русский выполняет на русском, китаец – на китайском

• Сокращение программного кода. Например, не нужно для каждого типа объекта создавать отдельный
метод (connectDevice из примера – работает со всеми ноутбуками и компьютерами)

Приведение

восходящее
Computer

Notebook

Toshiba Asus

Model Toshiba 1 Model Toshiba 2 Model Asus 1 Model Asus 2

При неправильном приведении типов выходит


ошибка ClassCastException нисходящее

Восходящее приведение

метод charge становится недоступным

Часть, доступная
типу Computer

Notebook Notebook
Приведение к типу Computer

charge(); charge();

http://javabegin.ru 16
• Чаще всего восходящее приведение выполняется автоматически
• Нет смысла делать его вручную

Нисходящее приведение

метод c charge становится доступным

Часть, доступная
объекту Computer
((Notebook)comp).on();
((Notebook)comp).charge();

Notebook Notebook

Приведение к типу Notebook

charge(); charge();

• Объект по ссылке должен быть по факту Notebook

• С самим объектом при приведении ничего не происходит, меняется область видимости возможностей
объекта из переменной (накладывается калька типа объекта, к которому выполняется приведение)

• Для определения фактического объекта в ссылке – нужно использовать оператор instanceof

Абстрактные классы и интерфейсы

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


для всех. Все модели имеют общее понятие – ноутбук

• Машина – все машины умеют ездить, сигналить, поворачивать и пр., но каждая модель делает это по
своему. У всех машин общая модель поведения

http://javabegin.ru 17
Notebook

Toshiba Asus
Абстракция

Реализация

ToshibaModel1 Toshiba Model2 AsusModel1 AsusModel2

• Абстрактный класс нужен для того, чтобы задать модель поведения для всех дочерних объектов.

• Нельзя создать экземпляр абстрактного класса (через new), потому что он ничего не умеет, это просто
шаблон поведения для дочерних классов

• Если в классе есть хотя бы один абстрактный метод – весь класс будет абстрактным

• Любой дочерний класс должен реализовать все абстрактные методы родительского, либо он сам должен
быть абстрактным

• Абстрактный класс может быть абстрактным, и в то же время не иметь ни одного абстрактного метода

Интерфейс
• Интерфейс – более «строгий» вариант абстрактного класса. Методы могут быть только абстрактными

• Интерфейс задает только поведение, без реализации

• Интерфейс может наследоваться от одного или нескольких интерфейсов

Отличия абстрактного класса от интерфейса


• Абстрактный класс может содержать какие то реализованные методы, кроме абстрактных. В интерфейсе
– все методы абстрактные.

• Абстрактный класс – это некое промежуточное звено между интерфейсом и объектом с конкретной
реализацией

• Интерфейс может наследоваться от множества интерфейсов, абстрактный класс - только от одного


абстрактного класса.

• Существует совет, что если есть возможность – лучше вообще отказаться от абстрактных классов, а
использовать только интерфейсы.

• Абстрактный класс может наследоваться от обычного или абстрактного класса, интерфейс - нет

http://javabegin.ru 18
Особенности
• Не нужно строить большие иерархии из 20 ступеней

• Уровни абстракции вырисовываются чаще не сразу, а по ходу написания программы

• Проблема множественного наследования решается с помощью интерфейсов

• Класс может наследоваться только от одного абстрактного класса, но реализовывать множество


интерфейсов

• С помощью абстрактных классов и интерфейсов вы обязываете разработчика, который создает дочерний


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

• Абстрактный класс может быть пустым, но все равно он останется абстрактным

• Не нужно программировать в студенческом стиле (сразу готовые работающие классы) – сначала нужно
создать поведение – затем его реализовывать

• В любой программе должен быть абстрактный слой (абстрактные классы или интерфейсы) – и классы для
реализаций (все служебные классы java построены по этому принципу, например классы коллекций)

• Желательно использовать интерфейсы, т.к. они гибче (не привязаны к дереву наследования, можно
реализовывать множество разные по смыслу интерфейсов)

Ключевое слово static


• Статичному методу запрещено использовать нестатичные переменные класса

• Статичные элементы не манипулируют свойствами объекта и не привязаны к конкретному объекту.

• Статичные методы и свойства можно вызывать:

1. Через имя класса

2. Через ссылку на экземпляр класса

3. Чаще используется первый вариант:

НазваниеКласса.статичныйЭлемент

• Статичный элемент связан не с объектом, а с классом

http://javabegin.ru 19
Композиция
• Сборка объекта по частям

Computer

CDRom CDRom

Процессор Процессор

Монитор Монитор

Клавиатура Клавиатура

Мышь Мышь

• Наследование – не всегда лучший инструмент для повторного использования кода из-за привязки к
архитектуре наследования

• Старайтесь использовать композицию вместо наследования

• По времени жизни внутренние объекты зависят от объекта, в котором они созданы

• Если объекты связаны по типы "содержит", то нужно применять композицию

• Если объекты связаны по типы "является", то нужно применять наследование

Перегрузка метода
• Одно имя метода, но разные параметры

• Перегрузка методов – это тоже часть полиморфизма

• Когда у вас есть один метод, который должен уметь работать с разными типами передаваемых
параметров – вам необходимо создать перегруженные методы

Передача параметров в метод


• 2 типа передачи параметров в метод: примитивные - по значению, ссылочные - по ссылке

http://javabegin.ru 20
• По значению – создается копия переданного параметра, которая не затрагивает оригинал

• По ссылке – создается копия ссылки на объект. Все действия отражаются на исходном объекте

JavaDocs
• Официальная документация по всем встроенным классам Java

• Утилита javadoc.exe – генератор стандартной документации Java

• Документирование собственного программного кода (в виде HTML) – облегчает просмотр и


сопровождение программы

• Описание работы классов, методов, «подводные камни», сложные алгоритмы

• Автоматическая генерация в NetBeans

• Рекомендации по написанию документации от Oracle


http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

• Документация по всем классам Java 1.7 http://docs.oracle.com/javase/7/docs/

Правила написания кода на Java


• Документ Code Conventions for the Java Programming Language – описание правил именования, ведения
комментариев, организации кода, объявлений переменных, операторов и пр.

• Общие правила написания кода помогают любому программисту быстрее понять и легче сопровождать
свою или чужую программу.

• Компания или команда программистов часто задают собственные правила написания между собой

• Название пакета – маленькими буквами, разделение слов – через точку, от общего к частному
(com.javabegin.demo.interface)

• Название класса – существительное, с большой буквы, каждое слово с большой буквы (BusStation)

• Название метода – с маленькой буквы, в названии - действие, глагол. Каждое слово с большой буквы
(goBack(), closeConnection())

• Переменные – существительное, с маленькой буквы. Каждое слово с большой буквы (busNumber)

• Константы – существительное, все буквы большие, разделение слов через «_» (private static final
MAX_VALUE=5;)

• Названия должны быть «говорящими», должен быть понятен смысл. Длина – небольшая, желательно
максимум 2 слова.

• Объявление переменных в одну строку – только однотипные (int x,y; , где x,y – координаты)

• Отступы - автоматическое форматирование в NetBeans Alt+Shift+F – для улучшения читабельности кода

• Правила от Oracle -http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

http://javabegin.ru 21
• Дополнения от NetBeans –
http://netbeans.org/community/guidelines/code-conventions.html

• Дополнения для NetBeans – плагины PMD, CheckStyle

Графический интерфейс в Java

• Компонент - элемент графического интерфейса, который отвечает за взаимодействие с пользователем.

• JButton

• JLabel

• JTextField

• JList

• JTable

• Контейнер - позволяет объединять компоненты и другие контейнеры.

• JFrame

• JPanel

• JDialog

Контейнер

Компонент
Компонент
Компонент
Компонент
Компонент
Компонент
Контейнер

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

• JFrame – самый корневой контейнер, главное окно программы.

• JDialog – для построения диалоговых окон

• JApplet - для построения апплетов


http://javabegin.ru 22
JavaBeans
• JavaBeans – это архитектура или концепция написания компонентов.

• Компонент - это набор классов, написанных по определенным правилам и объединенных в один


автономный объект.

• Преимущество JavaBeans – это наличие определенных стандартов по написанию и использованию


компонентов.

Правила написания JavaBeans


• доступ к свойствам классов через гетеры и сетеры

• наличие конструктора по умолчанию или без параметров для создания экземпляра класса

• применение принципов инкапсуляции для скрытия внутренней реализации

• названия методов соответствуют их функционалу или целям

Правила написания графических компонентов


• для создания компонента нужно создать экземпляр соответствующего класса (JButton, JPanel и т.д.)

• доступ к свойствам компонента через гетеры и сетеры

• названия публичных методов прозрачны и понятны

Контейнеры
• Для начала необходимо создать контейнер верхнего уровня, в котором будут располагаться все
остальные контейнеры и компоненты

• Компоненты без контейнера существовать не могут

• Компонент может быть включен только в один контейнер

Контейнер верхнего уровня

Меню Компоненты можно


добавлять в content pane

Content pane Root pane

http://javabegin.ru 23
Менеджеры размещения
Менеджеры нужны для того, чтобы компоненты внутри контейнера «вели себя правильно» в независимости от
расположения и размера окна, разрешения экрана и пр.

• FlowLayout

• BorderLayout

• BoxLayout

• GridLayout

• CardLayout

• GridBagLayout

• GroupLayout

• SpringLayout

• Без использования Layout (указание абсолютной позиции)

Flow Layout

Расположение компонентов в строку

К1 К2 К3

Перенос компонента на другую строку

К1 К2

К3

http://javabegin.ru 24
Border Layout

Расположение компонентов по полюсам

К1

К2 К5 К3

К4
Центральная часть занимает весь фрейм, если остальные части пустые

К1

Box Layout

Расположение по горизонтали или вертикали

К1

К2 К1 К2 К3

К3

http://javabegin.ru 25
Grid Layout

Расположение в строках и столбцах

3 столбца

К1 К2 К3
2 строки

К4 К5 К6

Абсолютная позиция

Расположение по координатам

К1

К2

http://javabegin.ru 26
• Можно использовать визуальный редактор

• Существует множество менеджеров от сторонних разработчиков

• Можно создать собственный менеджер с помощью реализации интерфейса LayoutManager

Рекомендации от Oracle
Java Look and Feel Design Guidelines, Second Edition

http://www.oracle.com/technetwork/java/jlf-135985.html

Использование вложенных менеджеров


Контейнеры можно вкладывать друг в друга, в каждом будет свой менеджер расположения

На примере Калькулятора

Число 1 Число 2

Сложение Вычитание Умножение Деление

Результат

http://javabegin.ru 27
События компонентов
• Компонент может производить какое-либо событие – event (нажатие кнопки, ввод данных,
переключение флажков и пр. )

• Стандартная библиотека Java имеет множество классов для всех видов событий

• Слушатель (listener) – ожидает выполнения соответствующего события и выполняет реализацию

• Для обработки событий необходимо реализовать нужный интерфейс слушателя

Задача слушателя - отловить нужное событие, а что дальше делать – это уже задача программиста.

Событие Слушатель
Компонент
(Listener)

Компонент может Для каждого типа события


генерировать событие существует свой слушатель

Главная задача программиста – выбрать правильный listener и реализовать его.

• ActionListener – наиболее часто используемый (нажатие кнопки, выбор пункта меню)

• MouseListener – события мыши

• FocusListener – при изменении активности, фокуса компонента

• DocumentListener – при изменении текста в соответствующих компонентах

Реализация слушателей
• Создать анонимный внутренний класс (Anonymous inner class или просто Anonymous class) – находится в
месте объявления слушателя и не имеет имени (отсюда название анонимный)

• Создать именованный внутренний (inner class) класс –находится внутри класса, в котором обрабатывается
событие

• Создать отдельный класс – находится отдельно от других классов, в своем личном файле .java

• Для маленьких программ - внутренние классы

• Анонимные классы - лучше не использовать вообще, потому что если программа хоть немного
расширится начнутся проблемы, придется в любом случае переносить в отдельные классы

• Отдельные классы – самый оптимальный вариант в большинстве случаев.

Анонимный класс
• Отсутствует имя класса

http://javabegin.ru 28
• Экземпляр класса используется сразу в месте его создания

• Реализация класса не очень большое по объему

Классы-адаптеры слушателей
• Если при реализации интерфейса вы не хотите переопределять все методы, вы можете воспользоваться
классом – адаптером.

• Адаптер представляет из себя класс с пустой реализацией методов и нужен для сокращения вашего кода

• Часто адаптер реализует все однотипные интерфейсы для компонентов

JAR файл
JAR - это Java-архив (сокращение от англ. Java Archive)

• Это обыкновенный ZIP архив, который содержит в себе скомпилированные классы и дополнительные
файлы

• Передача компонента другим программистам

• NetBeans при компиляции проекта автоматически формирует JAR-файл, в котором содержится проект

• Часто под библиотекой подразумевают jar-файл

• Библиотека имеет свою версию

Файл MANIFEST.MF
• Нужен для правильной работы JAR файла

• Указывает класс с методом main для запуска

• Содержит версию библиотеки (в том числе может формировать версию сборки из системы контроля
версий)

• Содержит ссылки на подключаемые библиотеки

JAVA WEB START


• Используется для распространения и запуска программы по сети

• Приложение запускается вне браузера

• Описание запуска и вся служебная информация – в файле JNLP (xml файл)

Java - апплеты
• Программа, которая запускается в браузере. Выполняется виртуальной машиной Java.

http://javabegin.ru 29
• Для запуска требуется плагин для браузера

• Запуск происходит в «песочнице»

• Не имеет доступ к файловой системе пользователя, если пользователь лично не даст на это разрешение

• Встраивается в HTML страницу с помощью тегов <object> и <applet>

• Является альтернативой Java Web Start для запуска приложений Java

Методы Java – апплета

init() – при первом запуске апплета (Инициализация переменных)

destroy() – при удалении апплета из памяти (Освобождение ресурсов)

start() – при каждом запуске апплета (при загрузке веб-страницы с апплетом)

stop() – при закрытии веб-страницы с апплетом

Примеры Java - апплетов


• http://www.realapplets.com/applets.asp

Больше информации – на официальном сайте:

• http://docs.oracle.com/javase/tutorial/deployment/applet/index.html

Дизайнер форм NetBeans


• Помогает строить графический интерфейс быстрее

• Создание и настройка компонентов происходит через визуальный интерфейс

• Имеет свои минусы – ограничения на редактирование кода

http://javabegin.ru 30
Массивы
• Хранит список значений

• Каждое значение – элемент массива

• Каждый элемент определяется индексом (порядковым номером)

• Количество элементов – длина массива – фиксировано. Указывается при инициализации массива

• Значения могут быть примитивного и ссылочного типа

Значения по умолчанию
При создании пустой массив принимает значения по-умолчанию:

int 0
double 0.0
char ‘ ’ (пробел)
boolean false
String и ссылочные типы null

Хранение в памяти
• Массив – объект. Каждый массив хранится в памяти как отдельный объект

• Если два массива имеют одинаковые значения элементов – это все равно разные массивы, у каждого
свой адрес хранения в памяти

Типы данных
• Массив может хранить элементы ссылочного и примитивного типов

• Массив может принимать элементы только одного типа, указанного при создании

• Примитивные типы – элементы массива содержат значения

• Ссылочные типы – элементы массива содержат ссылки на объекты

Ограничения
1. Только один тип для всех элементов массива

2. Неудобство - неизменяемый размер

Двумерные массивы
1. Одномерный массив – список значений

2. Двумерный массив – таблица значений (наличие строк и столбцов)

http://javabegin.ru 31
Индекс (порядковый номер) = 4 . Индексация - с нуля!

Элемент массива
(значение «й»)

Длина массива = 7

• Двумерный массив – массив массивов

• Многомерный массив – имеет 3 и более измерений

Доступ к элементам двумерного массива


• Доступ осуществляется через указание строки и столбца

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

Коллекции
Коллекция - группировка объектов определенного типа. Возможности коллекции:

• Хранит набор объектов

• Имеет множество методов для манипуляции с набором. (У массива возможностей намного меньше)

• Динамическое изменение размера

• Не может хранить примитивные типы данных

http://javabegin.ru 32
Типы коллекций

Collection
Map

Set List

интерфейсы

реализация

Set – не содержит одинаковых значений (дубликатов)

List – может содержать дубликаты. Значения определяются по индексу

Queue – содержит дубликаты, значения получаются по индексу. Концепция очереди например FIFO – First In First
Out

Map / Sorted Map – пары «ключ-значение», значение получается по ключу. Ключ – уникальный, значение –
может повторяться

ArrayList
• Содержит набор объектов, доступ осуществляется по индексу

• Размер изменяется динамически (в отличие от массива)

• Можно сказать - более удобная реализация массива

• Является реализацией интерфейса List

Типизированные коллекции
• Строго типизированная коллекция – можно добавлять только определенный тип

http://javabegin.ru 33
• Рекомендуется использовать типизированные коллекции, т.к. можно определять ошибки на этапе
компиляции

Файлы

 Считывание, обработка и хранение информации

 Input – ввод в программу (чтение)

 Output – вывод из программы (запись, сохранение, передача)

 Сокращенная запись в литературе I/O

 Используется модель потоков. Потоки условно можно разделить 2 типа:

Текст - читаемый

Двоичный код (последовательность байтов) – нечитаемый

• Пакет java.io

Считывание и запись двоичных данных

 Не нужно ничего преобразовывать. Байты передаются без изменений.


 Абстрактные классы:

InputStream – поведение для всех входящих потоков

OutputStream – поведение для всех исходящих потоков

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

Считывание и запись текстовых данных

 Часто требуется преобразование (кодировки, переносы строк и пр.)


 Абстрактные классы:

• Reader – поведение для всех классов чтения

• Writer– поведение для всех классов записи

Символы – в кодировке Unicode

Уровень абстракции позволяет задать поведение независимо от типа источника (файловая система,
сокет, http и др.).

Каждый источник (конкретный класс с реализацией абстрактного класса) выполняет это поведение по-
своему.

http://javabegin.ru 34
Структура классов записи данных

InputStream поведение

FileInputStream ByteArrayInputStream … реализация

OutputStream поведение

FileOutputStream ByteArrayOutputStream … реализация

Структура классов чтения данных

Reader поведение

BufferedReader CharArrayReader … реализация

Writer поведение

FileWriter BufferedWriter … реализация

http://javabegin.ru 35
Буферизация

 Проблемы при прямом чтение данных из источника:


 Возможность потери соединения с каналом передачи (например сбои в сети) могут привести к
потере данных
 Снижение производительности: частое обращение к источнику данных (например при записи на
жесткий диск) с маленькими порциями данных снижает скорость работы. Решение – сначала
данные скопировать в буфер (оперативную память) – только затем на жесткий диск.
 Буферизация – способ избежать потерь и увеличить производительность
 Буфер - временное хранилище данных в оперативной памяти - для их последующего чтения или записи
программой.
 Увеличение скорости. За счет копирования данных в оперативную память и только потом на источник
хранения данных.
 Целостность – данные сначала считываются в буфер с проверкой на целостность, и только после этого в
программу
 Чтение (input) - копирование данных из потока в буфер.
 После получения в буфер всех данных без потерь – чтение из буфера в программу
 Запись (output) – копирование данных сначала в буфер, потом из буфера во внешний поток

Входящие и исходящие потоки

Input (чтение) Шаги:


• Последовательное чтение 1. Определение источника
данных из источника 2. Открытие входящего потока
3. Чтение данных из источника
Поток 4. Закрытие входящего потока
Источник Программа
данных

Output (запись) Шаги:


• Последовательная запись 1. Определение источника
данных в источник 2. Открытие исходящего потока
3. Запись данных в источник
Поток 4. Закрытие исходящего потока
Программа Источник
данных

http://javabegin.ru 36
Чтение с консоли

• Чтение входящих в программу данных из консоли. Стандартный способ:

System.in (по аналогии с System.out)

Часто используется с предварительным чтением в буфер

Классы:

Scanner

Console

Работа с файловой системой

 Класс java.io.File
 Работа не с содержимым файла, а с файлом как элементом файловой системы (перемещение, удаление,
копирование, переименование и пр.)
 Класс файл работает как с файлами, так и с папками
 Множество методов для всех видов операций с файлом

Существует пакет java.nio (nio – New I/O) –расширенные классы для работы с файлами, дополнительные
возможности работы с потоками и буфером.

Исключения

• Исключение, исключительная ситуация (exception) – нестандартная ситуация при возникновении ошибки


в ходе работы программы. Термин «выбросил исключение»

• Программа должна уметь правильно и вовремя обрабатывать исключения

• Исключение – это объект. Создается новый экземпляр соответствующего класса ошибки

• В Java существует 2 типа ошибок: Error и Exception

• Error – ошибки в памяти, переполнение стека, сбой в работе виртуальной машины. Продолжение работы
программы – невозможно (OutOfMemoryError, StackOverflowError)

• Exception – ошибка в ходе работы программы. С правильной обработкой – возможно продолжение


программы (FileNotFoundException, NullPointerException)

Cтруктура классов

• У разного вида исключений (деление на ноль, не найден файл, ошибка в sql-запросе и пр.) существует
соответствующий класс (объект). Например, FileNotFoundException, NullPointerException, SQLException

• Все классы ошибок имеют строгую иерархию между собой (дерево наследования)

http://javabegin.ru 37
Throwable Пакет java.lang

Error Exception

SQLException
RuntimeException IOException

ClassCastException
Сhecked
IndexOutOfBoundException

(перехватываются)

Unchecked
(не перехватываются)

Обработка

 Перехватить и обработать (блок try-catch)

 Не перехватывать, а передать исключение «выше» вверх по стеку вызовов, для обработки в другом
вышестоящем в стеке методе (ключевое слово throws )

 Стек вызовов (стек методов) – цепочка вызовов методов начинаю с самого первого метода (main),
который оказывается в самом низу стека.

 Чаще всего перехватываются checked exceptions

 Для перехвата и обработки используются операторы try…catch

 Можно использовать последовательность блоков catch, при этом типы перехватов ошибок сверху вниз
должны подчиняться правилу «от общего к частному»

Не оставлять пустым блок catch!

http://javabegin.ru 38
«Пробрасывание» исключения

void имя метода(параметры) throws SQLException{

… // код метода, который может «выбросить» SQLException

Информация об ошибке
• printStackTrace() –трассировка базового класса. Печать всех вызванных методов до момента
возникновения ошибки. Часто указывается номер строки, которая вызывала исключение

• getMessage() – получает сообщение об ошибке (текст ошибки)

• Cуществует возможность создавать собственные экземпляры классов ошибок со своим описанием


ошибки. Для этого необходимо унаследоваться от соответствующего класса.

http://javabegin.ru 39
Базы данных
• Множество данных, хранящиеся по определенной структуре для удобного манипулирования

• Данные могут храниться в файлах: минусы - неудобство, скорость обработки и пр.

• Профессиональные программы используют специальные программы (движки) для хранения данных

• Различие понятий «базы данных» (БД) и «система управления базами данных» (СУБД)

• Данные могут быть связаны между собой зависимостями и ограничениями – для поддержания
целостности структуры

• Проектирование базы данных – важный и ответственный процесс, от которого может зависеть все
остальное

Типы
• Древовидные:

• Иерархическая – отношение родитель/потомок, древовидная зависимость

• Сетевая – доработанный вариант иерархического типа, изменены связи между узлами

• Реляционные: отношение столбца к строке, самая популярная на сегодняшний день

• Объектные – упрощают взаимодействие с языками с поддержкой ООП:

• Объектно-ориентированная – данные в виде объектов

• Объектно-реляционный – реляционные с поддержкой объектов

• Документо-ориентированные – хранения данных в виде документов со свойствами (пара «ключ-


значение»)

Новая современная модель данных:

• NoSQL – в противовес реляционным базам данных, выигрыш в скорости при больших объемах
данных

По методу работы и запуска

• Встроенные – не нужно устанавливать, распространяются вместе с программой (SQLite, H2 и пр.) –


меньше возможностей, но легко переносить.

• Невстроенные – устанавливаются и запускаются как отдельный сервер, отдельный процесс для


операционной системы (MySql, Oracle, MS SQL Server и др) - больше возможностей, но сложнее
переносить

Многие СУБД умеют работать в обоих режимах

Реляционная база данных


• Самая распространенная на данный момент

• Relation (отношение) – отношение названия столбца к номеру строки, как в Екселе


http://javabegin.ru 40
• Данные в виде двумерных таблиц

• Столбец – имя атрибута

• Строка - номер записи

столбцы
строки

Основные понятия

1
3

1) Таблица, данные таблицы – все записи для данной таблицы

2) Запись (строка) – строка в таблице, которая хранит значения соответствующих столбцов. Все основные
операции при работе с БД происходит с записями.

3) Столбец (поле, атрибут) - детализирует данную запись. Каждый столбец имеет уникальное имя в пределах
таблицы. Столбец должен иметь понятное смысловое название, отражающее смысл.

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

http://javabegin.ru 41
5

4 4

4) Значение столбца – значение столбца для определенной записи.

Часто после получения нужной записи – определяют значения нужного столбца по имени или порядковому
номеру

5) Структура таблицы – набор столбцов, свойств, типов данных для данной таблицы. Также структура – это
различные свойства самой таблицы.

6) Структура базы данных – набор таблиц с их свойствами и связями

7) Поиск в базе данных, в таблице (выборка данных) – нахождение одного или множества записей в
определенной таблице или нескольких таблицах.

Поиск ведется по различным критериям. В примере - по названию машины BMW.

Можно задавать несколько значений столбцов для поиска с вариантами «И», «ИЛИ», «равно», «не равно»

8) Добавление, удаление, обновление данных – действия с данными (записями) таблицы.

Изменения может происходить после поиска – находим нужную запись и изменяем(удаляем) ее

Таблица
• Таблица – объединение данных по логическому принципу. Например таблица Student – хранит данные о
студентах.

• Важное правило – название таблицы должно отражать суть хранимых данных. (По аналогии: название
класса должно отражать суть его назначения, функционала)

http://javabegin.ru 42
• Обращение к таблице происходит по имени.

• Схема таблиц – объединение таблиц по логическому принципу. Например, схема CAR – таблицы,
связанные с машинами. По аналогии с пакетом – объединение классов по смыслу.

Первичный ключ
• Первичный ключ, PK (Private Key)

• Простой – поле, с уникальным значением для каждой записи. Однозначно характеризует запись.
Например поле id

• Составной – несколько полей, которые вместе представляют уникальное значение для записи.
Например связка полей id+Name+Volume

Главная цель первичного ключа – уникальная идентификация записей таблицы. Не может быть 2 записи с
одинаковым значением первичного ключа.

Внешний ключ
Внешний ключ, FK (Foreign Key) – ограничение на ввод данных для определенного поля. Ограничение возможных
вариантов значений для данного поля. Создается для целостности данных, чтобы нельзя было ввести другие
данные, кроме разрешенных.

Внешний ключ ссылается Первичныйк


на первичный люч
Внешний
ключ
Таблица 1

Таблица 2

ошибка
http://javabegin.ru 43
Главная цель внешнего ключа – ограничение на ввод данных для поддержания целостности данных.

Индекс

• Индекс – хранит список значений ключа с указателями на соответствующую запись. Для быстрого поиска
нужных записей.

• Самый известный пример – содержание книги. Не нужно поочередно перелистывать страницы, сразу
можно открыть нужную. Поиск без индекса – перебор всех записей поочередно.

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

• Поля ключей индексируются автоматически. Все остальные поля необходимо индексировать вручную.

• Индекс может быть уникальным и как не уникальным – для достижения целостности данных

• Индексы обычно создаются для тех столбцов таблицы, которые часто используются в запросах, в
условиях выборки

• Индексы занимают дополнительный объем памяти и могут занимать достаточно много места.

Советы
• Нужно разбивать базу данных на множество таблиц, но не слишком много – найти оптимальный вариант
по количеству и неизбыточности.

• Называть таблицы по принципу объектов (Employee, Address), чтобы оперировать жизненными


понятиями, так будет легче с ними работать.

• Названия таблиц - в единственном числе. Student, а не Students

• В качестве идентификатора строки (для первичного ключа) лучше использовать числовой тип, а не
текстовый. Быстрее работает.

• Предварительно для каждого столбца нужно продумывать его тип с точки зрения бизнес-логики.
Например, для поля номер комнаты, может подойти как числовой тип (1, 2 … 1000), так и текстовый (A1,
A2...A1000). Т.е. нужно сначала проанализировать, потому что потом менять типы полей, когда там уже
есть данные, намного сложней.

• Оставляйте комментарии к таблицам (они не влияют на скорость работы запросов к таблице)

• Каждая таблица должна иметь первичный ключ

• Не нужно создавать индексы на все поля без разбора

База данных SQLite


• «Встроенная» или «встраиваемая» база данных.

• База данных хранится в одном единственном файле

http://javabegin.ru 44
• Используется в Firefox, Google Chrome, iPhone, Android, Skype

• Преимущества – проста в использовании

• Минусы – ограниченные функции, в отличии от серверных баз данных.

• Сайт http://www.sqlite.org/

• Типы полей – изменяются в разных базах данных

• NULL – пустое значение.

• Поля первичного ключа не могут содержать пустое значение

• Запросы SQL могут иметь различный синтаксис (в следующих уроках)

• Выборка данных – любое количество процессов одновременно.

• Изменение данных – только один процесс в одно время. Создается блокировка файла - одновременно
несколько процессов не могут изменять значения.

• Не рекомендуется «расшаривать» базу данных SQLite по сети: проблемы с блокировкой

Для работы с SQLite необходимо:

• Скачать и установить графический дизайнер для управления базой данных (можно выбрать
любой удобный).

 Рекомендую SQLite Expert Personal – из бесплатных – одна из самых удобных.

 При создании базы данных – все будет находиться в одном файле (отдельно
инсталлировать ничего не нужно)

• Скачать JDBC драйвер для подключения из программного кода Java

Основы проектирования таблиц


Можно выделить 4 шага при проектировании базы данных:

1. Исследование предметной области

• определение целей и задач, для чего создается база данных, для каких функций

2. Определение объектов (сущностей, таблиц) и их атрибутов (полей, столбцов)

• создание основных смысловых таблиц (без справочников и пр.)

3. Нормализация

• определение отношений и связей между объектами

• избавление таблиц от избыточности (создание справочников и пр.)

• создание первичных ключей, внешних ключей

4. Оптимизация окончательной структуры


http://javabegin.ru 45
• создание индексов, комментариев

• улучшение производительности

• небольшие доработки и изменения

Важный моменты и понятия


• Сущность – логически отделенный объект исходя из целей и функций базы данных.

Чаще всего при проектировании таблиц: 1 таблица – 1 объект (сущность). Например база данных по продаже
автомобилей: сущности – магазин, автомобиль, запчасть и пр.

• В каждой таблице должен быть первичный ключ.

• Каждая таблица должна иметь интуитивно понятное название и назначение

• Правильное использование различных типов связей таблиц:

1. Один к одному

2. Один ко многим (используется чаще всего)

3. Много ко многим

4. Таблицы должны соответствовать «нормальным формам» (если не всем сразу, то некоторым)

• База данных должна быть расширяема

Отношение: один к одному (1:1)


• Две таблицы связаны путём «наследования» - смысл такой же как и у понятия «наследование» из ООП

• Используется, когда нужно расширить уже существующую таблицу без ее изменения – создается новая
таблица

• Например, таблица с данными об электронных устройствах – наследование по схеме:

Электронное
устройство

Компьютер Телефон Ноутбук

http://javabegin.ru 46
Первичный ключ ссылается на
первичный ключ (или уникальное Ноутбук
поле) из другой таблицы

Электронное устройство

Телефон

• Поля Year, Price, Weight – общие свойства для всех устройств

• В дочерних таблицах – уникальные поля для устройства. В таблице «Эл.устройство» - общие свойства, в
дочерних – детализированные свойства

• Совмещать все виды устройств в одной таблице – получится «каша», слишком много уникальных полей
(для ноутбука например не нужно знать тип связи CDMA, GSM); таблица может разрастись и трудно будет
ею управлять

Отношение: один ко многим (1:N)

Внешний ключ ссылается на первичный ключ из другой таблицы

Модель ноутбука Ноутбук

В таблице «Ноутбук» может быть множество моделей Acer

http://javabegin.ru 47
• Частое использование такой связи – создание справочников

• Справочник может также содержать названия на разных языках

• Помещать названия модели на разных языках в одном поле таблицы – неудобно и избыточно

• Отсутствие избыточности – разделение данных

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

Отношение: много ко многим (M:N)

Внешний ключ ссылается на первичный ключ из другой таблицы

Компания Тип устройства

В таблице «Компания» могут быть фирмы, которые ссылаются на несколько


типов устройств

Нормальные формы

• Нормализация - процесс преобразования таблиц в нормальные формы для исключения избыточности.

• Чаще всего – это разделение таблиц и ее полей на отдельные таблицы с указанием связей, т.е.
разделение и детализация данных.

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

• Пока не будем забивать голову видами форм и их определениями.

Основы SQL

• Язык запросов в базу данных

• Все манипуляции программы с таблицами и базой данных – с помощью SQL


http://javabegin.ru 48
• Без хороших знаний SQL – можно не начинать работать с базами данных

• Запрос – команда для различных действий (добавление, изменение, удаление, просмотр и пр.)

• Существует множество стандартов SQL (по годам)

• Различные реализации SQL (Transact-SQL, PL/SQL)

• DDL (Data Definition Language) – описание структуры таблиц, базы данных

• Не все запросы будут работать в SQLite. Нужно уточнять синтаксис из документации на сайте -
http://www.sqlite.org/lang.html

• Синтаксис SQL может незначительно изменяться в разных базах данных – что работает в SQLite может не
заработать в других базах данных

• Полная совместимость запросов SQL без изменения со всеми базами данных – маловероятна.

Select (выборка)
Выборка – чтение, поиск записей (с условиями или без) из таблиц(ы)

Результат выборки – ноль или более записей. Каждая запись имеет столбцы, указанные в разделе поля –
значения каких полей будут отображаться в результате.

Столбцы указывается через запятую (id, name, year) либо указываются все столбцы – с помощью символа *

Таблица – название таблицы, откуда выбираем данные

Условия – поиск определенных записей. Чаще всего условия – это определенные значения для определенных
столбцов (name=‘Иван’, id=5)

Самая простая форма:


select (поля) from (таблица)
С условиями:
select (поля) from (таблица) where (условия)

Примеры без условий

select name_ru, name_en from spr_Model


Выбрать все записи из таблицы spr_Model и отобразить поля
name_ru, name_en

select * from Car


http://javabegin.ru
Выбрать все записи из таблицы Car и отобразить все поля 49
Выборка уникальных значений столбца

select distinct(model_id) from Car


Выбрать уникальные модели из таблицы Car

Примеры с условиями

select * from Transport where price<=2000


Выбрать записи из таблицы Transport, у которых цена меньше или
равна 2000. Отобразить все столбцы.

select * from Transport where price<=2000


and issue_date>=’2000-01-01’
Выбрать записи из таблицы Transport, у которых цена меньше или
равна 2000 и год выпуска больше 1-го января 2000-го года. Отобразить
все столбцы.

select * from Car where id=5


Выбрать запись из таблицы Car, у которой id равен 5. (id – уникальное
поле, поэтому результатом будет либо ноль либо одна запись – не
множество) Отобразить все столбцы.

Вместо AND можно использовать OR для условия «ИЛИ»

http://javabegin.ru 50
Сортировка результата

select * from Transport where price<=2000 order by issue_date


Выбрать записи из таблицы Transport, у которых цена меньше или равна
2000 и упорядочить результат по дате выпуска. Отобразить все
столбцы.

select * from Transport order by RANDOM()


Выбрать все записи из таблицы Transport и упорядочить результат
случайным образом. Отобразить все столбцы.

• По-умолчанию данные отсортированы в порядке следования записей в таблице

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

• Можно добавлять в конец запроса слова asc (по возрастанию) или desc (по убыванию) для
указания направления сортировки

• Если направление сортировки не указано – по-умолчанию используется asc

• Вместо имени можно также использовать порядковый номер столбца из результата выборки

• RANDOM() работает не во всех базах данных

Граница выборки

select * from Transport where price<=2000 limit 5,10


Выбрать записи из таблицы Transport, у которых цена меньше или
равна 2000 и отобразить 10 записей начиная с 5 по счету.
Отобразить все столбцы.

• Команда Limit поддерживается не во всех базах данных

• Необходимо правильно использовать кавычки в условиях запроса.

http://javabegin.ru 51
Агрегатные функции

select count(*) from Transport


Получить количество записей в таблице Transport

select max(capacity) from Car


Получить максимальный объем двигателя среди всех автомобилей

select sum(price) from Transport


Получить общую сумму всех имеющихся транспортных средств.

select count(*) as count from Transport


Получить количество записей в таблице Transport и назвать
столбец «count»

• Доступные функции COUNT, MIN, MAX, SUM и AVG

• Также можно добавлять условия WHERE

• Результат запроса чаще всего – одна строка с числом.

• Набор доступных агрегатных функций зависит от базы данных

Группировка

select seller_id, count(transport_id) from Sale group by seller_id


Получить по каждому продавцу количество проданных им машин

select seller_id, sale_date, count(transport_id) from Sale group by


seller_id, sale_date
Получить данные в разрезе продавца и дня. Т.е. группировка сначала по
продавцу, потом для каждого продавца – по дням.

http://javabegin.ru 52
• Группировка результата по одному или нескольким столбцам

• Чаще всего group by применяется вместе с агрегатными функциями

• Можно указывать несколько агрегирующих функций

Основные моменты

• Не забывайте использовать в условиях WHERE кавычки для текстовых значений и дат

• DDL (Data Definition Language - язык описания данных) – sql запросы для описания структуры базы данных
(в SQLite Expert Personal 3 вкладка DDL)

• Команда explain – для определения «узких мест» при выполнении запросов

• Для сбрасывания счетчика запрос: delete from sqlite_sequence where name=‘имя таблицы‘

• Сначала протестировать все SQL запросы, только потом вставлять их в программный код

• Нежелательно всегда использовать * (получение всех полей) когда нет необходимости, поля нужно
перечислять через запятую – это приведет к увеличению производительности и улучшению
читабельности запросов

• Один и тот же запрос для разных баз данных может работать по разному, потому что методы реализации
доступа к данным у каждой СУБД своя.

• Существуют также NoSQL базы данных (key-value база данных) – для работы с большими объемами
данных. Доступ к данным – не с помощью SQL запросов

JOIN
• Присоединение к таблице одной или нескольких таблиц и вывод объединенных результатов. Пример –
таблица Car и справочники

• Часто требуется выбирать данные не из одной таблицы, а сразу из нескольких или множества таблиц

• Оператор JOIN позволяет выбирать данные и отображать столбцы из разных таблиц, т.е. объединить поля
из нескольких таблиц в один результат по определенным условиям

• Объединение происходит только в запросе, структура самих таблиц остается неизменной

• Все виды доступных join можно почитать на официальной странице


http://sqlite.org/syntaxdiagrams.html#join-op

• Часто для теоретического описания оператора JOIN используют теорию множеств (пересечение,
объединение и пр.)

• Основные виды JOIN

• INNER JOIN

• Пересечение данных двух таблиц по определенному условию.

• OUTER JOIN
http://javabegin.ru 53
• LEFT

• RIGHT

• FULL (работает не во всех СУБД)

• Присоединение в левую (LEFT OUTER JOIN) или правую (RIGHT OUTER JOIN) таблицу пересеченных данных
из второй таблицы.

• FULL JOIN – объединение LEFT JOIN и RIGHT JOIN

• FULL и RIGHT на данный момент не поддерживается в SQLite

• CROSS JOIN – изучить в качестве домашнего задания

Примеры запросов с JOIN желательно смотреть в SQLite Expert Personal, т.к. они громоздкие и будут сложны в
понимании без данных

Подзапросы

• Подзапрос – вложенный оператор SELECT


• Применение:
• в условии WHERE, HAVING - задает заранее неизвестные значения, выбранные из других таблиц
• UPDATE, INSERT, DELETE

Подзапросы в условии WHERE

select * from Car where transport_id in (select transport_id


from Sale)

Получить только те автомобили, которые были проданы

1. Сначала выполняется запрос (select transport_id from Sale)


2. После выполнения:
select * from Car where transport_id in (1,2,3,5)

select * from Car where model_id = (select id from


spr_Model where name_en='Golf')
Получить автомобили марки Golf
• Вместо IN также может быть знак равенства

http://javabegin.ru 54
Перечисление таблиц

select * from Sale, Seller where sale.seller_id=seller.id


Получить продавцов и их проданные автомобили (отобразить все поля
из двух таблиц)

JDBC

• JDBC - Java DataBase Connectivity

• Основное назначение - подключение к базе данных, выполнение SQL запросов и их обработка из


программного кода Java

• JDBC – это стандартный интерфейс (API для разработчиков) без реализации

• Реализация интерфейса JDBC – задача поставщика СУБД (реализация также на Java)

• Для работы необходимо:

 Подключить JDBC драйвер


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

Отправка Преобразование
команд по команд JDBC
стандарту в команды для
JDBC базы данных

Драйвер
Программа База
JDBC
Java данных
Jar файл

Ответственность Ответственность производителя СУБД


программиста

http://javabegin.ru 55
• В обратном направлении – аналогично
• Программисту нужно лишь знать интерфейс JDBC, без реализации для каждой СУБД
• Чаще всего – программа посылает и обрабатывает SQL запросы

Преимущества и недостатки

Преимущества:
• Единый интерфейс для работы с любой СУБД
• Независимость от операционной системы (Windows, Linux и пр.)
• Для работы достаточно скачать JDBC драйвер (jar-файл), нет необходимости устанавливать
дополнительный софт

Недостатки:
• Переход от одной СУБД к другой (с существующим программным кодом) не всегда легко удается
выполнить
• Различие в синтаксисе SQL запросов
• СУБД может предоставлять свой интерфейс (не JDBC), написанный на Java (редкий случай)

http://javabegin.ru 56
2-х звенная архитектура

Драйвер JDBC База


Программный
код данных

Часто используется в desktop приложениях (не Web). База данных может находиться как на том же
компьютере, так и на другом.
Минусы:

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

• нет централизованного управления доступом к базе данных

• часто изменения по работе с базой данных необходимо производить в программном коде

• невысокая производительность

3-х и многозвенная архитектура

Сервер
Программный HTML браузер приложений Драйвер JDBC База
код (Jboss, Tomcat данных
и др.)

Часто используется в Web приложениях, когда к одной базе данных одновременно обращается множество
пользователей

Плюсы:

• Логика по управлению доступом к базе данных ложится на сервер приложений. Программный код лишь
осуществляет логику по работе с данными (запросы, обработка)

• База данных находится на отдельном компьютере с хорошей производительностью (часто - мейнфрейм)

• Возможность централизованного увеличения производительности (кеширование, пулы соединений,


оптимизация и пр.)

http://javabegin.ru 57
Подключение к SQLite через JDBC

Программа JDBC

Программа напрямую не
обращается в базу
данных

Драйвер
База
данных

План написания программного кода

1. Импорт пакета java.sql


2. Загрузка нужного драйвера в коде
3. Создание соединения с базой данных
4. Создание выражения для выполнения SQL запроса
5. Выполнение SQL запроса и обработка результатов

JTable

• JTable – отображение данных в таблице.

• JScrollPane – для прокручивания таблицы

• Метаданные (Metadata) – служебные данные (количество строк, столбцов, типы данных)

• Представление (View) – сохраненный SQL запрос, результаты которого представлены в виде таблицы

• TableModel – модель компонента JTable. Манипуляция с данными, выравнивание, сортировка и пр. (по
умолчанию используется встроенная модель)

• TableRenderer – внешний вид данных, ячеек, строк и пр. (по умолчанию используется встроенный
визуализатор

http://javabegin.ru 58