Выполнение более сложных запросов
Предыдущие примеры были достаточно просты, но GroovySql так же хорошо работает при более сложных запросах, манипулирующих данными, например, insert, update и delete. Для них вам также не обязательно использовать итераторы, вместо них объект Sql Groovy предоставляет методы execute и executeUpdate.
Эти методы напоминают обычный класс statement JDBC, у которого также есть методы execute и executeUpdate.В листинге 6 вы можете видеть простой запрос insert, который использует подмену переменных с помощью синтаксиса ${}. Этот код просто вставляет новую строку в таблицу word.
Листинг 6. Вставка с помощью GroovySql
wid = 999 |
В Groovy также реализована измененная версия метода execute, который создает список значений, соответствующих любым элементам ? в запросе. В листинге 7 я просто запрашиваю определенную строку таблицы word. За кулисами GroovySql создает экземпляр обычного языка Java java.sql.PreparedStatement.
Листинг 7. PreparedStatements с помощью GroovySql
val = sql.execute("select * from word where word_id = ?", [5]) |
Изменения (update) проходят в основном таким же образом, используя метод executeUpdate. Кроме того, обратите внимание, что в листинге 8 метод executeUpdate принимает список значений, которые будут сопоставлены соответствующим элементам ? запроса.
Листинг 8. Изменения с помощью GroovySql
nid = 5 spelling = "Nefarious" sql. executeUpdate("update word set word_id = ? where spelling = ?", [nid, spelling]) |
Удаление, по существу, выполняется так же, как и вставка, за тем лишь исключением, конечно, другого синтаксиса запроса, как видно из листинга 9.
Листинг 9. Удаление с помощью GroovySql
sql.execute("delete from word where word_id = ?" , [5]) |
Упрощение работы с данными
В любом интерфейсе API или утилите, цель которой состоит в упрощении программирования JDBC, хорошо бы иметь набор мощных функций для работы с данными, и в этом разделе я покажу вам еще три такие функции.
Массивы данных
При всей своей простоте GroovySql поддерживает нотацию типа DataSet, которая фактически является представлением таблиц базы данных в виде объектов. С помощью DataSet вы можете проводить итерирование по строкам и добавлять новые строки. В действительности использование массивов данных является удобным способом представления коллекций данных в виде, характерном для таблиц.
Однако у типа DataSet в GroovySql есть один недостаток - он не отражает отношений; он является простым отображением "один к одному" на таблицу базы данных. В листинге 10 я создаю DataSet из таблицы word.
Листинг 10. Массивы данных в GroovySql
import groovy.sql.Sql |
Как вы можете видеть, тип DataSet GroovySql облегчает итерирование по элементам таблицы с помощью метода each и добавление новых строк с помощью метода add, который использует map, представляющую нужные данные.
Использование хранимых процедур и отрицательной индексации
Хранимые процедуры и отрицательная индексация могут быть важными аспектами работы с данными. GroovySql упрощает вызов хранимых процедур до простого вызова метода call класса Sql. Для отрицательной индексации GroovySql предоставляет расширенный тип ResultSet, который работает как коллекции в Groovy. Например, если вы желаете получить последний элемент результирующего множества, вы можете сделать так, как показано в листинге 11.
Листинг 11. Отрицательная индексация в GroovySql
sql.eachRow("select * from word"){ grs / |
Как видно из листинга 11, получение последнего элемента результирующего множества выполняется простым указанием индекса -1. При желании я также мог обратиться бы к этому элементу по индексу 2.
Это опять простейшие примеры, но они должны помочь вам лучше понять возможности GroovySql. Я закончу урок этого месяца реальным примером, демонстрирующим все описанные ранее возможности.
Написание простого приложения для формирования отчетов
Обычно приложения, формирующие отчеты, извлекают информацию из базы данных. В обычной бизнес-среде вам может потребоваться написать приложение, формирующее отчеты о текущих продажах через Интернет для команды менеджеров по продажам или отчеты с ежедневными контрольными показателями по производительности отдельных компонентов системы, например, базы данных, для разработчиков.
Для нужд нашего простого примера давайте предположим, что вы только что внедрили корпоративное Web-приложение. Конечно же, оно работает безупречно, потому что во время работы над ним вы написали множество функциональных тестов (на Groovy); однако вам нужно создать отчет о состоянии базы данных с целью её настройки. Вы хотите знать, как пользователи работают с приложением, чтобы предупреждать проблемы с производительностью и устранять их.
Обычно количество «примочек», которые вы можете добавить в подобное приложение, ограничивается имеющимся временем. Но новые знания о GroovySql помогут вам создать нужное приложение за несколько минут, оставив вам время на дополнительные функции, если вы этого пожелаете.
Подробности
Целевой базой данных в нашем случае является MySQL, которая удачным образом поддерживает получение информации о состоянии с помощью запроса. Вас интересует следующая информация о состоянии:
- Время безотказной работы
- Общее количество обработанных запросов
- Процентные доли определенных видов запросов, таких как insert, update и select
Получение этой информации из базы данных MySQL с помощью GroovySql становится крайне простым. Поскольку приложение готовится для команды разработчиков, вы, вероятно, начнете с простого отчета, запускающегося из командной строки, но на следующем шаге вы можете с легкостью преобразовать его в отчет для Web. Сценарий использования для нашего примера отчетности может выглядеть следующим образом:
1. | Подключаемся к работающей базе данных нашего приложения |
2. | Подаем запросы show status и регистрируем: |
a. Время безотказной работы | |
b. Общее количество запросов | |
c. Общее количество insert | |
d. Общее количество update | |
e. Общее количество select | |
3. | Используя эти данные, рассчитываем: |
a. количество запросов в минуту | |
b. процентную долю числа запросов insert | |
c. процентную долю числа запросов update | |
d. процентную долю числа запросов select |
В листинге 12 представлен конечный результат: приложение, которое создает отчет с нужной статистикой базы данных. Первые строки кода устанавливают соединение с рабочей базой данных, вслед за чем идет ряд запросов show status, которые позволяют рассчитать показатели количества запросов в минуту и разбить их по типам. Обратите внимание, как переменные типа uptime возникают в момент их определения.
Листинг 12. Отчет о состоянии базы данных с помощью GroovySql
import groovy.sql.Sql |
Повторение сегодняшнего урока
В выпуске Практически Groovy за этот месяц вы могли видеть, как GroovySql позволяет упростить программирование JDBC. Этот прекрасный API-интерфейс сочетает замыкания и итераторы с мягким синтаксисом Groovy, позволяя облегчить быструю разработку приложений баз данных на платформе Java. Более того, GroovySql перекладывает работу по управлению ресурсами с разработчика на среду Groovy, позволяя вам сконцентрироваться на более важных проблемах запросов и их результатов. Однако я не требую верить мне на слово. В следующий раз, когда вам придется погружаться в каторгу JDBC, попробуйте вместо этого использовать немного волшебства GroovySql. После этого отправьте мне письмо по электронной почте и расскажите о вашем опыте.
В следующем месяце в выпуске Практически Groovy, я подробно расскажу о среде шаблонов Groovy. Как вы увидите, создавать визуальные компоненты приложений с помощью этой умной среды очень просто.