Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Java.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
3.45 Mб
Скачать

Тема 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). Шахматы

Минимальный список характеристик:

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

  • Турнир, страна, город, дата проведения, уровень турнира;

  • Стартовый номер спортсмена в данном турнире, занятое место.

Один шахматист может участвовать в разных турнирах.

Выборки:

  • Выбрать турнир с самым высоким рейтингом участников.

  • Выбрать те турниры, где все призовые места заняли представители страны-хозяина турнира.

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