Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Base de Datos / Base de Datos / Java / MySQL / Proyectos / Tablas virtuales en java (View)

Tablas virtuales en java (View)

Autor jc mouse miércoles, febrero 29, 2012

Una Vista (View) es una Tabla Virtual cuyo contenido está definido por una consulta (SELECT), al igual que una tabla real una vista consta de un conjunto de columnas y filas de datos con nombre. Sin embargo, debe quedar bien claro de que una Vista “no almacena datos”, las filas y columnas de datos proceden de tablas a las cuales se hace referencia en la consulta que se define desde la vista .

Una Vista al ser una tabla más de la base de datos, puede ser utilizada como cualquier otra tabla (con pequeñas diferencias claro) desde java o desde el lenguaje que estemos utilizando (ASPX, VB, C++, Delphi, PHP, etc), una vista puede utilizarse por ejemplo para:

  • Restringir al usuario a filas y columnas concretas de una tabla.
  • Combinar columnas de varias tablas para formar una sola tabla con los datos que necesitamos.
  • Incluir columnas calculadas a partir de otras columnas provenientes de una o varias tablas (SUM, AVG, COUNT, etc).
  • Se puede utilizar para restringir la cantidad de datos sobre los que el usuario puede operar.
  • Simplificar las consultas desde el lenguaje de programación que estemos utilizando, es decir en vez de que el usuario realice la combinacion de varias tablas desde por ejemplo Java lo que supondria lineas extra de código, este podra trabajar solo con un numero reducido de tablas e instrucciones SQL.

Podemos decir mucho más sobre las Vista, sin embargo yo me canso en escribir y usted se cansa en leer, si llego a este sitio, es porque lo que usted está buscando son ejemplos prácticos, y ejemplos prácticos es lo que tendra, solo nos detendremos a escribir las partes más relevantes para nuestro ejemplo.

¿Que necesita saber?

  • Java, el lenguaje de programación que se utilizara en este tutorial
  • Netbeans. uso básico, aunque puede hacer uso del IDE de su preferencia.
  • Lenguaje de consultas SQL y el uso de un SGBD.

Crear una Vista (CREATE VIEW).

Para crear una vista se utiliza el comando

CREATE VIEW <Nombre de la Vista>
AS
   <Instrucción SELECT atributos físicos de una o varias tablas>

Instruccion de selección (SELECT).

En la instrucción SELECT quee define la vista se puede utilizar más de una tabla e incluso otras vistas. Sin embargo, hay que tener en cuenta algunas restricciones de las cláusulas SELECT en una definición de una vista, no se puede:

  • Incluir cláusulas ORDER BY, COMPUTE o COMPUTE BY
  • Incluir la palabra INTO
  • Hacer referencia a tablas temporales (un Select dentro otro Select).

Comencemos con la práctica 🙂

Utilizaremos una pequeña base de datos compuesta por tres tablas, Universitario, Materia y la relación muchos a muchos entre estas dos tablas, el MER es el siguiente:

mer database

MER Universitario Materia

La tabla UNIVERSITARIO esta formada de la siguiente manera:

-- 
-- Estructura de tabla para la tabla 'universitario'
-- 

CREATE TABLE universitario (
  u_carnet varchar(7) NOT NULL,
  u_nombre varchar(60) NOT NULL,
  PRIMARY KEY  (u_carnet)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Volcar la base de datos para la tabla 'universitario'
-- 

INSERT INTO universitario VALUES ('333-123', 'Al K. Huete ');
INSERT INTO universitario VALUES ('345-232', 'Aldo Lorido ');
INSERT INTO universitario VALUES ('555-667', 'Alejandro Gado ');
INSERT INTO universitario VALUES ('323-111', 'Alex Cremento ');
INSERT INTO universitario VALUES ('321-236', 'Armando Esteban Quito ');
INSERT INTO universitario VALUES ('555-349', 'Helen Chufe ');
INSERT INTO universitario VALUES ('098-332', 'Monica Galindo ');
INSERT INTO universitario VALUES ('998-002', 'Viviana K. Lavuelta ');
INSERT INTO universitario VALUES ('009-332', 'Lali Cuadora ');
INSERT INTO universitario VALUES ('911-212', 'Federico Chino ');

La tabla MATERIA con algunos datos es la siguiente:

-- 
-- Estructura de tabla para la tabla 'materia'
-- 

CREATE TABLE materia (
  m_sigla varchar(6) NOT NULL,
  m_nombre varchar(60) NOT NULL,
  PRIMARY KEY  (m_sigla)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Volcar la base de datos para la tabla 'materia'
-- 

INSERT INTO materia VALUES ('SIS102', 'Base de Datos I');
INSERT INTO materia VALUES ('SIS420', 'Inteligencia Artificial');
INSERT INTO materia VALUES ('SIS100', 'Ensamblador');

La relación entre ambas tablas UNIVERSITARIO y MATERIA forma una tabla intermedia que llamremos UM, su estructura es:

-- 
-- Estructura de tabla para la tabla 'um'
-- 

CREATE TABLE um (
  cu varchar(7) default NULL,
  sigla varchar(6) default NULL,
  examen1 float default NULL,
  examen2 float default NULL,
  KEY cu (cu),
  KEY sigla (sigla)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Volcar la base de datos para la tabla 'um'
-- 

INSERT INTO um VALUES ('333-123', 'SIS102', 46, 23);
INSERT INTO um VALUES ('333-123', 'SIS420', 56, 49);
INSERT INTO um VALUES ('345-232', 'SIS100', 33, 12);
INSERT INTO um VALUES ('345-232', 'SIS420', 89, 44);
INSERT INTO um VALUES ('555-667', 'SIS420', 55, 45);
INSERT INTO um VALUES ('555-667', 'SIS120', 45, 66);
INSERT INTO um VALUES ('323-111', 'SIS100', 55, 65);
INSERT INTO um VALUES ('323-111', 'SIS120', 66, 77);
INSERT INTO um VALUES ('321-236', 'SIS100', 78, 87);
INSERT INTO um VALUES ('321-236', 'SIS120', 87, 10);
INSERT INTO um VALUES ('555-349', 'SIS100', 34, 87);
INSERT INTO um VALUES ('555-349', 'SIS420', 77, 77);
INSERT INTO um VALUES ('098-332', 'SIS100', 45, 65);
INSERT INTO um VALUES ('998-002', 'SIS120', 23, 32);
INSERT INTO um VALUES ('009-332', 'SIS420', 33, 54);
INSERT INTO um VALUES ('009-332', 'SIS120', 34, 55);
INSERT INTO um VALUES ('911-212', 'SIS100', 44, 55);
INSERT INTO um VALUES ('911-212', 'SIS420', 34, 54);

Creo que el sentido de esta base de datos se entiende verdad, un universitario pueden llevar muchas materias y una materia puede ser llevada por muchas universitarios, ademas se necesita almacenar las calificaciones del primer y segundo examen para cada alumno.

¿Que se desea conocer?

Se desea conocer la lista de los alumnos aprobados con nota mayor de 51 de la asignatura de SIS-420 “Inteligencia Artificial”, esta consulta podemos resolverla de la siguiente manera:

SELECT *
FROM
(
   SELECT u_carnet AS CU, u_nombre AS Nombre, examen1 AS Nota1 ,
          examen2 AS Nota2, SUM(examen1+examen2)/2 AS NotaFinal
   FROM universitario
        INNER JOIN um on u_carnet=cu
        INNER JOIN materia ON sigla=m_sigla
   WHERE m_sigla='SIS420'
   GROUP BY u_carnet
) AS tmp
WHERE NotaFinal > 51

Tenemos una subconsulta de donde obtenemos la lista de notas de todos los alumnos de la asignatura de sis420, de esta subconsulta haciendo uso de la condición del problema (nota minima de aprobación > 51), obtenemos la lista de aprobados, es decir, con la 1ra consulta tenemos:

CU      | Nombre        | Nota1 | Nota2 | NotaFinal
009-332   Lali Cuadora     33 54 43.5
333-123   Al K. Huete      56 49 52.5
345-232   Aldo Lorido      89 44 66.5
555-349   Helen Chufe      77 77 77
555-667   Alejandro Gado   55 45 50
911-212   Federico Chino   34 54 44

y despues añadiendo la condicion Nota Final Aprobados > 51

CU      | Nombre        | Nota1 | Nota2 | NotaFinal
333-123   Al K. Huete    56 49 52.5
345-232   Aldo Lorido    89 44 66.5
555-349   Helen Chufe    77 77 77

Esta consulta podemos utilizarla directamente desde Java, sin embargo podemos hacer uso de Tablas Virtuales y llamar esta desde Java como cualquier otra tabla.

Creación de la Tabla Virtual.

Crearemos dos Vistas, ¿porqué dos?, porque estamos utilizando dos select para obtener el resultado, y una Vista no puede generarse haciendo uso de una tabla temporal, esto nos obliga a crear una vista para obtener la “lista de Notas de Alumnos de SIS420” y otra segunda vista que hara uso de la anterior vista para obtener la “Lista de Alumnos Aprobados”, manos a la obra:

A la primera vista la llamaremos “notas_IA”, el código para crear la vista es:

CREATE VIEW notas_IA
AS
  SELECT u_carnet AS CU, u_nombre AS Nombre, examen1 AS Nota1 ,
          examen2 AS Nota2, SUM(examen1+examen2)/2 AS NotaFinal
  FROM universitario
        INNER JOIN um on u_carnet=cu
        INNER JOIN materia ON sigla=m_sigla
  WHERE m_sigla='SIS420'
  GROUP BY u_carnet

La segunda vista se llamara: “aprobados__IA” y es:

CREATE VIEW aprobados_IA
AS
  SELECT *
  FROM notas_IA
  WHERE NotaFinal > 51

Si te salio algún error en la creación de las tablas o de las Vistas, revisa el tuto desde el principio, eso es todo con SQL, ahora debemos hacer uso de esta Tabla Virtual desde java, esto no es nada del otro mundo, como ya dijimos una Vista no es más que una tabla virtual por tanto su utilización es igual a cualquier otra tabla, vamos programar en java

Java Netbeans

Crea un nuevo proyecto Java Netbeans (Nombre Proyecto: jcview) , y añade ademas del main que crea por defecto, añade una clase a la que llamaras “database.java”, nuestra clase de conexion a MySQL, este proyecto no hara uso de una interfaz grafica ya que no es relevante para este tutorial, no te olvides de agregar la libreria de conexión “Driver MySQL JDBC mysql-connector”, yo utilizo la versión 5.1.6, creo que es la ultima versión.

El codigo de la clase “database.java” es el siguiente:

package jcview;
import java.sql.*;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class database {

   /* DATOS PARA LA CONEXION */
  private String bd = "NOMBRE_BASE_DE_DATOS";
  private String login = "USUARIO";
  private String password = "PASSWORD_MYSQL";
  private String url = "jdbc:mysql://localhost/"+bd;
  private Connection conn = null;

//___________________________________________________________________________________ Soy una barra separadora 🙂
   public database(){
      try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection(url,login,password);
         if (conn!=null){
            //System.out.println("OK base de datos "+bd+" listo");
         }
      }catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }
    }
//___________________________________________________________________________________ Soy una barra separadora 🙂
/* METODO PARA REALIZAR UNA CONSULTA A LA BASE DE DATOS
 * INPUT:
 * table => nombre de la tabla donde se realizara la consulta, puede utilizarse tambien INNER JOIN
 * fields => String con los nombres de los campos a devolver Ej.: campo1,campo2campo_n
 * where => condicion para la consulta
 * OUTPUT: un object[][] con los datos resultantes, sino retorna NULL
 */
    public Object [][] select(String table, String fields, String where){
      int registros = 0;
      String colname[] = fields.split(",");

      //Consultas SQL
      String q ="SELECT " + fields + " FROM " + table;
      String q2 = "SELECT count(*) as total FROM " + table;
      if(where!=null)
      {
          q+= " WHERE " + where;
          q2+= " WHERE " + where;
      }
      //obtenemos la cantidad de registros existentes en la tabla
      try{
         PreparedStatement pstm = conn.prepareStatement(q2);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println(e);
      }
    //se crea una matriz con tantas filas y columnas que necesite
    Object[][] data = new String[registros][fields.split(",").length];
    //realizamos la consulta sql y llenamos los datos en la matriz "Object"
      try{
         PreparedStatement pstm = conn.prepareStatement(q);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){
            for(int j=0; j<=fields.split(",").length-1;j++){
                data[i][j] = res.getString( colname[j].trim() );
            }
            i++; }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
 }
//___________________________________________________________________________________ Soy una barra separadora 🙂
}

Esta clase nos permite conectarnos a MySQL, ademas cuenta un método para realizar una consulta. No te olvides rellenar tus datos de MySQL, usuario, password y nombre de la base de datos.

Implementamos esta clase en el main del proyecto de la siguiente forma:

package jcview;
/**
* @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class Main {

    static database db = new database();
    static Object[][] data;

    public static void main(String[] args) {
        //se realiza la consulta a la VISTA como a cualquier otra tabla
        data = db.select("aprobados_ia", " CU, Nombre, Nota1, Nota2, NotaFinal ", null);
        System.out.println(" C.U. | Nombre | N1 | N2 | Nota Final ");
        if( data.length > 0)
             //Se imprimen los datos devueltos
             for(int i=0; i<data.length;i++)
             {
                System.out.println( data[i][0].toString() + " | " + data[i][1].toString() + " | " +
                                    data[i][2].toString() + " | " + data[i][3].toString() + " | " + data[i][4].toString() );
             }
        else
            System.out.println("No existen datos");
    }
}

Como puede verse, se llama a la Tabla Virtual, como a cualquier otra tabla, y ademas la consulta que se utiliza es sencilla en comparación a la consulta compleja que se deberia haber implementado de no haber hecho uso de Vistas.

No queda mas que mostrar el resultado en pantalla.

view java

Si deseas bajarte el proyecto completo, dale clic al siguiente enlace “Descargar” 🙂

FIN

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Cambiar plataforma JDK en Netbeans

Cambiar plataforma JDK en Netbeans

Es recomendable tener actualizado la Maquina Virtual Java de nuestro equipo para poder disfrutar de las mejoras que trae...

JTable con imágenes

JTable con imágenes

En este post dejo una forma de como utilizar imágenes en un JTable ademas de implementar MouseListener para realizar dif...

Reproducir video con JavaFX y HTML5

Reproducir video con JavaFX y HTML5

JavaFX implementa el control webview que nos permite agregar contenido HTML cargado mediante la clase WebEngine. El comp...

Reconocimiento Óptico de Caracteres con Tess4J

Reconocimiento Óptico de Caracteres con Tess4J

El reconocimiento óptico de caracteres o OCR (Optical Character Recognition), es un proceso dirigido a la digitalización...

Manipular colecciones de una forma sencilla

Manipular colecciones de una forma sencilla

Java proporciona Collection Framework, que define varias clases e interfaces para representar un grupo de objetos como u...

Generar esquema XSD a partir de clases java

Generar esquema XSD a partir de clases java

En un post anterior vimos como usar la herramienta XJC del JDK para generar clases java desde esquemas XSD (XML Schema D...

2 comentarios en “Tablas virtuales en java (View)”

  1. Juan carlos almanza Torrico dice:

    me gustaria que me ayudes con manejo de horas restriccion de horas en java Mysql como por ejemplo para manejo de control de personal
    por fabor Att Almanza

    1. Mouse dice:

      ok tomo nota 🙂

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

MyBatis es un framework de persistencia Java que se encarga de mapear sentencias SQL y procedimientos almacenados a part...

Webcam Capture es un API  que permite usar una cámara web incorporada o externa directamente desde código Java utilizand...

im4java es una interfaz pura de Java para la línea de comandos de ImageMagick. La interfaz de la línea de comandos de IM...

En un post anterior conocimos una herramienta Open Source con un conjunto de herramientas para el trabajo con imágenes e...

Herramientas

Generador de Enlaces a Whatsapp