Conexión, consulta y ejecución de sentencias en MySQL con Java

MySQL Java

Anteriormente escribí este mismo artículo pero para bases de datos en Oracle. En este artículo prácticamente me copio y pego para explicar paso a paso cómo realizar la conexión a MySQL en Java, así como la forma de realizar consultas a los registros existentes y ejecutar sentencias de inserción, borrado y actualización de datos.

Al final del artículo tendremos una clase que encapsulará todos los procedimientos necesarios para trabajar con la base de datos.

Obtener el driver

Como toda conexión a bases de datos en Java, necesitamos un driver (también conocido como conector) para realizar la comunicación con la base de datos, en este caso necesitaremos el de MySQL, algo así como mysql-x-x-x.jar disponible para su descarga desde el siguiente enlace:

Descargar
Descargar

Crear el proyecto de NetBeans

En lo particular utilizo la que a la fecha de publicación de este artículo es la versión más reciente del NetBeans: la 7.1.1. Para crear el proyecto basta con dar clic en el botón de 'Nuevo Proyecto' o ir al menú Archivo -> Nuevo Proyecto.

Al proyecto le titularemos MySQLBD, aunque solo es un nombre sugerido ya que no afecta en lo más mínimo con el comportamiento del programa. Una vez creado el proyecto el IDE nos posicionará en la clase principal del mismo y creará por sí solo el método main desde el cual ejecutaremos todos nuestros procedimientos.

Establecer la conexión a la base de datos

Lo primero que vamos a hacer es importar las clases y/o paquetes que vamos a utilizar (los llamados import’s), en este caso solamente será el que se muestra a continuación:

   import java.sql.*;

Posteriormente dentro de la clase declararemos una variable privada de tipo Connection que será la que contendrá la conexión con la base de datos:

public class MySQLBD {    
private Connection conexion;
.
.

Para organizar el código crearemos el get y set de conexion además del método llamado conectar() el cual se encargará de establecer a la conexión con la base de datos para que posteriormente podamos realizar los procedimientos que necesitamos. Dentro del método encerraremos la mayor parte del código dentro de un try-catch con el fin de capturar las excepciones que se puedan originar tras la ejecución del mismo.

       
public Connection getConexion() {
return conexion;
}
public void setConexion(Connection conexion) {
this.conexion = conexion;
}
public MySQLBD conectar() {
try {
.
.
.
} catch (Exception e) {
e.printStackTrace();
}

return this;
}

Como puedes ver, el método devuelve una instancia de la clase MySQLBD (es decir, la misma que lo contiene), esto con el fin de poder encadenar los siguientes métodos que necesitaremos y ahorrarnos una línea de código.

Ahora bien, dentro del try-catch lo primero que realizaremos será cargar el driver en la memoria y posteriormente crear una cadena con la URL de conexión a la base de datos como se muestra en el siguiente código:

    
Class.forName("com.mysql.jdbc.Driver");
String BaseDeDatos = "jdbc:mysql://localhost/test?user=usuario&password=123";

En la URL de la conexión debes tomar en cuenta que:


  • localhost indica el host o la IP del servidor Oracle.
  • test es la base de datos.
  • user es el usuario con el que te vas a conectar.
  • password es la contraseña.

En este momento lo único que nos falta para crear la conexión es llamar al método getConnection() del driver de la siguiente manera:

 setConexion(DriverManager.getConnection(BaseDeDatos)); 

Puedes validar si la conexión se realizó correctamente verificando si la variable es nula:

            
if (conexion != null) {
System.out.println("Conexion exitosa!");
} else {
System.out.println("Conexion fallida!");
}

El método completo entonces quedaría de la siguiente manera:

   
public MySQLBD conectar() {
try {
Class.forName("com.mysql.jdbc.Driver");
String BaseDeDatos = "jdbc:mysql://localhost/test?user=usuario&password=123";
setConexion(DriverManager.getConnection(BaseDeDatos));
if(getConexion() != null){
System.out.println("Conexion Exitosa!");
}else{
System.out.println("Conexion Fallida!");
}
} catch (Exception e) {
e.printStackTrace();
}
return this;
}

Ejecutar sentencias en la base de datos

Ya que hemos realizado la conexión a la base de datos podemos trabajar con ella por lo cual crearemos un método a partir del cual ejecutaremos las sentencias más comunes que no nos devuelven resultados como INSERT, UPDATE, DELETE, etc.

Vamos a definir el método para que sea público y nos devuelva un valor booleano, true si se ejecuta la consulta correctamente, false si no. A su vez recibirá una cadena que contendrá la consulta SQL a ejecutar.

  public boolean ejecutar(String sql) {
.
.
.
}

Posteriormente, igual como lo hicimos en el método anterior, vamos a encerrar prácticamente todo el comportamiento dentro de try-catch.

  
public boolean ejecutar(String sql) {
try {
.
.
.
} catch (SQLException e) {
e.printStackTrace();
return false;
}
return true;
}

Ahora definimos un objeto tipo Statement que nos ayudará a ejecutar la consulta de la siguiente manera:

  
Statement sentencia = getConexion().createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
sentencia.executeUpdate(sql);

Por último cerramos la sentencia para liberar recursos:

 sentencia.close();

En el caso de que se presente una excepción daremos por hecho que no se realizó la ejecución correctamente, por lo tanto, sólo en ese caso retornaremos false.

El método completo luce de la siguiente manera:

public boolean ejecutar(String sql) {
try {
Statement sentencia = getConexion().createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
sentencia.executeUpdate(sql);
sentencia.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
} return true;
}

Realizar consultas a la base de datos

Lo único que nos falta es consultar a la base de datos (SELECT) lo cual haremos igualmente mediante un método público que nos devuelva un objeto de tipo ResultSet e igualmente recibirá una cadena que contendrá una consulta SQL a realizar.

 
public ResultSet consultar(String sql) {
.
.
.
}

Lo primero que vamos a agregar es una declaración del objeto de tipo ResultSet y posteriormente encerraremos la ejecución dentro de un try-catch para capturar las excepciones que se puedan generar.

public ResultSet consultar(String sql) {
ResultSet resultado = null;
try {
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return resultado;<
}

De igual manera nos apoyaremos de un objeto de tipo Statement para poder realizar la consulta.

 
Statement sentencia = getConexion().createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

Obtenemos el mapa de resultados a través del método executeQuery() del objeto Statement y posteriormente llamamos al método commit() de la conexión para asegurarnos que la consulta se está realizando.

 
resultado = sentencia.executeQuery(sql);
getConexion().commit();

En el caso de que se presente una excepción daremos por hecho que no se realizó la consulta correctamente, por lo tanto, sólo en ese caso retornaremos null.

El método completo se ve de la siguiente manera:

public ResultSet consultar(String sql) {
ResultSet resultado;
try {
Statement sentencia = getConexion().createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
resultado = sentencia.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
return null;
} return resultado;
}

Con esto tenemos completa nuestra clase que se encargará de realizar la conexión, consulta y ejecución de sentencias en la base de datos Oracle.

Probar el funcionamiento

Para verificar que todo funciona bien podemos crear una tabla en la base de datos de nombre TEST con 2 campos, IDENTIFICADOR de tipo INTEGER y DESCRIPCION de tipo VARCHAR y ejecutar lo siguiente dentro del método main:

public static void main(String[] args) {
MySQLBD baseDatos = new MySQLBD().conectar();

if (baseDatos.ejecutar("INSERT INTO TEST(IDENTIFICADOR,DESCRIPCION) VALUES(3,'TRES')")) {
System.out.println("Ejecución correcta!");
} else {
System.out.println("Ocurrió un problema al ejecutar!");
} ResultSet resultados = baseDatos.consultar("SELECT * FROM TEST"); if (resultados != null) {
try {
System.out.println("IDENTIFICADOR DESCRIPCION");
System.out.println("--------------------------------");
while (resultados.next()) {
System.out.println(""+resultados.getBigDecimal("IDENTIFICADOR")+" "+resultados.getString("DESCRIPCION"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

Como es de costumbre, el proyecto de NetBeans está disponible para descargar desde el siguiente enlace:

Descargar
Descargar

La contraseña para descomprimir el proyecto es: http://monillo007.blogspot.com.

Tus comentarios y/o preguntas son bienvenidos.

Si el código te fue útil te invito a que me ayudes a difundirlo desde los botones sociales (Twitter, Facebook, Google+).

De igual manera puedes suscribirte al blog original feed  para que los nuevos artículos lleguen a tu bandeja de correo o lector de Feeds favorito desde los enlaces del lado derecho de la página.

14 comentarios:

  1. Anónimo dijo...:

    GENIAL TU BLOG MUY BUENOS LOS TUTORIALES, TE FELICITO

  1. Luis Navarro dijo...:

    Muchas gracias :D !

  1. Jh Rodas dijo...:

    Mas claro no parece posible, mil gracias.
    El enlace de arriva es para bajar MySQL, o solo es el controlador.
    Si no, donde puedo bajar MySQL.

  1. Luis Navarro dijo...:

    Qué tal Jh Rodas,

    El primer enlace es para descargar el driver, el último es para descargar el proyecto de NetBeans, si lo que quieres es descargar el servidor de MySQL el siguiente enlace te sirve:

    :descarga: Descargar MySQL

    Saludos.

  1. Victor dijo...:

    Hola estoy tratando de hacer una consulta multiple en el programa NetBeans 7.1.1 (Java)... este esta conectado a una BD en MySQL, pero por alguna razon no me recoje los datos que espero... (ya lo probe en MySQL y todo bien... pero al momento de ejecutarlo en el programa no me lo toma. (Estoy usando la version de MySQL que trae el XAMPP 1.7.7)
    agradeceria mucho tu ayuda.

  1. Anónimo dijo...:

    hola muy bueno tu blogs me ahn servido varios tutoriales pero en este tengo problema descarge el driver y el proyecto me encantaria que pudieras ver el error y que me puedas ayudar

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

    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
    at com.mysql.jdbc.MysqlIO.(MysqlIO.java:350)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2393)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2430)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2215)
    at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:813)
    at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:243)
    at mysqlbd.MySQLBD.conectar(MySQLBD.java:30)
    at mysqlbd.MySQLBD.main(MySQLBD.java:97)
    Caused by: java.net.UnknownHostException: mysqld@localhost
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:866)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1258)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1211)
    at java.net.InetAddress.getAllByName(InetAddress.java:1127)
    at java.net.InetAddress.getAllByName(InetAddress.java:1063)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:247)
    at com.mysql.jdbc.MysqlIO.(MysqlIO.java:300)
    ... 16 more
    Exception in thread "main" java.lang.NullPointerException
    at mysqlbd.MySQLBD.ejecutar(MySQLBD.java:85)
    at mysqlbd.MySQLBD.main(MySQLBD.java:99)
    Java Result: 1
    GENERACIÓN CORRECTA (total time: 0 seconds)

  1. muy bueno tu blog hermano. Tengo una duda! mostrar un mensaje si el select no me trae resultados, es decir, al realizar el select no consigue datos con las condiciones que pido(en el select). Yo implemente lo siguiente: yo tengo un pequeño formulario y realizo el select con el contenido de los campos de texto, ahora si el usuario ingresa un numero o un texto que no esta en la base de datos el sistema me muestre un mensaje que me diga "no existen registros con esas condiciones", te muestro un pedaso del codigo:

    ResultSet resultado =consulta.executeQuery("Select * From Vista_Consulta Where serial='"+jTextField_Serial.getText()+"' or cod_activo='"+jTextField_NombreFisico.getText()+"'");
    if(!resultado.next())
    {
    JOptionPane.showMessageDialog(null,"No existen registros con éstas condiciones");
    }

  1. Anónimo dijo...:

    gracias eres muy bueno explicando

  1. Qué onda man! Oye, quiero aprender a programar, pero no sé qué tengo que nomás no se me da! Qué me recomendarías para aprender a programar? Digo, sé que lo básico de aprender a hacer algoritmos, descomponer un problema en partes sencillas, aprender Orientación a Objetos y cosas así, pero por más que lo intento, no puedo aprender a programar!

    Me podrías ayudar? Mi correo es paziffic.prince@gmail.com

    Muchas gracias de antemano!

  1. yarell dijo...:

    Hola, me gusto mucho tu post pero tengo una duda. Como puedo hacer una consulta en netbeans que dependa de lo que esta ingresando el usuario, mira tengo esta consulta y no me marca ningún error pero a la hora de mostrar dicha consulta no se ve nada.
    String sql =("select descripcion,codigo_ropa,cantidad from lineas where num_pedido="+txtPedido.getText());
    Por favor ayudame, gracias.

  1. Anónimo dijo...:

    gracias por lo general no hago comentarios pero en realidad me interesa lo probare y vere q sucede bueno espero sigan ayudando a la comunidad conn estos aportes grax!!

  1. Erick Reyes dijo...:

    Gracias por el tutorial amigo estoy empezando con java en la empresa donde trabajo y me ha sacado de apuros, Gracias muy bueno el tutorial muy claro

  1. Ernesto Garcia dijo...:

    Al descomprimir el archivo me salen que estan dañados los archivos.

  1. Ernesto Garcia dijo...:

    No puedo descomprimir los archivos me marcan que estan dañados

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

 
Monillo007 © 2010 | Designed by Trucks, Manual Bookmarking | Elegant Themes