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 ejemploCrear 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.
- 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.
- 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





Muy buen post! Se te agradece que puedas compartir tus valiosos conocimientos! Como dice otro comentario, con blogs asi provoca estudiar programación! Suerte!
bien,bien
wao amigo me acabas de enseñar lo k he buscado en tantos libros
gracias en serio
HOLA, MUY BIEN EXPLICADO PERO NECESITARIA SI ME PODRIAN EXPLCAR UN ABM CON SQL SERVER Y ACCESS PERO ME SIRVIÒ MUCHO… GRACIAS
Hola estoy comenzando con la conexion a MySQL e hice un ejercicio desde Consola en Windows, pero quiero hacerlo en la Terminal de Ubuntu, mi problema esque no sé como indicarle donde está el conector java mysql a mi aplicacion, quiero hacerlo todo desde la Terminal, en el cmd de windows si pude con un codigo parecido a este:
java -classpath .;C://…/mysql-connector-java-5.0.8-bin.jar nombreAplicacion
Cómo seria desde la terminal de Ubuntu?
Es igual, solo que con
:en vez de;java -classpath .:/ruta/del/mysql-connector-java-5.0.8-bin.jar nombreAplicacionHola…. el tuto esta excelente solo ke……… me niega el acceso a mi DB aunke ponga user=root y pass=root….. asi esta configurado mysql…… ke podra ser…. algo estoy haciendo mal???
Bien ayer hice esta pregunta y ya pude resolverlo……… primero tenia configurar las conexiones de mysql en la pestaña de Services (ahi es donde se colocan los datos de user, pass, nombre del host—en mi caso localhost,etc)…… y luego en esta linea la tuve ke modificar……..Connection conexion = DriverManager.getConnection(“jdbc:mysql://localhost:3306/ejemplo”,”root”,”root”);………. Conclusion…. exelente aportacion si sirvio el tuto gracias……
Hola, ya logré hacer el ejemplo en netbeans, pero no puedo hacer que el programa corra desde la consola. Ya he copiado el archivo mysql-connector-java-5.1.18-bin.jar en la carpeta C:\Program Files (x86)\Java\jdk1.7.0\jre\lib\ext , pero aun me sigue diciendo que la clase no existe.
Ya he agregado la direccion a la variable de entorno classpath, y aun asi no jala.
No entiendo la razon de que en netbeans funcione y en cmd no. Supongo que neatbeans abre y agrega los contenidos de los archivos .jar del jdk, y por eso no tiene problema.
Muchas gracias por el aporte, esta muy bien explicado!
No se si me puedes ayudar con la devolucion de un resultado en un web service?
Quiero hacer un select y que me devuelva el resultado (nombre, apellido) de acuerdo a un id de una tabla en mysql.
Muchas gracias por su comprension
hay que haceer la conexion en el Method y que retorne el registro, en el SOAP Response tienen que estar los resultados devueltos.
Creo que solo es de configurar la conexion, porque netbeans ya crea el wsdl.
Gracias!
codigo:
conexion… … …
… …
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); }
return null;
Si lo dejo asi, me tira el Reseponse
SOAP Response
y quiero que tire el resultado de la consulta en la parte de retun.
No va a tirar todo el contenido de la tabla en el resultado, porque solo es un registro de acuerdo a la condicion en el where.
Gracias por su comprension.
Hola, estoy trabajando en netbeans y tengo un problema dentro del bloque que itera resulSet.next(). Alli realizo varias consultas para obtener otros datos de la bdatos.(defino nuevas variables ResultSet) pero luego al hacer referencia a mi variable resultSet de la iteracion me la da como vacia. Lo que hice fue volver a usar la variable resultSet y realizar la misma consulta que habia realizado en un comienzo antes de volver usarla, pero sigue sin funcionar.
Que podria estar pasando?
muchas gracias
Yo tengo una duda, como puedo llenar los datos de una base de datos con jdbc? Tengo un fichero donde contiene todos los datos y no se como meterlos. Tiene que ser con jdbc.
Muchas gracias.
Gracias a tu ejemplo logre lo que queria, lo felicito por lo que hace.