Ejemplo sencillo con SpringFramework DAO

De ChuWiki

Vamos a ver un ejemplo sencillo de cómo usar la capa DAO de Spring Framework. Nuestro programa de ejemplo símplemente mostrará por pantalla el contenido de una tabla de una base de datos MySQL.

Primero necesitamos la base de datos en la que pondremos una tabla e insertaremos varios registros:

mysql> create database prueba;
mysql> use prueba;
mysql> create table persona (id smallint auto_increment, nombre varchar(60), nacimiento date, primary key(id));
mysql> insert persona values (NULL, 'Pedro', '1995-09-12');
mydql> insert ...

En nuestro proyecto java, necesitaremos los .jar de Spring Framework y el conector con mysql. Una solución fácil es usar maven y añadir la dependencia en el fichero pom.xml (ver Proyecto Maven con Spring Framework)

Crearemos una clase Persona, con los atributos de los campos en base de datos: "id", "nombre" y "fechaNacimiento".

package com.chuidiang.pruebas.spring;

import java.text.SimpleDateFormat;
import java.util.Date;

/** 
 * Bean con los atributos correspondientes a los campos de la tabla de base
 * de datos.
 * @author chuidiang
 */
public class Persona {
	int id;
	String nombre;
	Date fechaNacimiento;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public Date getFechaNacimiento() {
		return fechaNacimiento;
	}
	public void setFechaNacimiento(Date fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}
	
	/** Para poder escribir el bean en pantalla de forma rápida */
	public String toString()
	{
		return ""+id+" "+nombre+" "+formateador.format(fechaNacimiento);
	}
	
	/** Para escribir las fechas en un formato más mejor */
	private static SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
}

En nuestro programa de ejemplo, primero obtenemos el equivalente Spring a una conexión con base de datos. Aunque hay muchas formas de hacerlo, incluyendo ficheros de configuración, vamos a hacer aquí una forma más inmediata, directamente en código. El equivalente Spring a la clase Connection es JdbcTemplate.

// Datos de conexion con la base de datos
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.gjt.mm.mysql.Driver");
dataSource.setUrl("jdbc:mysql://localhost/prueba");
dataSource.setUsername("root");
dataSource.setPassword("la-password");
    	
// La clase Spring con la Connection
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

Una vez que se obtiene la conexión, con el método query() de JdbcTemplate podemos hacer la consulta. A este método:

  • Le pasamos un String con la sentencia SQL de select.
  • Le pasamos una clase RowMapper encargada de instanciar una clase Persona, leer una fila del ResultSet resultante y devolver dicha clase Persona.
  • Devuelve una Collection rellena de Persona.

El código para esta consulta puede ser como el siguiente

// Realizacmos la consulta
Collection personas = jdbcTemplate.query(
   "select id,nombre,nacimiento from persona",
   new RowMapper() {
	@Override
	public Object mapRow(ResultSet rs, int arg1) throws SQLException {
	   // Se rellena un bean Persona a partir de la fila actual
	   // del ResultSet
    	   Persona persona = new Persona();
    	   persona.setId(rs.getInt("id"));
    	   persona.setNombre(rs.getString("nombre"));
    	   persona.setFechaNacimiento(rs.getDate("nacimiento"));
    	   return persona;
        });

y ya símplemente nos quedaría escribir en pantalla el contenido de la Collection. El código completo de este pequeño ejemplo puede ser el siguiente

package com.chuidiang.pruebas.spring;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

/**
 * Pequeño ejemplo de uso de acceso a base de datos con Spring DAO
 * 
 * @author chuidiang
 */
public class PruebaSpringDAO {
    /**
     * Consulta una tabla de base de datos y escribe en pantalla los registros
     * leídos.
     * 
     * @param args
     */
    public static void main(String[] args) {
        // Datos de conexion con la base de datos
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.gjt.mm.mysql.Driver");
        dataSource.setUrl("jdbc:mysql://localhost/prueba");
        dataSource.setUsername("root");
        dataSource.setPassword("la-password");

        // La clase Spring con la Connection
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        // Realizacmos la consulta
        Collection personas = jdbcTemplate.query(
                "select id,nombre,nacimiento from persona", new RowMapper() {

                    @Override
                    public Object mapRow(ResultSet rs, int arg1)
                            throws SQLException {
                        // Se rellena un bean Persona a partir de la fila actual
                        // del ResultSet
                        Persona persona = new Persona();
                        persona.setId(rs.getInt("id"));
                        persona.setNombre(rs.getString("nombre"));
                        persona.setFechaNacimiento(rs.getDate("nacimiento"));
                        return persona;
                    }
                });

        // Escribimos en pantalla los datos leidos
        for (Object persona : personas) {
            System.out.println(persona.toString());
        }
    }
}