Tutorial Java – Creando el Test de Conexion a la BD # 4


Tutorial Java

Cómo lo hacen en Java

Creo que éste articulo ha sido el más esperado de todos…

Por qué?

Pues, porque aquí es realmente donde muestro cómo recuperar información de la base de datos, y cómo utilizar ésta información dentro de tu Clase Java.

Como ya viste en los artículos anteriores de este Tutorial de Java, todas las Clases de Tests creadas hasta el momento se trató de sentencias SQL para enviar información a la base de datos o ejecutar órdenes, que son las sentencias de INSERT, UPDATE y DELETE.

Hoy aprenderás cómo utilizar la sentencia SELECT desde dentro de tu Clase de Test.

Ejemplo de Consulta de Registro de la Tabla Libros

En la siguiente imagen te muestro el ejemplo más sencillo de utilización de la sentencia SELECT donde luego de ejecutar en el Servidor, debo establecer un ciclo para recorrer los resultados de forma a imprimir en la consola los datos recuperados:

Como ves en , con la llamada al  método addSQL() del ControladorBD asigno  directamente la sentencia SQL que quiero agregar  a la cola de ejecución, vea , ya no utilizo variable como antes, sino que lo paso directamente como String.

En ejemplo , la simple sentencia “SELECT * FROM libros” recupera todos los registros de las tabla libros sin filtro alguno, además de recuperar todos los campos lib_codigo, lib_descripcion, lib_cant… etc, etc, etc, con el sólo hecho de utilizar el comodín *

Luego en  con la llamada al método execute() de la Clase ControladorBD, la consulta se ejecuta en el Servidor, y si todo ocurrió con éxito los resultados quedarán almacenados en un área del ControladorBD, por lo cual desde nuestra clase Java debemos obtener dichos valores.

Los valores se obtienen realizando un bucle o ciclo while, observe , preguntando con el método finRecordSet() del ControladorBD. si aún existen registros para recorrer.

El método finRecordSet(), retornará verdadero, siempre y cuando existan datos no leidos aún por el ControladorBD, y lo deberás utilizar para capturar los valores recuperados de la base de datos.

Consulta la Documentación de la API ControladorBD para obtener más detalles sobre sus métodos.

A continuación te muestro los resultados de la ejecución de la clase.

En la ventana de consola de arriba se imprimen todos los registros encontrados, mostrando cada campo, el resultado de la ventana lo corté para no ser demasiado extenso.

Ejemplo de Consulta con Filtro

En el siguiente ejemplo, te mostraré una pequeña variación, donde incluyo en la sentencia SQL un valor proveniente de una variable.

En la sentencia “SELECT * FROM libros WHERE lib_codigo = 3” le solicito al servidor que recupere todos los campos * pero le incluyo un filtro en la sentencia para que solamente recupere el registro cuyo código sea igual a 3 (WHERE lib_codigo = 3).

Te dejo claro que no intento hacer de éste artículo un manual de SQL, sino simplemente explicarte cómo es ejecutado ésta sentencia en el Servidor, de forma que puedas saber cómo manejarla desde tu Clase Java. Más adelante en otro artículo, estaré explicando más detalladamente sobre los comandos SQLs.

A continuación te paso la imagen del ejemplo:

Sé perfectamente que dicha sentencia SQL sólo puede recuperar un registro, por que mi campo lib_codigo en la tabla libros es una clave primaria (PK), lo que significa que los valores en dicho campo no se repiten, además de ser auto-incremental, y si existe un registro con ese código solamente existirá uno.

Es por eso que ahora para utilizar el método finRecordSet() de la clase ControladorBD ya no utilizo un while para recorrer los registros, sino que lo liquido directamente con un if, además de tener un control en el else, donde puedo saber si no existe el registro.

Fijate en los resultados de la consola.

Minimizando el tiempo de respuesta del Servidor.

Hay veces que necesitarás recuperar sólo parte de una información de la base de datos, en éste caso es conveniente que sepas cómo solicitar información al Servidor de forma que ésta pueda retornarte más rápidamente.

Tal vés como desarrollador ahora no sientas la diferencia entre unos pocos milisegundos de retardo por una solicitud realizada, pero los usuarios de tu aplicación si lo sentirán cuando empiecen a tener cada vez más y más información acumulada.

Para que ello no ocurra, es conveniente que sepas crear la sentencia SQL adecuada de forma a recuperar sólo la información deseada, también hay otras técnicas que puedes aplicar como el uso de indices, pero ésto te estaré explicando más adelante.

Observa el siguiente codificación.

En el ejemplo de arriba, puedes observar cómo se solicita una información específica al servidor de base de datos, en este caso estoy solicitando solamente el campo lib_descripcion de la tabla libros, nota que ya no utilizo el * que recupera todos los campos.

Observa que también utilizo un filtro lib_cantidad > 3

Una mala práctica de programación, que he visto varias veces ser realizado por programadores supuestamente profesionales, es recuperar siempre toda la información de la base de datos y luego cuando ya tienen toda la información localmente, filtran y borran lo que no se necesitan, no sabiendo que ello conlleva a un desperdicio de recursos y sobrecarga en la red.

Si deseas hacer un software eficiente, todo el filtro de Datos así como operaciones y cálculos en lo posible debe ser realizado en el Servidor de Base de Datos.

Si tu hacías lo mismo, no te culpes, es que los tutoriales de java generalmente no nos enseñan estos trucos, pero ahora ya lo sabes.

Cómo siempre me gusta mostrar el resultado de las operaciones, aquí les dejo la ventana de Consola.

Ejemplo de Control de Excepción en Consulta de Registros.

El siguiente ejemplo consiste simplemente en mostrarte la ejecución de los métodos del ControladorBD para tener un control de excepciones, y dar un mensaje personalizado al Usuario.

En la figura de abajo puedes ver que tanto el método addSQL(), execute(), finRecordSet() y getString() de la clase ControladorBD son encerradas en el bloque de try…catch

Esto debe ser así por que si vas a utilizar el bloque try…catch, estas obligado a encerrar todos los métodos, es decir, no puedes solamente incluir a tu control de excepciones el método addSQL() y execute(), por ejemplo, no, tienes que incluirlos a todos, así como se muestra en el ejemplo.

Fijate que cambié la sentencia SQL para que a propósito me genere una excepción, la clausula FROM, la cambié por FOM, con lo cual al ejecutar el comando me debe lanzar una excepción, y es así efectivamente, según lo que puedes ver en la figura de abajo.

En la ventana de la consola, el mensaje que aparece en rojo no será mostrado al usuario, sino que mas bien se imprime en la consola de forma que tu como desarrollador puedas detectar la falla y corregirla.



Conclusión

En éste artículo viste cómo es fácil realizar consultas a la Base de Datos.

Viste que a la sentencia SELECT, puedes aplicarle filtros, para que sólo recupere los registros que estás necesitando.

También te mostré cómo dejar de utilizar el * para recuperar solamente los campos necesarios de acuerdo a tu aplicación, algo que acelera bastante el rendimiento del software.

Por último te expliqué que puedes mostrar un mensaje personalizado sobre el resultado de los errores al usuario y que siempre puedes detectar y corregir problemas dependiendo de la excepción que ocurra.

Acceso al Tutorial Java

Esta entrada forma parte de un Tutorial de Java que estoy desarrollando, para ver indice de contenido presiona AQUI 

Espero que éste tutorial haya sido de gran utilidad para tí.

Deja tu huella en los comentarios para ayudarme a mejorar los contenidos.

Un saludo Cordial

Marcos Jara

Esta entrada fue publicada en Uncategorized y etiquetada , , , , , , , , , . Guarda el enlace permanente.

8 respuestas a Tutorial Java – Creando el Test de Conexion a la BD # 4

  1. Alberto Durand dijo:

    Hola Marco, gracias por tu esfuerzo y dedicación a tu trabajo y hobby.

    Estoy probando tu librería controlador-bd.jar ver1.3 con lo siguiente:
    Eclipse Helios 3.6.2
    MS SQL Server 2008 R2

    configuracion del controlador-bd.properties
    # Ej. de Comunicación con SQLServer
    url=jdbc:sqlserver://localhost/Univa
    usuario=DentalUser
    password=123
    driver=com.microsoft.sqlserver.jdbc.SQLServerDriver

    Las librerias controlador-bd.jar y sqljdbc.jar estan referenciadas en el proyecto de eclipse.

    Fragmento de código:
    try {
    String sql = “SELECT * FROM Usuarios”;
    ControladorBD.addSql(sql);
    ControladorBD.execute();
    while(ControladorBD.finRecordSet()){
    System.out.println(ControladorBD.getString(“Usuario”));
    }

    }
    catch(Exception ex) {
    System.out.println(“Ocurrio un error al intentar conectar a la base de datos ” + ex.getMessage());
    ex.printStackTrace();

    }
    finally {

    }

    Al ejecutar me despliega lo siguiente en la consola:

    –>jdbc:sqlserver://localhost/Univa – DentalUser – 123
    Ocurrio un error al intentar conectar a la base de datos No se pudo realizar la conexión TCP/IP al host localhost/Univa, puerto 1433. Error: “null. Verifique las propiedades de conexión, compruebe que hay una instancia de SQL Server ejecutándose en el host y aceptando las conexiones TCP/IP en el puerto y compruebe que no hay ningún firewall bloqueando las conexiones TCP en el puerto.”.
    com.microsoft.sqlserver.jdbc.SQLServerException: No se pudo realizar la conexión TCP/IP al host localhost/Univa, puerto 1433. Error: “null. Verifique las propiedades de conexión, compruebe que hay una instancia de SQL Server ejecutándose en el host y aceptando las conexiones TCP/IP en el puerto y compruebe que no hay ningún firewall bloqueando las conexiones TCP en el puerto.”.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:187)

    ¿Me podrás ayudar a determinar donde esta la falla por favor?

    De antemano mil gracias por tu ayuda!!

    Saludos desde Guadalajara Jalisco México.

    Beto Durand

    • Marcos Jara dijo:

      Hola Alberto

      Gracias a vos por el interes en utilizar la api controlador-bd, bueno, a tu problema:

      Creo que hay varias formas de resolverlo y deberíamos ir quemando etapas:

      Según el error que te aparece:
      Ocurrio un error al intentar conectar a la base de datos No se pudo realizar la conexión TCP/IP al host localhost/Univa, puerto 1433. Error: “null. Verifique las propiedades de conexión, compruebe que hay una instancia de SQL Server ejecutándose en el host y aceptando las conexiones TCP/IP en el puerto y compruebe que no hay ningún firewall bloqueando las conexiones TCP en el puerto.”.

      Tendrías que verificar primero si el SQL Server está correctamente instalado y que realmente estás podiendo acceder al él, por ejemplo desde otra aplicación (JDBC por ej.) y si podés hacer algo mejor, probá conectarte desde otra máquina.

      Luego otro problema que también podría ser es el driver, que segun me comentas es el sqljdbc.jar, de que versión es?

      Prueba por favor utilizar uno más actualizado, tienes que utilizar el driver adecuado para el SQL Server 2008, no recuerdo bien pero creo que tiene que ser la v3 o v4 del driver, no estoy seguro.

      Y por último, intenta también cambiar el url de conexion de tu archivo properties conforme lo requiere tu driver , te vuelvo a repetir si bien recuerdo era algo así:
      url=jdbc:sqlserver://localhost/; DataBase=Univa

      Esta información la vas a encontrar en la documentación de tu driver.

      Espero te funcione,

      Si te ayudó a avanzar en algo por favor hazme saber

      Saludos.

  2. David Pacios dijo:

    Hola, todo bien, entendi bien los conceptos y ahora voy a por el siguiente ejercicion, gracias por todo y un saludo.

  3. El_Chino dijo:

    Hola marcos , tengo un problema con el ciclo while, me da este error “The method While(boolean) is undefined for the type ControladorBDTeste” la verdad que no probe con un if pero me da la opcion de crear un metodo whie que devuelva un valor booleano. Estuve leyendo la informacion sobre la api y deberia hacer la busqueda con el finRecordSet que en realidad no me da error con eso sino con el while a la hora de hacer la busqueda. Desde ya muchas gracias

  4. Yineth dijo:

    Hola Marcos, estoy muy agradecida por tus publicaciones, he podido realizar todo lo que dices, excepto por lo siguiente:
    Realizo un select de una base de datos que tengo en mi servidor de bd sqlserver2008 y bueno esto es lo que me arroja:

    –>jdbc:sqlserver://localhost:1433; – admin – admin
    Conexion realizada con exito!!
    Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at java.lang.String.substring(Unknown Source)
    at com.tutorialjava.bd.ControladorBD.getConnectionId(ControladorBD.java:447)
    at com.tutorialjava.bd.ControladorBD.execute(ControladorBD.java:256)
    at com.teste.ControladorBDTeste.main(ControladorBDTeste.java:9)

    He buscado en muchos lugares que sucede con esto pero no encuentro nada relacionado con el tema.
    Para mas claridad mi consulta es la siguiente:
    SELECT emp_codigo FROM EPM.dbo.cal_calificaciones

    Te agradezco enormemente la ayuda.

    • Marcos Jara dijo:

      Hola

      No debe ser nada..

      Necesito que me digas en que momento te aparece el error, y si puedes enviarme las lineas donde agregas tu sql y donde ejecutas con el controlador.

      Estare aguardando para poder ayudarte.

      Saludos.

  5. Garcia Mauro dijo:

    Hola Marcos!!
    Como hago para utilizar datos de tipo Time que viene de un base de datos con el ConectorBD???
    Desde ya estoy muy agradecidos por todos tus aportes!!
    Espero tu respuesta!!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s