Conectar Java con MySQL usando JDBC

4 febrero, 2010 por Herman Barrantes Dejar una respuesta »

java mysql

Para conectar Java con cualquier base de datos lo primero es conseguir el Driver adecuado, un Driver es una clase que sirve como interfaz entre nuestra aplicación y la base de datos.

Es lógico que Java (JDK) no cuenta con todos los Drivers para poderse conectar con todos los motores de base de datos existentes en el mercado, por lo que en algunos casos es necesario descargarlos de internet, en el caso de MySQL se puede descargar desde: http://dev.mysql.com/downloads/connector/j/5.1.html

Si se esta usando NetBeans como IDE de trabajo no es necesario bajar este Driver ya que el mismo NetBeans lo trae incorporado. En el caso de Eclipse es necesario bajar el Driver, descomprimir el ZIP y añadirlo al proyecto, para esto damos con el botón derecho del ratón sobre el proyecto, para sacar el menú y elegimos “properties”->”java build path”->”Libraries”->”Add external JARs…” y seleccionamos nuestro JAR (el que viene dentro del ZIP que descargamos con el nombre de mysql-connector-java-x.x.x-bin.jar).

Para NetBeans en el árbol de nuestro proyecto damos con el botón derecho del ratón sobre “Bibliotecas” para sacar el menú y elegimos “Agregar biblioteca…”

netbeans agregar biblioteca

Les aparecera una venta como esta:

netbeans agregar biblioteca

Seleccionamos “Driver MySQL JDBC” y los agregamos, en el árbol de proyecto se tiene que ver el Driver que acabamos de añadir

netbeans agregar biblioteca

Ya con el Driver instalado vamos ha hacer un ejemplo en el conectaremos nuestra aplicación Java con una base de datos MySQL, haremos una consulta sobre una tabla y cerraremos la conexión.

Para este ejemplo crearemos una base de datos la cual llamaremos “javamysql” con una única tabla llamada “persona”, corre el siguiente Script en MySQL

-- MySQL Administrator dump 1.4
--
-- ------------------------------------------------------
-- Server version	5.1.37-1ubuntu5

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

--
-- Create schema javamysql
--

CREATE DATABASE IF NOT EXISTS javamysql;
USE javamysql;
CREATE TABLE  `javamysql`.`persona` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(20) NOT NULL,
  `sexo` char(1) NOT NULL DEFAULT 'M',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
INSERT INTO `javamysql`.`persona` VALUES  (1,'Herman','M'),
 (2,'Ana','F'),
 (3,'Carlos','M'),
 (4,'Marta','F'),
 (5,'José','M'),
 (6,'Allan','M'),
 (7,'Sonia','F');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
Bajar código fuente:
MySQL

Ahora, crearemos un proyecto de Java, en la clase Main copia el siguiente código fuente:

package javamysql;

import java.sql.*;
//import java.util.logging.Level;
//import java.util.logging.Logger;

/**
 *
 * @author herman barrantes
 */
public class Main {

    //variables
    private static Connection conexion;
    private static String bd="javamysql";
    private static String user="test";
    private static String password="123";
    private static String host="localhost";
    private static String server="jdbc:mysql://"+host+"/"+bd;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //conectar
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection(server,user,password);

            System.out.println("Conexión a base de datos "+server+" ... OK");

        } catch (ClassNotFoundException ex) {
            System.out.println("Error cargando el Driver MySQL JDBC ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            System.out.println("Imposible realizar conexion con "+server+" ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        //realizar consulta
        try {
            // Preparamos la consulta
            Statement s = conexion.createStatement();
            ResultSet rs = s.executeQuery ("select * from persona");

            // Recorremos el resultado, mientras haya registros para leer, y escribimos el resultado en pantalla.
            while (rs.next())
            {
                System.out.println(
                        "ID: " +rs.getInt (1) +
                        "tNombre: " + rs.getString (2)+
                        "tSexo: " + rs.getString("sexo")
                        );
            }
        } catch (SQLException ex) {
            System.out.println("Imposible realizar consulta ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        //desconectar
        try {
            conexion.close();
            System.out.println("Cerrar conexion con "+server+" ... OK");
        } catch (SQLException ex) {
            System.out.println("Imposible cerrar conexion ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}
Bajar código fuente:
Java

Al ejecutar el programa deberíamos de obtener como resultado algo como:
Conexión a base de datos jdbc:mysql://localhost/javamysql ... OK
ID: 1 Nombre: Herman Sexo: M
ID: 2 Nombre: Ana Sexo: F
ID: 3 Nombre: Carlos Sexo: M
ID: 4 Nombre: Marta Sexo: F
ID: 5 Nombre: José Sexo: M
ID: 6 Nombre: Allan Sexo: M
ID: 7 Nombre: Sonia Sexo: F
Cerrar conexion con jdbc:mysql://localhost/javamysql ... OK

Como pueden ver al principio del código fuente se hace import java.sql.*;, esto es para importar las clases necesarias para trabajar bases de datos (todas en general no solo MySQL).

A partir de la línea 13 de este ejemplo podemos encontrar las variables para la conexión a la base de datos, la mayoría de estas es obvio que función cumplen por lo que no lo voy a explicar a profundidad, solo voy a mencionar que la variable host tiene como valor “localhost” ya que el servidor de base de datos esta en el localhost de mi PC, este valor puede ser cambiado por la IP o Nombre del equipo si el servidor se encuentra en otro equipo en la red.

A partir de la línea 25 de este ejemplo podemos encontrar el método para conectarse a la base de datos, Class.forName nos sirve para asegurarnos que el Driver se inicializa y se registra, luego solo pediremos una conexion a la clase DriverManager mediante su método getConnection. El método getConection puede recibir varios parámetros pero esos 3 son sufientes para nuestro ejemplo.

A partir de la línea 40 se usa la clase Statement de java para enviar consultas. Statement tiene 2 metodos interesantes: executeUpdate y executeQuery. El primero nos permitirá enviar consultas que modifiquen la base de datos (insert, update, delete, etc) y el segundo nos permitirá hacer consultas que nos retornen valores (select, views, etc), esos valores son guardados en un tipo de variable ResultSet que luego nos servirá para recorrer los resultados.

El ResultSet contiene dentro los registros leidos de la base de datos. Inicialmente, tal cual nos lo devuelve el Statement.executeQuery(), tiene internamente un “puntero” apuntando justo delante del primer registro. El método next() del ResultSet hace que dicho puntero avance al siguiente registro, en este caso, al primero. Si lo consigue, el método next() devuelve true. Si no lo consigue (no hay siguiente registro que leer), devuelve false, por tanto la mejor forma de recorrerlo es mediante un while.

Una vez que el “puntero” está apuntando a un registro, los métodos getInt(), getString(), getDate(), etc nos van devolviendo los valores de los campos de dicho registro. Podemos pasar a estos métodos un índice (que comienza en 1) para indicar qué columna de la tabla de base de datos deseamos. También podemos usar un String con el nombre de la columna (tal cual está en la tabla de base de datos).

Es responsabilidad nuestra saber qué tipo de dato hay en cada columna, aunque si nos equivocamos y RecordSet es capaz de hacer la conversión, la hará por nosotros. Por ejemplo, en cualquiera de los campos anteriores podemos pedir un getString() y nos devolveran los números como String y la fecha como String.

También podemos usar getObject(), y el RecordSet nos devolverá el Object más adecuado para el tipo de campo que pedimos.

Finalmente, de la línea 60 en adelante encontramos como se cierra la conexión mediante el método close() de nuestra variable conexion, es importante siempre cerrar la conexión ya que si no se hace y se crean continuamente conexiones podría ocurrir en alguna momento alguna de 2 cosas: o sobrecargar la memoria con conexiones inútiles o agotarse el “pool” de conexiones que crea el Driver.

Publicidad

4 comentarios

  1. alejandro dice:

    Muy bueno el aporte

  2. Crafter dice:

    Man el codigo me da un error en package javamysql;

    a que crees que se debe esto?

  3. Herman Barrantes dice:

    puede que el archivo java no este en ese paquete, los paquetes no son solo logicos, tambien son fisicos y representan carpetas del sistema operativo, debes cambiarlo segun sea tu caso.

Deja un comentario