Desarrollando una aplicación con Vaadin Framework + Add-on Vaadin SQLContainer + Microsoft SQL Server 2008 R2
En este tutorial os presento una sencilla aplicación utilizando el Framework Vaadin y su Add-on SQLContainer para la gestión y el acceso a bases de datos.
El objetivo es realizar la configuración de la conexión a la base de datos, una consulta SQL y mostrar su resultado por el navegador.
Hardware utilizado:
- Portátil MacBook Pro 13" (2,5 Ghz Intel Core i5, 16 GB DDR3)
- Sistema Operativo: Mac OS X 10.8.2
Software requerido:
- Eclipse JEE Indigo https://www.eclipse.org/downloads/
- Vaadin Plug-in for Eclipse https://vaadin.com/addon/vaadin-plug-in-for-eclipse
- Vaadin 6.8.6
- Add-on Vaadin SQLContainer 1.1.0 https://vaadin.com/addon/vaadin-sqlcontainer
- MS SQL Server 2008 R2
- Controlador JDBC de Microsoft SQL Server 3.0 https://www.microsoft.com/es-es/download/details.aspx?id=21599
- Servidor web Jetty v9 (plugin para Eclipse) https://www.eclipse.org/jetty/
El desarrollo de sofware empresarial JavaEE con el Add-on SQLContainer de Vaadin es el más sencillo que se puede realizar mediante Vaadin Framework pero no por ello menos importante. Existen add-0n's desarrollados por la comunidad de desarrolladores de Vaadin, pero también existen una serie de ellos que están certificados por la propia compañía, como es el caso de SQLContainer.
Admite dos tipos de acceso a base de datos. Usando TableQuery, nos permitirá mediante consultas generadas pre-hechas buscar, actualizar e insertar datos directamente desde el contenedor en una tabla de la base de datos (de forma automática), mientras que FreeformQuery nos permitirá utilizar nuestra propia consulta, normalmente más compleja, para buscar datos y nuestras propias opciones para escribir, filtrar así como establecer el control de la carga cuando las consultas devuelven muchos resultados.
Además de las opciones de configuración de la conexión con la base de datos, Vaadin SQLContainer también extiende la interfaz para implementar reglas de filtrado más avanzados contra la base de datos. Por último, el Add-on también ofrece un pool de conexiones para JDBC (SimpleJDBCConnectionPool) y otro para JavaEE (J2EEConnectionPool), así como el soporte integrado para transacciones; el modo auto-commit también se proporciona.
Actualmente las BD soportadas por SQLContainer y TableQuery por defecto son:
- HSQLDB [1.8 o posterior]
- MySQL [5.1 o posterior]
- PostgreSQL [8.4 o posterior]
- Oracle Database [10g o posterior]
- Microsoft SQL Server [2005 o posterior]
Comencemos:
PASO 1:
En esta ocasión he utilizado SQL Server 2008 R2. Creamos una tabla muy sencilla con unos datos de ejemplo.
CREATE TABLE Prueba (id INT PRIMARY KEY, nombre nvarchar (50)) INSERT INTO Prueba VALUES(1, 'Contacto 1'); INSERT INTO Prueba VALUES(2, 'Contacto 2'); INSERT INTO Prueba VALUES(3, 'Contacto 3'); INSERT INTO Prueba VALUES(4, 'Contacto 4'); INSERT INTO Prueba VALUES(5, 'Contacto 5'); |
PASO 2:
Creación de un proyecto Vaadin desde Eclipse, seguid los pasos descritos en este enlace.
PASO 3:
Copiamos los .jar del controlador JDBC y del Add-on en el proyecto dentro de la siguiente carpeta WEB-INF/lib.
PASO 4:
En la clase principal extendida Application creada automáticamente al generar el proyecto en este caso llamada EjemploVaadinAplicacion.java escribimos el siguiente código (observar que está comentado).
package com.vaadin.demo.ejemplovaadin; import com.vaadin.Application; import com.vaadin.ui.*; import java.sql.*; import com.vaadin.addon.sqlcontainer.SQLContainer; import com.vaadin.addon.sqlcontainer.connection.SimpleJDBCConnectionPool; import com.vaadin.addon.sqlcontainer.query.FreeformQuery; public class EjemploVaadinAplicacion extends Application { @Override public void init() { Window mainWindow = new Window("Consulta demo Vaadin"); SimpleJDBCConnectionPool connectionPool; Table table = null; try { connectionPool = new SimpleJDBCConnectionPool("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://direccionDelServidor:1433;databaseName=nombreBaseDatos;", "usuario", "contraseña", 2, 5); SQLContainer container = null; container = new SQLContainer(new FreeformQuery("SELECT * FROM Prueba" , connectionPool)); table = new Table(null, container); //Establecemos el tamaño de Grid table.setWidth("100%"); //Ocupa todo el ancho del navegador table.setHeight("170px"); //Altura del Grid. //Opciones en la selección del Grid table.setSelectable(true); //Hacemos que se puedan seleccionar las filas del Grid. table.setMultiSelect(true);//Selección de múltiples filas del Grid. table.setContainerDataSource(container); //Establecemos el nombre de las cabeceras de las columnas table.setColumnHeaders(new String[] { "ID Contacto", "Nombre Contacto" }); } catch (SQLException e){ System.out.println("SQL Exception: "+ e.toString()); } mainWindow.addComponent(table); setMainWindow(mainWindow); } } |
PASO 5:
Y el resultado es el siguiente:
Enlaces de interés y bibliografía consultada:
Pagina oficial https://vaadin.com
Libro oficial https://vaadin.com/book
Capítulo Vaadin SQLContainer https://vaadin.com/book/-/page/sqlcontainer.html
Post relacionados:
Buenas Carlos,
Me alegra saber que hay más españoles utilizando vaadin, y gente como tú aportando información 😉 Soy de Almería y llevo un tiempo desarrollando en vaadin, ahora estoy viendo el tema de los SQLContainer y no consigo la forma de sincronizar automáticamente el SQLContainer cuando hago un cambio en la BD en un sistema externo. ¿Hay alguna forma para establecer el sincronismo como en AJAX?.
Saludos!
Hola Cristian.
Por lo que me comentas, quizá tengas que “forzar” a refrescar (método refresh() ) el SQLContainer aunque según dice el manual de Vaadin se refresca automáticamente aunque hay alguna excepción.
También puedes probar si es una Table donde no ves los cambios efectuados una vez lo hayas hecho en la BD, a ejecutar de nuevo la consulta y asignar de nuevo a la Table el SQLContainer, esto te debe funcionar si o si.
Saludos.
Duda: como se puede visualizar en la tabla las claves foráneas?. Es decir, en vez de la ref. a la tabla foránea en una columna determinada, que se enlace a un campo de la tabla.
Ej: coches.id marca.id, en marca tendríamos marca.modelo.
¿Como hago para ver en la tabla la columna "modelo"?. Quiero la descripción del modelo no el campo identificador.
Gracias.
Hola Asier,
Lo primero de todo agradecerte el comentario.
Para resolver la problemática que tienes actual con los componentes que nos ofrece Vaadin, la forma directa de resolver que te aparezca la descripción de la columna "modelo" en la tabla es adecuando la consulta (mediante un INNER JOIN por ejemplo) con los datos que necesitas.
Piensa que la programación web no es 100% como lo harías en una programación de escritorio o un entorno de desarrollo adaptado a aplicaciones de gestión; hay que cambiar un poco el chip en tu forma de diseñar las aplicaciones y seguir ciertas normas de usabilidad web.
Tambien siempre puedes extender el objeto tabla y crearte un objeto "a medida" con la funcionalidad que desees. No olvides no obstante, mirar en los Add-ons de Vaadin a ver si encuentras algo.
Saludos.
Es exactamente lo que he hecho pues no encontraba ningún método disponible en SQL Container que automatizara los "joins", como soy nuevo en esto de Vaadin, escribí el post por si se me había perdido algo.
Mirare, como sugieres, en los addons.
Muchas gracias por tu respuesta.