На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

Программирование JDBC с помощью Groovy. Часть 1

Сделайте еще один шаг в освоении Groovy: Эндрю Гловер покажет, как использовать GroovySql для построения простого приложения для формирования отчетов. Объединяя в себе замыкания и итераторы, GroovySql облегчает программирование Java Database Connectivity (JDBC), перенося часть работы по управлению ресурсами на саму среду Groovy.

В предыдущих выпусках серии Практически Groovy мы открыли несколько очень интересных возможностей Groovy. Из первой статьи вы узнали, как применять Groovy для более простого и быстрого функционального тестирования обычного кода Java. Во второй статье вы увидели выразительные возможности, привносимые Groovy в сборки Ant. В этот раз вы узнаете еще об одном способе практического использования Groovy - а именно о том, как применить его для быстрого создания приложения, формирующего отчеты на базе SQL.

Обычно языки сценариев великолепно подходят для быстрого создания приложений, формирующих отчеты, но создание таких приложений с помощью Groovy явно выделяется даже на их фоне. Легкий синтаксис Groovy может частично компенсировать многословие JDBC в языке Java, но наиболее сильный эффект дают замыкания (closures), которые элегантно переносят ответственность за обработку с клиента на среду, где удержать вес значительно проще.

В статье этого месяца я дам краткий обзор возможностей GroovySql и покажу, как начать работу с ними, создав простое приложение для формирования отчетов. Чтобы вынести максимум пользы из обсуждения, вы должны быть знакомы с программированием JDBC на платформе Java. Кроме того, вы, вероятно, захотите освежить в памяти введение в замыкания в Groovy, опубликованное в прошлом месяце, поскольку здесь они играют важную роль.

Однако наиболее важным понятием в этом месяце будет итерирование, поскольку итераторы играют важную роль в расширении JDBC с помощью Groovy. Поэтому я начну с обзора методов итераторов в Groovy.

Введение в итераторы

Итерирование является одной из наиболее часто используемых и полезных тактик в ситуациях программирования всех типов. Итератор - это программная конструкция, которая позволяет обеспечить быстрый доступ к элементам данных, хранящимся в любой коллекции или контейнере, по одному за раз. Groovy расширяет понятие итераторов языка Java, делая их неявными и простыми в использовании. В листинге 1 показано, сколько усилий требуется для вывода на печать всех элементов коллекции String с помощью языка Java.

Листинг 1. Итераторы в обычном коде Java

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class JavaIteratorExample {
  public static void main(String[] args) {
     Collection coll = new ArrayList();
     coll.add("JMS");
     coll.add("EJB");
     coll.add("JMX");
     for(Iterator iter = coll.iterator(); iter.hasNext();){
        System.out.println(iter.next());
     }
  }
}

Из листинга 2 видно, как Groovy упрощает эти действия. Здесь я пропускаю интерфейс Iterator и использую методы типа итератора непосредственно на коллекции. Более того, методы итераторов Groovy допускают использование замыканий, которые будут вызываться для каждого цикла итерации. В листинге 2 показан приведенный выше пример на языке Java, трансформированный с помощью Groovy.

Листинг 2. Итераторы в Groovy

class IteratorExample1{
   static void main(args) {
     coll = ["JMS", "EJB", "JMX"]
     coll.each{ item / println item }
   }
}

Как вы могли увидеть, в отличие от обычного кода Java, Groovy управляет кодом итерирования, при этом позволяя мне указывать нужный режим работы. Тем самым Groovy аккуратно переносит ответственность за обработку ресурсов с меня на себя. Передача обработки ресурсов Groovy открывает широчайшие возможности. Это делает процесс программирования более простым и, следовательно, более быстрым.

Введение в GroovySql

Возможности SQL в Groovy реализованы в изящном интерфейсе API GroovySql. С помощью замыканий и итераторов GroovySql аккуратно переносит управление ресурсами JDBC с вас, разработчика, в среду Groovy. Тем самым программирование JDBC избавляется от громоздкости, и вы можете сконцентрироваться на запросах и их результатах.

На всякий случай, если вы забыли, с какими трудностями может быть связано обычное программирование JDBC на Java, я буду счастлив напомнить вам об этом! В листинге 3 вы можете увидеть простой пример программирования JDBC на языке Java.

Листинг 3. Программирование JDBC на обычном Java

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCExample1 {   public static void main(String[] args) {     Connection con = null;     Statement stmt = null;     ResultSet rs = null;     try{       Class.forName("org.gjt.mm.mysql.Driver");       con = DriverManager.getConnection("jdbc:mysql://localhost:3306/words",            "words", "words");       stmt = con.createStatement();       rs = stmt.executeQuery("select * from word");       while (rs.next()) {         System.out.println("word id: " + rs.getLong(1) +             " spelling: " + rs.getString(2) +             " part of speech: " + rs.getString(3));       }     }catch(SQLException e){       e.printStackTrace();     }catch(ClassNotFoundException e){       e.printStackTrace();     }finally{       try{rs.close();}catch(Exception e){}       try{stmt.close();}catch(Exception e){}       try{con.close();}catch(Exception e){}    }   } } 

Блеск. В листинге 3 содержится около 40 строк кода только для просмотра содержимого таблицы! Как вы думаете, сколько строк понадобится при использовании GroovySql? Если вы думаете, что их будет больше 10, вы ошибетесь. Посмотрите, как изящно Groovy позволяет мне сконцентрироваться на задаче - выполнении простого запроса - и управляет нужными ресурсами вместо меня, как видно в листинге 4.

Листинг 4. Добро пожаловать в GroovySql!

import groovy.sql.Sql class GroovySqlExample1{   static void main(args) {     sql = Sql.newInstance("jdbc:mysql://localhost:3306/words", "words",            "words", "org.gjt.mm.mysql.Driver")     sql.eachRow("select * from word"){ row /        println row.word_id + " " + row.spelling + " " + row.part_of_speech     }   } } 

Неплохо. Используя всего несколько строк, я создал код такой же функции, как и в листинге 3, не выполняя закрытия Connection, закрытия ResultSet или других привычных тяжеловесных процедур программирования JDBC. Если вы спросите моего мнения, я скажу, что это отличная вещь и достаточно простая. Теперь позвольте мне показать вам, как именно я сделал это.

Выполнение простого запроса

В первой строчке листинга 4 я создал экземпляр класса Sql Groovy, который используется для соединения с нужной базой данных. В этом случае я создал экземпляр Sql, указав на базу данных MySQL, работающую на моей машине. Пока все достаточно просто, не так ли? Но реальный нокаут нас ждет в следующей части, где итераторы и замыкания за один-два удара покажут всю свою мощь.

Можно рассматривать метод eachRow как итератор по результату переданного запроса. На более низком уровне можно представить себе возвращаемый объект JDBC ResultSet и его содержимое, передаваемое в цикл for. Таким образом, для каждой итерации выполняется переданное мной замыкание. Если в таблице word базы данных всего три строки, замыкание выполняется три раза, выводя значения word_id, spelling и part_of_speech.

Код упрощается еще больше путем отбрасывания из уравнения именованной переменной row и использования одной из скрытых переменных Groovy: it, которая становится экземпляром итератора. Если я сделаю это, указанный выше код будет записан так, как это показано в листинге 5.

Листинг 5. Переменная it Groovy в GroovySql

import groovy.sql.Sql
class GroovySqlExample1{
  static void main(args) {
    sql = Sql.newInstance("jdbc:mysql://localhost:3306/words", "words",
           "words", "org.gjt.mm.mysql.Driver")
    sql.eachRow("select * from word"){ println it.spelling +  " ${it.part_of_speech}"}
  }
}

В этом коде я смог отбросить переменную row и использовать вместо нее it. Кроме того, я могу ссылаться на переменную it в операторе String как это было с ${it.part_of_speech}.

Рекомендуем
Популярное
наверх