Mostrando entradas con la etiqueta groovy. Mostrar todas las entradas
Mostrando entradas con la etiqueta groovy. Mostrar todas las entradas

sábado, 27 de abril de 2013

Bases de datos y Groovy.

El tratamiento de bases de datos en cualquier lenguaje es algo básico. A continuación presento un ejemplo sencillo realizado con Groovy. Hay que destacar que el manejo de bases de datos en java está muy conseguido gracias a frameworks como hibernate, jpa, etc. No obstante creo que conocer esta opción no está de más :D


Pasos previos

He creado un proyecto en Eclipse con el plugin comentado en el anterior post.

En postgres he creado una base de datos vacía. Le he dado acceso al usuario postgres/postgres para que pueda interactuar con la bd.

Como en cualquier programa, lo primero que tenemos que hacer es establer la conexión con la base de datos. El paquete groovy.sql contiene la clase Sql, que es la que nos permite operar contra bases de datos.

En concreto para obtener un conexión nos hace falta el método newInstance. Entre las implementaciones disponibles, la más cómoda en mi opinión es newInstance(url,user,password,driverClassName) throws SQLException, ClassNotFoundException

Los parámetros son evidentes:

url:
Es la url a la bd a la que nos vamos a conectar, en formato jdbc:subprotocol:subname
user:
Usuario de la base de datos con los permisos necesarios.
password:
La contraseña del usuario.
driverClassName:
Nombre del driver.

Esta clase devuelve una instancia de la conexión, con la que ya podremos comunicarnos. Lanza dos tipos de excepciones:

SQLException:
Cualquier tipo de error al interactuar con la base de datos, por ejemplo si el usuario no existe, o no tiene permisos, etc.
ClassNotFoundException:
Si no se ha podido obtener la clase del driver de conexión. Vamos, que no hemos incluido la librería necesaria o que no hemos puesto bien el nombre de la misma.

Obteniendo la conexión

Mi ejemplo va a ser muy sencillo. Voy a crear una clase llamada OperacionesBD.groovy. La cual en el constructor realiza la conexión, y mediante el resto de métodos interactúa con la base de datos.

De esta forma el constructor queda:


public OperacionesBD(String urljdbc, String usuario, String password) {
  super();
  this.connection = Sql.newInstance(urljdbc,usuario,password,Constantes.JDBC_DRIVER);
 }

siendo connection un atributo:

private Sql connection;

Insertando datos

Para ejecutar instrucciones la clase Sql dispone del método execute. Los dos siguientes métodos crean una tabla y insertan valores en ella:


 public void createTablePersons(){
  connection.execute(Constantes.TABLE);
 }



 public void insertValueTest(){
  connection.execute(Constantes.INSERT,[1,'Carlos','M']);
  connection.execute(Constantes.INSERT,[2,'Juan','M']);
  connection.execute(Constantes.INSERT,[3,'María','F']);
  connection.execute(Constantes.INSERT,[4,'Elena','F']);
  connection.execute(Constantes.INSERT,[5,'Pedro','M']);
  connection.execute(Constantes.INSERT,[6,'Rosa','M']);
 }


Mostrando u obteniendo datos

Con el método eachRow se puede iterar sobre los resultados de la consulta sql. El método showFemales imprime en consola todas las mujeres de la tabla person.

 public void showFemales(){
  connection.eachRow(Constantes.FEMALES, {
   println "id: ${it.id}, Nombre: ${it.name}"
   } );
 }

Por consola obtenemos:

 id: 3, Nombre: María
 id: 4, Nombre: Elena
 id: 6, Nombre: Rosa

El método getFemales devuelve una lista de maps con la consulta para realizar un tratamiento posterior.

 public List < Map < Integer,String > > getFemales(){
  List < Map > l = new LinkedList< Map >();
  connection.eachRow(Constantes.FEMALES, {
      Map < Integer,String > m = new HashMap < Integer,String >();
      m.put(it.id.toInteger(), it.name.toString());
      l.add(m);
      } );
  return l;
 }

Actualizando datos

La actualización de datos es bastante sencilla con executeUpdate:

 
public void update(int id, String newName){
  connection.executeUpdate(Constantes.UPDATE, [newName,id]);
 }

Pues esto es todo para este post. A continuación pongo las clases completas del ejemplo.

Fichero de constantes - Constantes.java


package es.test;

public class Constantes {

 protected static String JDBC_DRIVER = "org.postgresql.Driver";
 
 protected static String JDBC_URL = "jdbc:postgresql://localhost:5432/GroovyTest";
 
 protected static String DROP =  "DROP TABLE IF EXISTS  person";
 
 protected static String TABLE = "CREATE TABLE \"person\" "+
       "("+
        " id integer NOT NULL,"+
        " \"name\" character varying(30),"+
        " gender character(1),"+
        " CONSTRAINT pk PRIMARY KEY (id) "+
        ")";

 protected static String INSERT = "INSERT INTO person(id,name,gender)  VALUES (?,?,?)";

 protected static String FEMALES = "SELECT * FROM person WHERE gender = 'F'";
 
 protected static String UPDATE = "UPDATE person SET name=? WHERE id=?";
}

Lógica Groovy - OperacionesBD.groovy


package es.test

import groovy.sql.Sql;

public class OperacionesBD {

 
 private Sql connection;

 
 public OperacionesBD(String urljdbc, String usuario, String password) {
  super();
  
  this.connection = Sql.newInstance(urljdbc,usuario,password,Constantes.JDBC_DRIVER);
  connection.execute(Constantes.DROP);
 }
 

 
 public void createTablePersons(){
  connection.execute(Constantes.TABLE);
 }
  
 public void insertValueTest(){
  connection.execute(Constantes.INSERT,[1,'Carlos','M']);
  connection.execute(Constantes.INSERT,[2,'Juan','M']);
  connection.execute(Constantes.INSERT,[3,'María','F']);
  connection.execute(Constantes.INSERT,[4,'Elena','F']);
  connection.execute(Constantes.INSERT,[5,'Pedro','M']);
  connection.execute(Constantes.INSERT,[6,'Rosa','F']);
 }
 
 
 public void showFemales(){
  connection.eachRow(Constantes.FEMALES, {
      println "id: ${it.id}, Nombre: ${it.name}"
      } );
 }
 
 
 public List < Map < Integer,String > > getFemales(){
  List < Map > l = new LinkedList< Map >();
  connection.eachRow(Constantes.FEMALES, {
     Map < Integer,String > m = new HashMap < Integer,String >();
     m.put(it.id.toInteger(), it.name.toString());
     l.add(m);
     } );
  return l;
 }
 
 
 public void update(int id, String newName){
  connection.executeUpdate(Constantes.UPDATE, [newName,id]);
 }
 

}

Clase principal para probar el ejemplo - Main.java

package es.test;

import java.util.List;
import java.util.Map;

public class Main {

 /**
  * @param args
  */
 public static void main(String[] args) {

  OperacionesBD obd = new OperacionesBD(Constantes.JDBC_URL, "postgres", "postgres");
  
  obd.createTablePersons();
  
  obd.insertValueTest();
  
  obd.showFemales();
  
  List < Map < Integer,String > > l = obd.getFemales();
  
  for(Map < Integer,String > item:l){
   System.out.println(item.toString());
  }
  
  obd.update(6, "Rosa Rosae");
  
  obd.showFemales();  
 }
}

Y por último os comento que el código fuente completo se puede bajar de mi repositorio público de Git.


Referencias

La idea de este post surgió por un problemilla con Groovy, que solucioné gracias a este enlace.

Saludos.

sábado, 9 de febrero de 2013

Hola mundo con Groovy

Tanto oir hablar de Groovy, y yo aún no había podido trabajar con él. Así que me he puesto manos a la obra a ver si hacía un hola mundo en condiciones.

¿Y Groovy que puñetas es? pues es un lenguaje de scripting para java que está disponible en la especificación JSR 241: The Groovy Programming Language.

Para poder usar Groovy con eclipse, hay que bajarse el plugin que se encuentra aquí.

La instalación se realiza como en todos los plugins de eclipse.

Instalación del plugin de Groovy en eclipse.

Lo primero que me ha tocado las narices de esta instalación es que después de instalar el plugin, tras reiniciar eclipse, he obtenido un bonito error Could not create the Java virtual machine.

Could not create the Java virtual machine. Después de instalar el plugin de Groovy en eclipse.

El problema es que tras la instalación del plugin, el eclipse.ini fue modificado. Concretamente se afectaron las líneas de la versión de java y las que referencian al directorio de java. ¡WTF!.

-Dosgi.requiredJavaVersion=1.6

La solución la encontré en este post.

Y mi pregunta, ¿por qué hizo esto el plugin?. A ver si alguien me lo aclara.

Pasado el susto, es hora de seguir con cosas más interesantes. Una vez instalado el plugin y corregido el error, voy a realizar un HolaMundo en groovy que leerá un archivo XML y mostrará en consola varios valores.

El Xml a leer:



  
   1
   Carlos G. González
   Sin ley
   
  
  
   2
   M. Rajoy
   
   Mamoncete
  
  
   3
   ZP
   
   Engañabobos
  

El primer paso será crear un proyecto groovy con una única clase de ejemplo (ReadXmlPersons.groovy).

package es.test

class ReadXmlPersons {

 static main(args) {
 
   
  def personas = new XmlSlurper().parse(new File("C:/compartido/personas.xml"))
  
  personas.persona.nombre.each( 
         { println it }
         )
 }

}

Si ejecutamos esta clase vemos que se muestra en consola lo que queremos.

Esto ha molado bastante, ya que la lectura del XML se ha simplificado mucho, por lo menos si lo comparamos con JAXB. ¿Y si lo adaptamos a nuestras necesidades?

Si modificamos la clase groovy anterior, podemos encapsular los valores en una lista. Después podemos hacer una clase java que lea esa lista y los muestre por consola.

La clase groovy quedaría:

package es.test

class ReadXmlPersons {

 public static List < String > getNombres(){
  
  List < String > l = new LinkedList< String >();
  
  def personas = new XmlSlurper().parse(new File("C:/compartido/personas.xml"))
  
  personas.persona.nombre.each(
         { l.add(it) }
         )
  
  return l;
  
 }
 
 static main(args) {
 }

}

Y la clase java:

package es.test;

import java.util.List;

public class Main {

 /**
  * @param args
  */
 public static void main(String[] args) {

  List< String > l =  ReadXmlPersons.getNombres();
  
  System.out.println(l);
  
 }

}

Bueno, pues yo creo que como HolaMundo está bastante bien. A ver si tengo un poco más de tiempo para darle caña a Groovy y hacer cosas más interesantes.

Saludos.

Related Posts Plugin for WordPress, Blogger...