Está en la página 1de 18

Como conectar Mysql con Java?

julio 9, 2014 James Revelo

Conectar tus aplicaciones Java a un servidor de bases de datos es


imprescindible para la funcionalidad de una solucin de Software. Al
igual que Sql server y C#, Mysql y Javanecesitan de una interfaz que
proporcione las clases necesarias para gestionar una conexin.
Para comprender el funcionamiento de este enlace comenzaremos
explicando como adherir elAPI de conexin a nuestros IDEs ( en este
caso veremos como hacerlo con Netbeans yEclipse), luego
implementaremos el cdigo para abrir la conexin. En seguida
veremos comoejecutar comandos y al finalizar estudiaremos
la ejecucin de procedimientos almacenados.

Que es el API de conexin?

Es un conjunto de interfaces relacionadas que permiten realizar una


conexin de un servidor de bases de datos a una aplicacin Java.
Normalmente se le denomina JDBC (Java Database Connectivity).La

idea es usar un Driver que gestione el acceso a un servidor Mysql, y as


abrir la conexin con la intencin de ejecutar comandos en la base de
datos. Este Driver puedes descargarlo desde aqu o ir al sitio
original de descargas:
http://www.mysql.com/downloads/

Como incluyo el Driver en NetBeans?


Es sencillo! Primero extraes el Driver en un lugar especifico que te
parezca cmodo, por ejemplo a la ruta C:mysqlDriver. Luego entra
a Netbeans y sitate en la barra de herramientas Projects.

Explorador de proyectos en Netbeans


Ahora haz clic derecho en la carpeta Libraries y presiona la opcin
Add JAR/FOLDER .

Aadiendo un nuevo JAR al proyecto

Ahora busca el archivo mysql-connector-java-5.1.31-bin.jar en la


carpeta descomprimida.

Seleccionando el conector
Cuando hayas incluido el archivo, el explorador de proyectos mostrar
una nueva dependencia hacia el conector. Ahora ya puedes conectar tu
aplicacin Java y una base de datos en Mysql.

Nueva dependencia en nuestro proyecto

Como instalo el Driver en Eclipse?

La instalacin en este IDE es muy similar a Netbeans. Recuerda que el


primer paso es extraer el archivo del conector en un lugar conveniente
para ti. Ahora enfocate en la barra de herramientas llamada Package
Explorer:

Explorador de paquetes en Eclipse


Ahora agregaremos la dependencia de nuestro archivo .jar. Para ello
haremos clic derecho en el proyecto y seguiremos la ruta Build
Path>Add External Archives

Aadir el arhivo JAR de conexin


Busca el archivo mysql-connector-java-5.1.31-bin.jar en donde
extrajiste el conector y seleccinalo.

Seleccion del conector MySQL


Si todo sali bien, tendrs una nueva librera externa con el nombre de
nuestro conector. Con eso ya podrs ejecutar acciones sobre las base de
datos del servidor Mysql.

Dependencia adicional a nuestro Conector

Como realizo la conexin a mi base de datos?


Primero incluiremos todas las clases JDBC desde el paquete sql:
import java.sql.*;

En este paquete se encuentran las clases para registrar la conexin a


nuestra base de datos,crear un comando, crear instancias
para ejecutar procedimientos y mucho mas.
Luego inicializamos el Driver con el mtodo
esttico Class.forName(). Este mtodo le dice a lamquina virtual
de Java que busque en tiempo real la clase en el directorio de variables
(PATH,CLASSPATH, etc) .En el caso de Netbeans y Eclipse tambin
buscar en las directivas del proyecto adicionales.

try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
System.out.println("Registro exitoso");

} catch (Exception e) {

System.out.println(e.toString());

Ahora para abrir la conexin usamos la interfaz Connection, la cual


recibe la referencia del servidor de bases de datos a travs del
mtodo getConnection() de la interfaz DriverManager:

Connection con = null;


//...

try {

con = DriverManager.getConnection(
"jdbc:mysql://localhost/TuBaseDeDatos?"

+ "user=TuUsuario&password=TuPass");

// Otros y operaciones sobre la base de datos...

} catch (SQLException ex) {

// Mantener el control sobre el tipo de error


System.out.println("SQLException: " + ex.getMessage());

El String que recibe getConnection() se refiere a al cadena de


conexin para acceder a nuestra base de datos. Debemos indicar
el nombre del servidor, el nombre de la base de
datos, usuario y password. Hay otros parmetros adicionales, pero
estos son bsicamente los que permiten un acceso rpido y corriente a
la base de datos.
Veamos la sintaxis:

jdbc:mysql://[host:puerto],[host:puerto].../[base_de_datos][?propiedad1][=valor1]
[&propiedad2][=valor2]...

Aquellas partes que se encuentran en corchetes son opcionales.


Finalmente usa el mtodoclose() para cerrar la conexin de forma
segura.

con.close();

Que hago para ejecutar un comando?


Usaremos la clase Statement (sentencia, esp.) para realizar
operaciones sobre nuestra base de datos. Crearemos una instancia de la
clase con el mtodo createStatement() de la claseConnection:

Statement cmd = con.createStatement();

Recuerda que una consulta (SELECT) retorna en una o mas filas de una
tabla. En cambio la insercin, modificacin y eliminacin cambian la
base de datos, pero no retornan en una estructura tabular.
Teniendo en cuenta esto, usaremos dos mtodos distintos de la
clase Statement dependiendo del tipo de comando. Si vas a
implementar un comando INSERT, DELETE, UPDATE, SET, etc., usas el
mtodo executeUpdate():
try {
cmd = con.createStatement();

cmd.executeUpdate("DELETE FROM HERRAMIENTA WHERE NOMBRE = 'Serrucho'");


// ...
}

Como ves, executeUpdate() recibe como parmetro la cadena que


representa al comando. En el caso de usar SELECT, emplearemos el
mtodo executeQuery(), cuyo resultado es de tipoResultSet. Esta
clase hace parte del paquete sql que importamos, y sirve para manejar
las filas retornadas de una consulta.
Por ejemplo
ResultSet rs = null;
Statement cmd = null;

// ...

try {

cmd = con.createStatement();

rs = cmd.executeQuery("SELECT NOMBRE, EDAD FROM CIUDADANO");

// ...
}

Ahora, si queremos ver en pantalla los resultados o simplemente


acceder a cada fila, usaremos el mtodo next() de la clase ResulSet.
Este mtodo nos permitir mover un puntero de lectura a la siguiente
fila del resultado en forma secuencial, hasta que se haya recorrido la
tabla completa. Usaremos un while que lea todo el resultado.

while (rs.next()) {
String nombre = rs.getString("NOMBRE");
int edad = rs.getInt(2);
System.out.println(nombre + "-" + edad);
}

rs.close();

El cdigo anterior implementa los


mtodos getString() y getInt() de ResultSet. Ambos mtodos
obtienen el valor de la columna retornada, especificando el nombre de
la columna o su posicin. Es importante cerrar el
objeto ResultSet con close() para desreferenciar el puntero que
estaba recorriendo la tabla.

Quisiera saber como generalizar mis comandos!


Es justamente lo que quera explicarte!, ya que hacer genrico un
comando es esencial para combinarlo con los datos proporcionados por
los controles Swing de Java.
Supn que un usuario va a eliminar un cliente de la base de datos a
travs del cdigo. Como hacer para embeber este cdigo en
el String de comando?
La respuesta esta en la clase PreparedStatement. Esta clase
permite ejecutar varias veces un comando con tan solo

una definicin genrica. Para ello usaremos el carcter ?, el cual


otorgacapacidad polimorfa al parmetro incluido en el comando.
Esta es la respuesta a la pregunta inicial:

PreparedStatement pCmd = con.prepareStatement("DELETE FROM CLIENTE" + " WHERE ID


= ? ");
// ...
int valor = Integer.parseInt(jTextField1.getText());
pCmd.setInt(1, valor);
pCmd.executeUpdate();

Como ves, usamos ? para indicar que el cdigo del cliente ser
variable. Luego usamos el mtodo setInt() para especificar que en el
primer ? vamos a poner el valor de la variable extrado del Text Field.

Como hago con los procedimientos


almacenados?
Empleamos la clase CallableStatement. Esta clase permite especificar
el tipo de parmetros que tiene el procedimiento, ya
sea IN, OUT o INOUT. Ademas permite gestionar los resultados en
forma tabular que arroje el procedimiento, si es que los arroja, u obtener
el valor de los parmetros tipo OUT.
Para crear un comando ejecutable usaremos el
mtodo prepareCall() de la clase Connection, veamos:

CallableStatement cmdC = con.prepareCall(ejecucin_procedimiento);

Para hacer la llamada del procedimiento se deben usar llaves {} en la


elaboracin de la cadena para el comando. Recuerda que cuando
vimos procedimientos en Mysql usbamos la clausulaCALL para
ejecutarlo. Aqu tambin usaremos CALL para ejecutar el comando y
adems aadiremos el carcter ? para indicar el polimorfismo de los
parmetros.

CallableStatement cmdC = con.prepareCallable("{CALL proc_dos_parametros(?,?)}");

Por defecto los parmetros son de entrada, pero si en algn momento


deseas establecer que alguno es de salida, debes registrarlo mediante el
mtodo registerOutParameter().

cmdC.registerOutParameter(2,Types.INTEGER);

Este mtodo recibe dos parmetros, el primero es la posicin del


parmetro y el segundo es eltipo del parmetro. El tipo lo indicamos
mediante los atributos de la clase Types, la cual contiene todos los tipos
de datos empleados en Mysql. En este caso en particular registramos al
segundo parmetro como OUT y de tipo INTEGER.
Ahora para alimentar los parmetros de entrada volvemos a usar los
mtodos set. Dependiendo del tipo de dato existen las
alternativas setInt(), setString(), setDate(), setFloat(), etc. Todo
depende de las necesidades.

Y como ejecuto un procedimiento almacenado?


Primero usaremos el mtodo execute(), cuyo valor de retorno
es booleano. Si retorna en truesignifica que el procedimiento
devuelve una o mas filas, por lo que usaremos luego el
mtodogetResultSet(). Si el valor es false, entonces el procedimiento
se ejecuta con el mtodoexecuteUpdate() ya que solo modifica la base
de datos:

if (cmdC.execute()) {
ResultSet rs = cmdC.getResultSet();
//Otras acciones...

} else {

System.out.println("No se retornaron resultados");

Igual que con los comandos normales usaremos los mtodos get para
obtener los resultados de los parmetros tipo OUT.

System.out.println("Parametro OUT:"+cmdC.getInt(1));

Amigo, puedes mostrar un ejemplo completo?


Claro que si!, fjate en la siguiente situacin:
Suponga que le ha vendido un proyecto de Software a
la aseguradora ProtectYAPApara gestionar los clientes y la
informacin sobre los seguros que se ofrecen. Usted y su equipo se dan
cuenta que necesitan invocar un procedimiento almacenado en el
servidor Mysql, cuya funcin es encontrar los clientes mayores a una
edad pasada como parmetro. A travs de la interfaz, el usuario final
digitar el valor mediante unJTextField , que est contenido en
un JFrame de reglas.
Para solucionar el anterior problema implementaremos el siguiente
cdigo:

try {
con = DriverManager.getConnection(
"jdbc:mysql://PROTECTYAPA-SERVER/aseguradora?"
+ "user=admin&password=admin");

CallableStatement cmd = con.prepareCall("{CALL sp_clientes_edad( ?)} ");

cmd.setString(1, jTextField1.getText());

// Ejecutamos el comando
if (cmd.execute()) {

// Obtenemos la tabla retornada


ResultSet rs = cmd.getResultSet();

// Obtenemos cada fila del resultado


while (rs.next()) {
addFila(new Object[]{rs.getString("NOMBRE"), rs.getString("APELLIDO")});
}

else{
System.out.println("No se retornaron filas");
}

} catch (SQLException ex) {


// Mantener el control sobre el tipo de error
System.out.println("SQLException: " + ex.getMessage());
}

El mtodo addFila() que invocamos es la implementacin modular de la


agregacin de filas a unJTable. Su definicin es la siguiente:

public void addFila (Object fila[]){


DefaultTableModel modelo = new DefaultTableModel();
modelo = (DefaultTableModel) jTable1.getModel();
modelo.addRow(fila);
}

Algn ejemplo con un parmetro OUT?


Por supuesto!, miremos otro requerimiento en el Sofware de
la empresa de seguros:
Se desea llamar a un procedimiento almacenado en la base de datos
llamadosp_mejor_vendedor. Este procedimiento posee

dos parmetros de salida que reciben el cdigo del mejor vendedor


de seguros y la cantidad acumulada de ventas que realiz en el mes.
La solucin propuesta por el equipo es la siguiente:

try {
con = DriverManager.getConnection(
"jdbc:mysql://PROTECTYAPA-SERVER/aseguradora?"
+ "user=admin&password=admin");
CallableStatement cmd = con.prepareCall("{CALL sp_mejor_vendedor( ?, ?)} ");

// Registramos los dos parmetros de salida


cmd.registerOutParameter(1, Types.INTEGER);
cmd.registerOutParameter(2, Types.INTEGER);

// Ejecutamos el procedimiento
cmd.executeUpdate();

// Obtenemos el valor de ambos parametros


int idVendedor = cmd.getInt(1);
int monto = cmd.getInt(2);

// Imprimimos los resultados del procedimiento


System.out.println(idVendedor + "-" + monto);

} catch (SQLException ex) {


// Mantener el control sobre el tipo de error
System.out.println("SQLException:" + ex.getMessage());
}

Estos pequeos ejemplos que acabo de mostrarte han sido construidos


de forma secuencial yexplicativa, pero seria conveniente que uses el
poder de la Programacin Orientada a Objetos cuando desees
conectar tu aplicacin Java a Mysql.

Puedes definir una clase Conexion y atribuirle mtodos para ejecutar


comandos que devuelvan filas, ejecutar comandos que solo modifiquen
la base de datos, abrir la conexin, cambiar de base de datos, etc.
Este enfoque te permitir generalizar tus acciones sobre la base de
datos en tu aplicacin, lo que otorgara flexibilidad en el desarrollo si
trabajas con un equipo.

/*
* PruebaMySQL.java
*
* Programa de prueba para conexin a una base de datos de MySQL.
* Presupone que el servidor de base de datos est arrancado, disponible,
* en el puerto por defecto.
* El usuario y password de conexin con la base de datos debe cambiarse.
* En la base de datos se supone que hay una base de datos llamada prueba
y que
* tiene una tabla persona con tres campos, de esta manera:
* mysql> create database prueba;
* mysql> use prueba;
* mysql> create table persona (id smallint auto_increment, nombre
varchar(60),
*
nacimiento date, primary key(id));
*/
package chuidiang.ejemplos.base_datos;
import java.sql.*;
/**
* Clase de prueba de conexin con una base de datos MySQL
*/
public class PruebaMySQL {
/**
* Crea una instancia de la clase MySQL y realiza todo el cdigo
* de conexin, consulta y muestra de resultados.
*/
public PruebaMySQL()
{
// Se mete todo en un try por los posibles errores de MySQL
try
{

// Se registra el Driver de MySQL


DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
// Se obtiene una conexin con la base de datos. Hay que
// cambiar el usuario "root" y la clave "la_clave" por las
// adecuadas a la base de datos que estemos usando.
Connection conexion = DriverManager.getConnection (
"jdbc:mysql://localhost/prueba","root", "la_clave");
// Se crea un Statement, para realizar la consulta
Statement s = conexion.createStatement();
// Se realiza la consulta. Los resultados se guardan en el
// ResultSet rs
ResultSet rs = s.executeQuery ("select * from persona");
// Se recorre el ResultSet, mostrando por pantalla los
resultados.

while (rs.next())
{
System.out.println (rs.getInt ("Id") + " " + rs.getString

(2)+

" " + rs.getDate(3));


}
// Se cierra la conexin con la base de datos.
conexion.close();

}
catch (Exception e)
{
e.printStackTrace();
}

/**
* Mtodo principal, instancia una clase PruebaMySQL
*
* @param args the command line arguments
*/
public static void main(String[] args)
{
new PruebaMySQL();
}
}

///////
***-

Conexin Mysql con Java, usando IDE Eclipse Java EE


En este blog vamos a necesitar algunas herramientas como: editor de java,
servidor de base de datos, estos pasos nos ayudaran a llegar a nuestro fin.

1.
2.
3.
4.
5.
6.
7.

8.

En primer lugar descargamos e instalamos Eclipse


enhttp://www.eclipse.org/downloads/
Descargamos el conector JDBC para mysql
enhttp://dev.mysql.com/downloads/connector/j/
Abrimos Eclipse, nos ubicamos en Window, Open Perspective, Other,
Database Development.
Click Derecho en Database Connections, New.
En perfil de conexiones, escogemos MySQL, siguiente.
Driver, click en definir nuevo driver.
Especificamos el Driver, tal como se muestra en la imagen.

Click en la pestaa JAR List, limpiamos los drivers, ubicamos nuestro Driver
JDBC de mysql, el archivo .jar, listo.
9.
Configuramos los detalles de la conexin como: Database, URL, username y
password, como se muestra a continuacin.

Probamos la conexin que sea correcta, y podemos empezar a trabajar con la base
de datos en nuestros proyectos.

También podría gustarte