Si me engañas una vez, tuya es la culpa. Si me engañas dos, la culpa es mía
ANAXÁGORAS de CLAZOMENE

Variables en procedimientos de SQL (sentencias DECLARE, SET)

Se puede ampliar la información al respecto en IBM.

– declarar variables

declare @id numeric(19,0)

 

– para asignar valores a vabiables

set @id=1

select @id=max (id)+1 from permisos

 

 

Insertar varios registros con 1 sentencia Insert

Queremos añadir a una tabla que relaciona alumnos con profesores toda una clase nueva en la que los alumnos cuyo apellidos empiezan por A con el profesor con el id 9.

Debemos utilizar una sentencia insert para cada alumno ? o una para todos ?

Mejor lo último no ;)

insert into relAlumnosProfesores

select

id, 9

from

alumnos

where

apellido1 like ‘%A’

Spring, Struts 1.3.8, JDBC y MySQL

Vaya combinación, ya se va complicando el tema. Ahora que ya tenemos un servidor de base de datos MySQL disponible, queremos utilizarlo en nuestros proyectos web. Para ello partiremos del proyecto que ya hemos desarrollado integrando Spring con Struts 1.3.8, al que añadiremos una capa de persistencia utilizando JDBC (Java DataBase Connectivity).

Diseño

A la hora del diseño, vamos a desarrollar varias capas de persistencia y a la hora de desplegar nuestro proyecto utlizaremos la que más nos convenga.

  • Una primera capa de cartón piedra (es más profesional utilizar los términos mock o fake), es decir con los datos a fuego, que es como estaba en el ejemplo. Se utliza profesionalmente más de lo que parece porque resulta frecuente empezar el desarrollo sin disponer de una base de datos (por problemas de conectividad, licencias…) o desarrollando en paralelo con otro equipo que se encargue de la base de datos.
  • En este ejemplo utlizaremos una para MySQL con JDBC.
  • Más adelante utlizaremos para MySQL el framework iBATIS.
  • Y más adelante aún utlizaremos para MySQL el framework Hibernate.

Creamos los nuevos paquetes :

  • es > lycka > holamundo > persistencia > impl > cartonpiedra
  • es > lycka > holamundo > persistencia > impl > mysql > jdbc
  • es > lycka > holamundo > persistencia > impl > mysql > ibatis
  • es > lycka > holamundo > persistencia > impl > mysql > hibernate

Movemos las clases que ya teníamos (BaseDAOImpl y IdentificarDAOImpl) al paquete cartonpiedra. Creamos dos nuevas clases en el paquete jdbc, BaseDAOImpl y IdentificarDAOImpl (que extienda del nuevo BaseDAOImpl e implemente el interfaz IdentificarDAO). A la izquierda se ve la estructura que quedaría.

Conector MySQL

Descargamos el conector MySQL de la página de sun aquí, e importamos el jar (mysql-connector-java.jar) en nuestro proyecto.

Obtener una conexión

Creamos un nuevo método en nuestro nuevo BaseDAOImpl, establecerConexion.

protected Connection establecerConexion (String URL, String usuario, String contrasenna) throws Exception {

Connection conn = null;

try {

Class.forName(“com.mysql.jdbc.Driver”);

conn = DriverManager.getConnection (URL, usuario, contrasenna);

log.info(“establecerConexion – INFO – Conexión Establecida con\n -> URL = “ + URL + “\n -> USUARIO = “ + usuario);

} catch (Exception e) {

log.error(“establecerConexion – ERROR – Conexión no Establecida con “ + URL);

throw e;

}

return conn;

}

Cerrar una conexión

Creamos un nuevo método también en el nuevo BaseDAOImpl, cerrarConexión.

protected void cerrarConexión (Connection conn, String URL) {

try {

if (conn != null) {

conn.close();

log.info(“cerrarConexión – INFO – Conexión cerrada con “ + URL);

}

} catch (Exception e) {

log.error(“cerrarConexión – WARNING – No se puede cerrar la conexión con “ + URL);

e.printStackTrace();

}

}

Utilizar la conexión

En este ejemplo simple crearemos una conexión en cada petición, ejecutaremos la consulta y cerraremos la conexión. Profesionalmente se debería de utilizar un pool de conexiones, lo dejaré para otra entrada.

package es.lycka.holamundo.persistencia.impl.mysql.jdbc;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import es.lycka.holamundo.model.Usuario;

import es.lycka.holamundo.persistencia.IdentificarDAO;

public class IdentificarDAOImpl extends BaseDAOImpl implements IdentificarDAO {

public Usuario consultarUsuario (Usuario usuario) throws Exception {

String URLBBDD = “jdbc:mysql://localhost/holamundo”;

String usuarioBBDD = “root”;

String contrasennaBBDD = “superfeo”;

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

String query = “SELECT IDENTIFICADOR, CONTRASENNA “ +

“FROM USUARIO “ +

“WHERE IDENTIFICADOR = ? AND CONTRASENNA = ?”;

Usuario resultado = null;

try {

conn = establecerConexion (URLBBDD, usuarioBBDD, contrasennaBBDD);

ps = conn.prepareStatement(query);

ps.setString ( 1, usuario.getIdentificador());

ps.setString ( 2, usuario.getContrasenna());

rs = ps.executeQuery();

while ( rs.next() ) {

resultado = new Usuario ();

resultado.setIdentificador(rs.getString(“IDENTIFICADOR”));

resultado.setContrasenna(rs.getString(“CONTRASENNA”));

}

rs.close();

} catch (Exception e) {

throw e;

} finally {

cerrarConexión(conn, URLBBDD);

}

return resultado;

}

}

Acoplar la nueva implementación

Configuramos el fichero para inyectar los nuevos beans applicationContext-persistencia.xml:

<beans>

<bean id=“dao” class=“es.lycka.holamundo.persistencia.impl.mysql.jdbc.BaseDAOImpl” abstract=“true” />

<bean id=“identificarDAO” class=“es.lycka.holamundo.persistencia.impl.mysql.jdbc.IdentificarDAOImpl” parent=“dao”/>

</beans>

Para saber más

Empezamos con Bases de Datos

En esta entrada pretendo introducir al lector en las bases de datos para seguir avanzando en posteriores entradas para explicar cómo acceder a ellas desde Java, primero con JDBC y luego con frameworks como iBATIS e Hibernate.

Resulta muy común utilizar mal el término base de datos cuando en realidad nos referimos a un Sistema de Gestión de Base de Datos (SGBD o DBMS en inglés). Sin ir más lejos el título de esta entrada es un ejemplo de  este mal uso comunmente aceptado.

Un SGBD es un software que sirve de interfaz entre las bases de datos y las aplicaciones que las utilizan. Los más populares son MySQL entre los gratuitos (aunque ahora existe una versión de pago) y Oracle entre los de pago.

Una base de datos (database en inglés, habitualmente abreviado BBDD) es un conjunto de datos relacionados almacenados. Una biblioteca es por tanto una base de datos, pero evidentemente en nuestro contexto nos referimos a bases de datos en formato digital.

Para las siguientes entradas utilizaré MySQL, aunque desde la parte Java resulta un poco indiferente especialmente con un diseño adecuado en capas : aislando la persistencia en una capa de persistencia, y si queremos declarando un interfaz y su implementación por si fuese necesario migrar a otro SGBD como Oracle.

Desplegar un servidor MySQL

Nos vamos al site de Sun Microsystems y descargamos la última versión gratuita disponible de MySQL, en este caso la 5.1.

Instalar la BBDD (el servidor de MySQL) no tiene mayor misterio, se hace como cualquier programa. Después de instalar se nos da la opción de configurar el servidor de MySQL.

Primero debemos decidir qué tipo de servidor utilizaremos, una máquina de desarrollo, como servidor o como servidor dedicado. Esta elección influye en los recursos que utilizará; nosotros la utilizaremos como máquina de desarrollo.

Después nos pregunta el tipo de BBDD, de propósito general, sólo transaccional o no transaccional. Una transacción es un conjunto de órdenes que se ejecuta como una unidad de trabajo indivisible : para que la unidad de trabajo se complete correctamente se deben completar todas sus tareas correctamente; si cualquier tarea se ejecuta incorrectamente la transacción falla y se deshacen las tareas previas. Las transacciones son muy útiles para mantener la integridad de los datos. Nosotros elegiremos de propósito general.

Ahora elegimos la ruta para almacenar físicamente los datos.

Indicamos el número de usuarios concurrentes (es decir, simultáneos) que esperamos tener. Como será para pruebas elegimos la opción por defecto (20 conexiones).

Configuramos las opciones de red. Para nosotros nos será suficiente las opciones por defecto.

Llegamos al conjunto de caracteres. Latin1 o UTF8 son los más corrientes pero también podemos personalizar nuestra elección. Para nuestro idioma nos vale Latin1.

Ahora nos pregunta si queremos instalarlo como servicio de Windows e incluirlo en el path. Eso ya a vuestra elección.

Llegamos al usuario administrador, introducimos una contraseña para él. No recomiendo utilizar cuentas anónimas porque profesionalmente no se utilizan nunca, creo.

Et voilá, ya tenemos un servidor instalado y configurado.

Administrando la base de datos

Prueba a ejecutar la consola (Inicio > Todos los programas > MySQL > MySQL Server 5.1 > MySQL Command Line Client), y metemos la contraseña de administrador.

El comando “help;” resolverá casi todas tus dudas. “show databases;” nos mostrará las bases de datos actuales. “create database holamundo;” nos creará una nueva base de datos llamada holamundo que podremos utilizar para nuestros ejemplos futuros. “use database holamundo;” nos permite utilizar la base de datos ;con “show tables;” vemos las tablas que contiene, y con ANSI SQL podemos consultar, crear, modificar o eliminar tanto tablas como datos.

Errar es humano: Fallo tonto de diseño

Bueno, todos cometemos errores, es humano… los sabios rectifican, los inteligentes aprenden de ellos.

Siempre hay un proyecto de mucho trabajo, poca información de entrada y menos tiempo para su desarrollo… de las pruebas ("pruebas" será algún vocablo del chino mandarín ?) ni hablemos. Desde luego el sobre-esfuerzo no forma parte de mi vocabulario. No son las mejores circunstancias para realizar un buen trabajo. Y es en estos proyectos en los que se suele cometer errores.

Aquí me gustaría resaltar un error tonto y de poca importancia, que ha podido ser fácilmente subsanado.

En una tabla almacenamos información de un determinado objeto (por ejemplo, de las ñapas que hemos hecho en una aplicación), recopilado de esquemas y tablas distintas. Con esa información generamos un informe en formato pdf, que almacenamos en otra tabla, una distinta para cada aplicación. Por lo tanto, en nuestra primera tabla debemos guardar la referencia al informe, es decir el identificador del LOB dentro de la tabla de LOBs, para poder recuperar el informa asociado a la ñapa. Lógico no ?

Pues sí, se nos olvidó guardar también el nombre de la tabla en la que se almacena el LOB…

Comenta