Groovy permite interactuar con bases de datos a través de SQL, de manera muy simple. Como Groovy puede utilizar clases de Java, tenemos acceso a todos los drivers JDBC para conectarse a la base de datos.
El primer paso es realizar la conexión. Las clases de Groovy para manipulación de bases de datos se encuentran en el paquete groovy.sql. La clase más importante es groovy.sql.Sql, que nos permite conectarnos a una base de datos y ejecutar consultas y comandos SQL.
Para realizar la conexión escribimos:
import groovy.sql.Sql sql = Sql.newInstance("jdbc:derby://localhost:1527/travel", "travel", "travel", "org.apache.derby.jdbc.ClientDriver")
El método Sql.newInstance() se encarga de realizar una conexión a la base de datos. Recibe cuatro parámetros:
En este ejemplo nos estamos conectando a una base JavaDB a la base de datos "travel" de ejemplo.
Con el objeto sql ya podemos comenzar a realizar consultas.
Para ejecutar un query y procesar todas sus filas podemos usar el método eachRow de Sql. En el siguiente ejemplo imprimos por consola algunas columnas de un query:
sql.eachRow("select * from PERSON", { println "ID: ${it.personId}, Nombre: ${it.name}"} );
El primer parámetro de eachRow() es el query SQL a ejecutar. El segundo parámetro es un closure donde la variable it representa la fila que se está procesando. Se puede acceder a las columnas de la fila como si fuera un map. En este ejemplo se imprimen las columnas "personId" y "name" de la tabla PERSON.
También pueden usarse alias para indicar el nombre de las columnas, y de esta manera podremos accederlas con nombres más claros. Por ejemplo, podemos reescribir la consulta anterior:
sql.eachRow("select personId as id, name as nombre from PERSON", { println "ID: ${it.id}, Nombre: ${it.nombre}"} );
Muchas veces sólo interesa procesar la primer fila de un query. Esto puede hacerse de manera muy simple:
row = sql.firstRow("select personid as id, name as nombre from PERSON") println "Columna personid = ${row.id} y la columna nombre = ${row.nombre}"
El método firstRow() devuelve un objeto row que representa la fila en cuestión. Igual que en el caso anterior, podemos acceder a las columnas utilizando el nombre de las mismas sobre el objeto row.
Por supuesto que también podemos ejecutar comandos SQL varios, como INSERT, UPDATE y DELETE. Para esto se utiliza el método execute(). Por ejemplo:
id = 9999 nombre = "Invasor Zim" //Podemos ejecutar querys complejos, como ser borrar un registro sql.execute("delete from PERSON where personid = ?", [id]) //O insertar... sql.execute("insert into PERSON (personid, name) values (?,?)", [id, nombre]) //y lo borramos otra vez... sql.execute("delete from PERSON where personid = ?", [id])