gentoo linux, java, software libre y otras hierbas
nov, 19 2007 - 2:01 pm

Ejemplo básico de programación con JDBC y MySQL

En esta entrada pretendo explicarles un poco el funcionamiento básico de JDBC, cuando desarrollamos aplicaciones en Java que trabajan con bases de datos en MySQL. La idea es mostrar paso a paso la creación de la base de datos, y posteriormente la codificación de una aplicación en Java que consulte los datos. Los lectores que me conocen, saben que me gusta explicar todo detalladamente, para que no que de duda alguna a los que están aprendiendo. Let’s Go!

Creando la base de datos

Es de suponer que si estás leyendo esto, tienes ya conocimientos acerca de la creación de bases de datos en MySQL, así como instrucciones en general del lenguaje SQL. Por tanto no nos quedaremos en este punto explicando qué es y cómo se usa MySQL, sino que vamos directo a hacer la base de datos (si se le puede llamar así) que usaremos para jugar hacer las pruebas.

Entonces, abrimos una consola de SQL y ejecutamos los siguientes comandos:

Crear la base de datos y usar la misma:

mysql> create database ejemplo;
mysql> use ejemplo

Crear la tabla de ejemplo e insertar algunos datos:

mysql> create table datos (cod int(2), nombre varchar(30));
mysql> insert into datos values(1, ‘Debian’);
mysql> insert into datos values(2, ‘openSuse’);
mysql> insert into datos values(3, ‘Gentoo’);
mysql> insert into datos values(4, ‘Fedora’);

Codificar el programa que consulte dichos datos

En pos de no complicar la cosa, y de hacerla más sencilla, la aplicación que vamos a hacer NO posee interfaz gráfica, es decir, vamos mostrar los datos por la consola. Entonces, lo esencial en este caso es tener instalado el conector de MySQL para JDBC, no más.

Primer programa: consultando la base de datos de manera simple

import java.sql.*;
public class Programa {
public static void main(String args[]){
try {
//Cargar clase de controlador de base de datos
Class.forName("com.mysql.jdbc.Driver");
//Crear el objeto de conexion a la base de datos
Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/ejemplo?user=root&password=");
//Crear objeto Statement para realizar queries a la base de datos
Statement instruccion = conexion.createStatement();
//Un objeto ResultSet, almacena los datos de resultados de una consulta
ResultSet tabla = instruccion.executeQuery("SELECT cod , nombre FROM datos");
System.out.println("Codigo\tNombre");
while(tabla.next())
System.out.println(tabla.getInt(1)+"\t"+tabla.getString(2));
}
catch(ClassNotFoundException e){ System.out.println(e); }
catch(SQLException e){ System.out.println(e); }
catch(Exception e){ System.out.println(e); }
}
}

Cosas por explicar en el programa anterior:

  • Es necesario importar el paquete java.sql
  • Class.forName(“com.mysql.jdbc.Driver”); Con esta instrucción cargamos el driver de conexión a la base de datos en MySQL. Si somos algo curiosos, podemos notar que dentro del conector (en mi caso mysql-connector-java-5.1.5-bin.jar), se encuentra el archivo Driver.class dentro de las carpetas com/mysql/jdbc.
  • DriverManager.getConnection Luego de cargar el Driver, es necesario crear la conexión a la base de datos. Para ello usamos el método getConnection de la clase DriverManager (que implementa la clase Driver). A dicho método le pasamos como parámetro una URL de conexión a la base de datos, que se compone, por lo general, de tres partes separados por “:”, jdbc:nombre_dbms:datos_de_conexion. Aunque esto depende del tipo de DMBS y conector que usemos. (Para más detalles de la URL, ver la documentación específica para el conector).
    Este método además, devuelve un objeto Connection que usaremos para crear y ejecutar sentencias SQL, sobre la base de datos.
  • conexion.createStatement(); este método crea/decuelve un objeto Statement, con el cual podremos ejecutar sentencias en la base de datos.
  • instruccion.executeQuery(); este método sirve para ejecutar consultas sobre la base de datos (para inserción y modificación de datos usar executeUpdate()). Recibe como parametro una sentencia SQL, y devuelve un objeto ResultSet que contendrá los datos de la consulta.
  • while(tabla.next()) esto nos permitirá iterar indefinidamente, mientras en el objeto ResultSet hayan más registros.
    • Posteriormente, dentro del while, podemos obtener los datos de la fila actual con los métodos getInt(int) y getString(int) de ResultSet. A dichos métodos le pasamos como parametro el indice de la columna que queremos obtener.
      Es importante tener en cuenta que en dichos métodos, si una tabla tiene 3 columnas, las referenciamos como 1, 2 y 3. No como en otros lenguajes (PHP por ejemplo), en los que los índices serían 0, 1, 2.
  • Las excepciones que manejamos son básicamente: ClassNotFoundException, que se lanzará por lo general cuando el programa no encuentre el Driver. SQLException, que se lanzará cuando hayan errores a nivel de SQL (errores al insertar datos, errores de sintaxis en las consultas, etc.).

#javac Programa.java
#java Programa
Codigo Nombre
1 Debian
2 openSuse
3 Gentoo
4 Fedora

Segundo programa: consultando la base de datos de manera “elegante”

Veamos entonces otra forma de consultar (los mismos datos), pero de una manera un poco más elegante:

import java.sql.*;
public class Programa2 {
public static void main(String args[]){
try {
//Cargar clase de controlador de base de datos
Class.forName("com.mysql.jdbc.Driver");
//Establecer conexion a la base de datos
Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/ejemplo?user=root&password=");
//Crear objeto Statement para realizar queries a la base de datos
Statement instruccion = conexion.createStatement();
//Consultar a la base de datos
ResultSet conjuntoResultados = instruccion.executeQuery("SELECT cod AS Codigo, nombre AS Nombre FROM datos");
//Procesar los resultados de la consulta
StringBuffer resultados = new StringBuffer();
ResultSetMetaData metaDatos = conjuntoResultados.getMetaData();
int numeroDeColumnas = metaDatos.getColumnCount();
for(int i = 1; i <= numeroDeColumnas; i++)
resultados.append(metaDatos.getColumnName(i)+"\t");
resultados.append("\n");
while(conjuntoResultados.next()) {
for(int i = 1; i <= numeroDeColumnas; i++)
resultados.append(conjuntoResultados.getObject(i) + "\t");
resultados.append("\n");
}
System.out.println(resultados.toString());
}
catch(ClassNotFoundException e){ System.out.println(e); }
catch(SQLException e){ System.out.println(e); }
catch(Exception e){ System.out.println(e.getMessage()); }
}
}

Miremos las diferencias:

  • En este caso, además de usar elobjeto ResultSet para almacenar los datos, usaremos un objeto ResultSetMetaData para obtener los meta-datos de la consulta (los nombres de las columnas, por ejemplo).
  • metaDatos.getColumnCount(); este método retorna un entero con el número de columnas que posee una consulta.
  • metaDatos.getColumnName(i) este método devuelve el nombre de la columna i.
  • conjuntoResultados.getObject(i) este método devuelve un objeto tipo Object que contendrá los datos de la fila actual, y de la columna i.

#javac Programa2.java
#java Programa2
cod nombre
1 Debian
2 openSuse
3 Gentoo
4 Fedora

Descargar código fuente:

Ya saben: cualquier duda pueden comentarla aquí mismo, y pueden usar el contenido de esta entrada como deseen. ¡El conocimiento es poder! ¡Comparte tú poder!

103 Comentarios | deja el tuyo

Un enlace entrante

102 Comentarios en “Ejemplo básico de programación con JDBC y MySQL”

  1. julio herrera dice:

    Saludos Casidiablo. Tengo una duda grandisima. Primera vez que subo un sitio web completo a la red. Soy Desarrollador de software. Por mas que le he dado vueltas al codigo de mi pagina jsp catalogo, no he podido hacer que muestre la informacion (tabla producto) contenida en la base de datos mysql. Tengo mi sitio web hecho en jsp de venta de muebles. Tanto el hosting (jsp tomcat) como el registro del dominio lo hice con la misma empresa. Ellos me dieron toda la informacion necesaria para que pudiera subir mi sitio ya sea por ftp o mediante cpanel y para que mi pagina jsp se pudiera comunicar o conectar con bases de datos mysql. el plan de hosting contratado con ellos me ofrece la opcion de phpmysqladmin y mysql remoto (conectarme desde otra computadora a mysql remotamente). En mi computadora, utilizando como servidor de pruebas apache tomcat ejecuto mi pagina jsp que tiene configurado o codificado el driver mysql, el nombre del servidor donde esta mysql, user, y password (dados por la empresa del hosting) y todo lo necesario para que pueda acceder a la base de datos mysql REMOTAMENTE desde mi PC. Al cargarse la pagina se muestra la imagen de los productos, su descripcion, codigo, precio, etc PERFECTAMENTE. O sea, que mi pagina se esta conectando correctamente a la Base de datos mysql. Subo nuevamente todo mi sitio web al servidor de la empresa que le contrate el hosting y al abrir mi pagina web para ver el catalogo de productos, NO MUESTRA NINGUN DATO ALMACENADO EN LA BASE DE DATOS, NI TAMPOCO ME ENVIA NINGUN ERROR DE CONEXION, NI NADA!. solo el fondo de mi pagina web con el titulo pero nada de la informacion de la base de datos.

  2. JavierT dice:

    Hola, es la primera vez que he tenido que utilizar Threads y me volvia loco con los errores de conexión.
    Me lo soluciono la línea en la que cargas el controlador de base de datos, que ahunque lo tengo cargado en modo grafico con el Netbeans, me daba errores con los threads.
    Lo desconocia y ahora meva perfecto.
    Saludos!

  3. juanjose720 dice:

    Buenas noches hermano primero que nada mis felicitaciones por tomarte de tu tiempo y compartir tus conocimientos… hermano tengo una pequeña duda estoy haciendo un pequeño sistema para una materia de la uní en la cual me piden tres operaciones con base de datos
    1-) guardar datos de un formulario: ya está operativa
    2-) la siguiente la de consulta a través de un numero de cedula o número de pasaporte, pero aquí es en donde está el detalle o la parte que nos sé, me explico un poco mejor, esa consulta a la base de datos esta funcional, pero aquí aparte de hacer esa consulta tengo que mostrarla en unos jtextfield, jconbox jtexarea esto lo ice sin ningún inconveniente, pero la parte q no se es actualizar la base de según esos datos que anteriormente ya había cargado jtextfield, jconbox jtexarea.
    Mi idea era que una vez que carga todos los capos del formulario el cual tiene dos botones Guardar y Cancelar, al presionar el de guardar este tome el campo cedula/pasaporte y busque ese registro y según esa consulta modifique esos campos correspondientes a esa cedula/pasaporte.
    Si sabes hacerlo serias tan amable de explicármelo te estaría muy agradecido. Saludos.. suerte

  4. juan dice:

    excelente ejemplo, muy bien explicado, muchas gracias

  5. ARIEL dice:

    Muy buen ejemplo. Es muy útil para empezar a programar en JAVA y MSQL

  6. Manmeluchi dice:

    Pedazo de manua.Con gente como da gusto ponerse a programar!Muchas gracias casidiablo!

  7. Jender dice:

    Saludos, necesito crear un boton q me permita ingresar datos a la base, tendran un codigo q me sirva de apoyo? Estare muy agradecido…

  8. jonathan dice:

    alludame a hacer mi base de datos para la u por fis

  9. Oscar dice:

    Hola to esta correcto, pero mi duda es como paso esa consulta a un jsp, para que se muestre en la web, te agradeceria mucho se me das una mano con esto gracias.

  10. Rodrigo dice:

    Esta muy bueno, sencillo y bien explicado este ejemplo, solo que todo me corre muy bien solo que no me muestra nada;

    run:
    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    BUILD SUCCESSFUL (total time: 1 second)

    Y eso es todo, lo mismo me pasa para los 2 ejemplos

    • Hector dice:

      Rodrigo revisa que estés importando java.sql* o los siguientes paquetes :

      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;

      en vez de import com.mysql.jdbc.Connection; etc.

      también revisa que en tus bibliotecas tengas agregada la de mysql Driver JDBC como la siguiente mysql-connector-java-5.1.6-bin.jar

      puede que te falte algo … ojala te ayude !!

  11. GIO dice:

    PUTAS MAMANDAS

  12. jamil dice:

    Hola! Gracias hermano por fomentar la programacion.Que bueno que existan personas que esten dispuesta a enseñar.

    T e solicito hermano que nos enseñe a crear una base de dato en sql ,con consulta basica como insert,select,update,y con algunos disparadores ,ya que la verdad que no he visto esto por internet con ide netbean.

    saludos y gracias….

  13. Albert dice:

    La historia es así :) no conozco mucho de ubuntu, instale xammp, luego apt-get install de los siguientes paquetes mysql-client-core-5.1, mysql-cluster-client-5.1

    Cree la tabla, todo bien.

    Ejecute el programa java y me lanza el siguiente error:

    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    al archivo .jar le di permisos de a+rwx no funciona! :S luego el classpath le coloque la ruta al archivo .jar, pero nada tampoco…

    ¿Alguna idea?

    grax excelente tutorial :)

  14. jesus dice:

    gracias por explicar como funciona

  15. Todo esta bien, solo quería agregar una cosa mas.

    Si por alguna razón vas a ejecutar muchos queries de tipo consulta (select) debes al finalizar estas dejar el statement en nulo, darle un

    statement.clearBatch();
    statement.clearWarnings()
    statement.close();

    Puesto que este siempre esta creando objetos y deja todo resultado en la memoria y por alguna razón el garbage collector no actúa con el. Me lo tope en un proyecto de verdad donde de repente la memoria ram usada por el programa se aumentaba, Esa era la causa.

    Saludos

¡Déjanos tu comentario!