Groovy работа с базой

Рубрика: Development, Groovy, Java | 28 August 2007, 16:27 | juriy

Сегодня возникла простая задачка: необходимо было выбрать из базы фрагменты строк, которые соответствовали некоторым признакам. Коллега засучив рукава принялся писать громоздкий SQL запрос, который то и дело работал не так как надо. В таких случаях я пишу небольшие Java программки, которые решают проблему.

Сегодня у меня возникло желание научить коллегу писать подобные решения, но объяснять человеку как скомпилировать класс, подключить в classpath JDBC драйвера, почему нужно ловить исключения, открывать и закрывать потоки для записи файла, использовать промежуточный объект Statement не было времени.
Именно тогда я решил испытать Groovy. Каюсь, после груды статей Вадима про Groovy я удосужился попробовать этого зверя только сейчас. Идея была в следующем: написать каркасс приложения для человека, который практически не работал с Java и показать, как можно обрабатывать данные, полученные из базы.

Пара минут ушла на то, чтобы подключится к базе.

[java]import groovy.sql.Sql
def query = "select * from myschema.mytable";

def tns = "нее, пожалуй настройки TNS публиковать не буду";

def sql = Sql.newInstance(tns, "имя пользователя",
        "и пароль - тоже", "oracle.jdbc.driver.OracleDriver")

sql.eachRow(query) {
  println "Value: ${it.myfield}";
}[/java]

“Довольно лаконично”, – подумал я и продолжил. Действительно с этим кодом сможет разобраться даже человек не знакомый с Java.

Теперь осталось мелочи, распарсить выбранные данные и сохранить в текстовый файл. При чем данные которые не соответствуют критерию “правильности” надо записать в другой файл:

[java]import groovy.sql.Sql
def outFile = new File('out.txt')
def errFile = new File('err.txt')

def query = "select * from myschema.mytable";
def tns = "нее, пожалуй настройки TNS публиковать не буду";

def sql = Sql.newInstance(tns, "имя пользователя",
       "и пароль - тоже", "oracle.jdbc.driver.OracleDriver")
sql.eachRow(query) {
  StringTokenizer tokenizer = new StringTokenizer(it.mydata, " ", false);
  while (tokenizer.hasMoreElements()) {
    String token = tokenizer.nextToken()
    if (token.length() != 9) {
      errFile.append(token + "\\n")
    }
    outFile.append(token + "\\n")
  }
}[/java]

У меня сильное ощущение что тот же код можно переписать проще, но лезть в дебри Groovy не хотелось. Вобщем, код работает, коллега бодро пишет скрипт :)

Пока один комментарий

One Response to “Groovy работа с базой”

Комментарии:

  1. vadim

    Видно мои заметки не прошли даром – хоть кого-то, да удалось заставить обратить внимание на Groovy.
    Единственное что хотелось добавить: первое замыкание (то, что является параметром sql.eachRow) лучше было бы переписать таким образом:

    [java]
    it.mydata.eachMatch(/\\S+/) {num ->
      if (num.length != 9)
        errFile.append(token + "\\n")
      outFile.append(num+"\\n")
    }
    [/java]

Leave a Reply