Магия Groovy и SQL

Новая заметка, о том как можно упростить и ускорить тестирование баз данных. Начну с описания примерной ситуации, в которой может пригодиться данный подход. Скажем, есть у вас схема базы данных и вы перед стартом приложения, хотите проверить целостность базы данных и находящихся в ней данных. Для этого можно использовать различные подходы, я покажу один из них. В показаном примере используется Groovy. Лично для меня, он привлекателен тем, что некоторые вещи можно делать проще и быстрее. К примеру я уже показывал здесь как быстро и просто прочитать данные из url. Итак приступим к делу, в примере ниже, я покажу как соедениться с базой данных SQLite. Итак открываем Groovy Console и пишем:

@Grapes([
 @Grab(group='org.xerial',module='sqlite-jdbc',version='3.7.2'),
 @GrabConfig(systemClassLoader=true)
])

import java.sql.*
import org.sqlite.SQLite
import groovy.sql.Sql

//Class.forName("org.sqlite.JDBC")

def sql = Sql.newInstance("jdbc:sqlite:sample.db", "org.sqlite.JDBC")

sql.execute("drop table if exists person")
sql.execute("create table person (id integer, name string)")

def people = sql.dataSet("person")
people.add(id:1, name:"leo")
people.add(id:2,name:'yui')

sql.eachRow("select * from person") {
  println("id=${it.id}, name= ${it.name}")
}

result:
id=1, name= leo
id=2, name= yui

Вот так вот, всего пару строк, котрые позволяют создать таблицу, заполнить ее данными и извлечь их. Пойдем еще дальше, так как груви консоль - это инструмент "поиграться". Берем более серъезные инструменты Groovy + Spock Framework.Базы данных H2.

Создаем тестовый класс:

import groovy.sql.Sql
import spock.lang.Shared
import spock.lang.Specification

class DatabaseDrivenSpec extends Specification {
    @Shared
            sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver")

    // insert data (usually the database would already contain the data)
    def setupSpec() {
        sql.execute("""
                        CREATE TABLE employees
                        ( employee_number number(10) not null,
                          employee_name varchar2(50) not null,
                          salary number(6),
                          CONSTRAINT employees_pk PRIMARY KEY (employee_number)
                        );
                    """
        );

sql.execute("INSERT INTO employees (employee_number, employee_name, salary) VALUES (1001, 'Sally Johnson', 32000);")
    }


    def "employees test"() {
        expect:
        employee_number == 1001
        employee_name == "Sally Johnson"
        salary == 32000

        where:
        [employee_number, employee_name, salary] << sql.rows("select * from employees")
    }
}

Можно очень легко читать .sql файлы.

String query = new File('insert.sql').text
sql.execute(query)

Вот так вот, мы очень легко и понятно можем обращаться с данными используя Groovy SQL.