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


Ejemplo de inserción de más de un registro.

Tutorial Java

Cómo lo hacen en Java

El artículo que te presento a continuación contiene información de lo que la mayoría de las veces necesitas aplicar para programar los botones de guardar o confirmar una operacion, por ejemplo en el momento de guardar un registro de ABM, de guardar una Venta o de guardar un Cobro.

En el ejemplo que te muestro a continuación podrás ver cómo enviar 3 sentencias SQLs al servidor, y hacer que éstas sentencias se ejecuten todas en una más de una única transacción.

Si aprendes a utilizar el ControladorBD para enviar sentencias que se ejecuten en más de una transacción, estarás a un paso más cerca de la creación de nuestro sistema.

En ,  y  se agregan las diferentes sentencias SQLs al ControladorBD, como ya te expliqué en el artículo anterior, estas sentencias aún no son ejecutadas en el servidor, quedan allí hasta que el método execute() sea llamado.

En el  cuando se llama al método execute() del ControladorBD, todas las sentencias enviadas a la cola de ejecución, son ejecutadas ahora en el Servidor MySQL.

A continuación te muestro el resultado de la ejecución.

como podrás ver las 3 sentencias son ejecutadas dentro de una única transacción (encerradas entre BEGIN TRANSACTION y COMMIT).

Esto funciona tanto para guardar 3 o más registros en la misma tabla, como también para ejecutar 3, 4 o más registros en mas de una tabla a la vez, generalmente utilizará ésta forma para guardar registros de cabecera y detalle, por ejemplo, en un botón guardar dentro de un formulario de ventas.

A continuación te muestro simplemente una forma diferente de organizar el código, preferida por algunos, aunque ésta forma no interfiere en nada en ejecución, de la forma que te mostré anteriormente.

Los métodos del ControladorBD, son agrupados al final, para una mejor organización del código, algo que es bastante útil para la fase de mantenimiento.

Si corres la clase como una aplicación java, podrás ver los mismos resultados en la ventana de consola.

Como ves, el resultado de la ejecución es el mismo de la forma anterior.

Tratamiento de Excepciones

Una de las mejoras que puedes aplicar es encerrar los métodos del ControladorBD para tener el control de la Excepción, de tal forma a dar un mensaje más personalizado al usuario, como se muestra en el siguiente código:

Cómo puedes ver este código es muy similar al código anterior, con la diferencia que todos los métodos del ControladorBD se encuentra entre try…catch.

El bloque catch sólo será ejecutado caso ocurra algún error, lo que hago en el bloque es imprimir con una simple instrucción System.out… el mensaje de error que ha ocurrido en el servidor. Más adelante la instrucción System.out… podrás cambiarlo por JOptionPane.ShowMessage… cuando ya estés trabajando con Swing.

Observa que igualmente mando ejecutar la impresion detallada del error en la consola con e.printStackTrace(), para poder detectar la causa real del problema y solucionarlo caso este se deba a un error de programación.

Ejecutar sentencias en más de una transacción

En ocasiones, y dependiendo de la ocasión querrás ejecutar una o varias sentencias en más de una única transacción, ella es controlada a través del método execute().

En el ejemplo  cuando se ejecuta el método execute(), sólamente existe una sentencia sql en la cola de ejecución, el que fue almacenado en la variable sql1. Entonces sólo dicho sentencia será encerrada dentro de la primera transacción.

En el segundo momento  cuando es ejecutado el método execute() se ejecutarán dos sentencias, las que fueron agregadas con sql2 y sql3.

Note que la primera sentencia agregada, la del sql1, ya no se ejecuta en ésta segunda vez, por que las sentencias sqls son retiradas de la cola de ejecución con la llamada al método execute() luego de ejecutar las sentencias en el servidor.

En la vista consola que te muestro abajo, puedes ver el resultado de la ejecución, así como te expliqué arriba.

Conclusión

En este capítulo del tutorial de java, te voy mostrando más formas de cómo utilizar el ControladorBD, de forma que vayas adquiriendo las habilidades para utilizarlas cuando te muestre la interfase gráfica con Swing.

Te mostré cómo utilizar el ControladorBD para enviar sentencias SQL controladas por más de una transacción. No existe limitación en cuanto a la cantidad de métodos execute() que vayas llamar, depende sólo de la necesidad de transacción de que tu aplicacion requiera ser ejecutado.

También aprendiste que puedes mostrar mensajes personalizados a tus usuarios, capturando y tratando la Excepción enviada por el Servidor de Base de Datos a través del ControladorBD.

Recuerda realizar estos ejercicios para ganar agilidad y estar preparado para los demás ejercicios que se vienen.

Acceso a todo el tutorial

Esta entrada forma parte de un tutorial de java que estoy desarrollando, para ver indice de contenido presiona aquí

En el próximo tutorial, te mostraré una guia de SQLs orientado hacia la Base de datos biblioteca, de forma que puedas realizar todos los ejercicios dados!

Marcos Jara

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

9 respuestas a Tutorial Java – Creando el Test de Conexion a la BD # 2

  1. lore dijo:

    hola… que tal profe..
    estaba haciendo el primer ejercicio de conexion a la BD.. la cual no me salio ningun error pero a la hora de ejecutar en la consola me aparecio este error..
    Excepción en el hilo “principal ” java.util.MissingResourceException: No se puede encontrar paquete de configuración regional es_ES nombre base bd controlador,
    en java.util.ResourceBundle.throwMissingResourceException (origen desconocido)
    en java.util.ResourceBundle.getBundleImpl (origen desconocido)
    en java.util.ResourceBundle.getBundle (origen desconocido)
    en com.properties.util.LeePropiertes.leeID (LeePropiertes.java: 10)
    en com.tutorialjava.bd.ControladorBD (ControladorBD.java: 33).
    en com.tutorialjava.bd.ControladorBD.getInstance (ControladorBD.java: 42)
    en com.tutorialjava.bd.ControladorBD.addSql (ControladorBD.java: 212)
    en com.teste.ControladorBDTeste.main (ControladorBDTeste.java: 15)

    y realmente nose por que me aparrece asi.. si no tengo ningun error

    • Marcos Jara dijo:

      Hola,

      Es por que te falta el archivo controlador-bd.properties, si lo tienes, verifica si el nombre esta correctamente escrito o si se encuentra en la ubicación que indica el tutorial,

      Saludos

  2. Perdón, no era a la excepción que envié antes. La excepción que me aparece al querer guardar algo en la base de datos y que no entiendo por qué, es la que coloco a continuación:

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    Last packet sent to the server was 31 ms ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485)
    at Classes.Conexion.ejecutarSQL(Conexion.java:66)
    at osceswebapp.FormNuevo.guardarDatos(FormNuevo.java:1752)
    at osceswebapp.FormNuevo.btnNuevoActionPerformed(FormNuevo.java:1320)
    at osceswebapp.FormNuevo.access$4100(FormNuevo.java:38)
    at osceswebapp.FormNuevo$39.actionPerformed(FormNuevo.java:974)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6263)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6028)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2431)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882)
    … 36 more

    • Marcos Jara dijo:

      Hola Gilberto,

      Todo parece ser que ocurre al momento que se intenta abrir la conexión, pero el error es por perdida de datos al realizar lectura de datos del servidor.

      Esto suele ocurrir cuando se trabaja en red.?

      El servidor está en la misma máquina donde estas ejecutando tu programa JAVA, si es así, ese puede ser el problema.

      Saludos

      • ¡Qué pronta respuesta! ¡Muchas gracias!

        La verdad es que la base de datos la tengo en un servidor web, mientras que la aplicación la estoy trabajando en mi computadora del trabajo o de mi casa. Lo extraño es que esa falla me la da desde ambas máquinas, pero han habido un par de ocasiones en que el insert se ejecuta, pero al volver a intentar regresa la excepción.

      • Marcos Jara dijo:

        Claro,

        De hecho yo me habia expresado mal en mi mensaje anterior, no es un problema de conexión por que no quiere conectar, sino que dice data lost (perdida de datos) y eso muchas veces se debe a la mala señal, muy intermitente o poco ancho de banda para lo que exige tu aplicacion.

        Otro problema tambien puede ser que abres tu formulario y lo dejas mucho tiempo sin hacer nada, para lo cual cuando deseas ejecutar los comandos ya no existe conexion. Es importante que entiendas que con el controlador, se abre una conexion una unica vez, y luego ya se trabaja con esa conexion.

        Lo ideal si vas a trabajar con internet, es que cuando necesites hacer algo en la BD, abras tu conexion, ejecutes el comando y lo vuelvas a cerrar, cada vez. es mas seguro para este tipo de redes, aunque un poquitito más lento, pero sólo un poquitito (sólo notable en aplicaciones críticas.)

        Esto es así y será siempre con el controlador o si trabajas con el jdbc directo, igualmente allí tendrías que considerar dicha situación de forma manual.

        Espero te pueda estar ayudando con mis comentarios.

      • Definitivamente me está ayudando un montón. Yo lo que he hecho es que creo la conexión al iniciarse el formulario (dado que casi para cualquier cosa se hará una consulta al menos) pero entiendo que es mejor entonces abrir la conexión por ejemplo hasta el momento de dar clic en un botón “Guardar” o en el momento específico en que vaya a hacer un “select”, y cerrarla al final del procedimiento.
        Voy a probar así a ver qué tal me resulta. ¡Muchas gracias! ¡Excelente blog y tutoriales!

  3. pacios4 dijo:

    Hola, ya terminé el ejercicio y todo perfecto. Entendí perfectamente la estructura, voy familiarizándome con el lenguaje, los comandos y el significado de los símbolos. Me esta gustando mucho esto y cada vez estoy mas ansioso por profundizar mas y mas, pero me lo tomaré con calma. Como ya le dije me descargue varios tutoriales de iniciación en java y estoy mirándolos pero quiero practicar porque con la práctica es como mejor se quedan los conceptos. Seguiré mañana con el siguiente tutorial. Muchas gracias y un saludo.

  4. David Pacios dijo:

    Por cierto este es mi nombre xD

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