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 не хотелось. Вобщем, код работает, коллега бодро пишет скрипт :)
Tweet
Видно мои заметки не прошли даром – хоть кого-то, да удалось заставить обратить внимание на Groovy.
Единственное что хотелось добавить: первое замыкание (то, что является параметром sql.eachRow) лучше было бы переписать таким образом:
[java] it.mydata.eachMatch(/\\S+/) {num -> if (num.length != 9) errFile.append(token + "\\n") outFile.append(num+"\\n") } [/java]