Conexión a la base de datos


Introducción

El siguiente objetivo es conectarse a la base de datos, para lo cual básicamente hay que realizar dos pasos:

  1. Registrar (cargar en memoria) el controlador. Esto se puede hacer de dos formas:

    • De forma dinámica, por medio del método Class.forName( String de driver ). Esta es la forma más usual y la que usaremos en la mayor parte de los ejemplos.

      Ejemplos de carga dinámica:

      • En MySQL local: Class.forName("com.mysql.jdbc.Driver");
      • En Oracle: Class.forName("oracle.jdbc.Driver.OracleDriver");


    • De manera estática, usando System.setProperties("jdbc.drivers", String de driver).


  2. Establecer la conexión por medio del método DriverManager.getConnection( String de la URL de base de datos, String de login, String de password ). Este método es static, por ello no necesitaremos instanciar un objeto de tipo DriverManager para hacer la llamada.

    La conexión usa una sintaxis semejante a la de una URL. La sintaxis de la URL (los corchetes indican elementos opcionales) es la siguiente:

    
    	jdbc:Controlador://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...
      

    Notas a la sintaxis de la URL:

    • Controlador: controlador de base de datos, en nuestro ejemplo es mysql.
    • Host: servidor de base de datos (por defecto es localhost).
    • Failoverhost: servidor de respaldo, en caso de que falle el primero
    • Port: si no se indica puerto, se toma el valor por defecto. En el caso de MySQL es 3306.
    • Database:nombre de la base de datos. Si no se indica base de datos, asume la base de datos actual. Por medio del método setCatalog de la clase Connection se puede determinar la base de datos actual.
    • Una curiosidad para los que vayan a aprender a crear servlets: los símbolos '?', '=' y '&' tienen la misma función que en las llamadas de tipo GET a los servlets, respectivamente: la interrogación señala que a continuación tenemos la primera propiedad (propertyName1), el 'igual' separa el nombre de la propiedad de su valor (propertyValue) y, por último, el '&' antecede a las siguientes propiedades.

    Ejemplos de conexión:

    • En MySQL local: Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/prueba", "log", "pwd" );
    • En Oracle: Connection con = DriverManager.getConnection( "jdbc:oracle:thin:servidor:1521:prueba", "log", "pwd" );

Un sencillo ejemplo con registro dinámico

A continuación el primer ejemplo (es una sencilla aplicación en modo texto) con registro dinámico del controlador (driver) y la conexión mediante DriverManager.getConnection, en la llamada a este método el segundo y tercer argumento son el login y el password. Contiene comentarios detallados:


	package jdbc01;

	import java.sql.DriverManager;
	import java.sql.Connection;
	import java.lang.ClassNotFoundException;
	import java.sql.SQLException;

	public class jdbc01_conexion2 {
		public static void main(String[] args) {
			try {

				/**** Cargamos el driver ****/
				Class.forName("com.mysql.jdbc.Driver");

				/**** Realizamos la conexión ****/
				Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/prueba", "root", "palabra" );

				/**** Ok: avisamos ****/
				System.out.println( "Si he llegado hasta aquí es que se ha producido la conexión");
				System.out.println( "Si no se hubiera producido, se habría disparado SQLException");

				/**** Una buena costumbre: cerramos la conexión ****/
				con.close();
			}
			/**** Excepción que se dispara si falla la carga del driver ****/
			catch( ClassNotFoundException e ) { e.printStackTrace();  }

			/**** Excepción que se dispara si falla la conexión *****/
			catch ( SQLException e) { e.printStackTrace();  }

		}
	}

Aunque el código del ejemplo anterior está documentado, vamos a repasar algunos conceptos:

El resultado final es el esperado, aparece por pantalla:

Si he llegado hasta aquí es que se ha producido la conexión
Si no se hubiera producido, se habría disparado SQLException

Un ejemplo con registro estático

En el segundo ejemplo podemos observar:


	import java.sql.DriverManager;
	import java.sql.Connection;
	import java.sql.SQLException;
	import java.io.FileInputStream;
	import java.io.IOException;
	import java.util.Properties;

	public class jdbc01_conexion3 {
		public static void main(String[] args) {
			try {
			   	/*** Abrimos flujo de entrada y cargamos el contenido en props ****/
				Properties props = new Properties();
				FileInputStream in = new FileInputStream("database.properties");
				props.load(in); // Cargamos el contenido del flujo en props
				in.close();

				/**** Obtenemos las propiedades del objeto props ***/
				/*** Para registrar de manera estática (setProperty) el driver ***/
				String drivers = props.getProperty("jdbc.drivers");
				if (drivers != null)
					System.setProperty("jdbc.drivers", drivers);  // Cargamos driver
				/*** Para la conexión ***/
				String url = props.getProperty("jdbc.url");
				String username = props.getProperty("jdbc.username");
				String password = props.getProperty("jdbc.password");

				/*** Conexión ****/
				Connection con = DriverManager.getConnection( url, username, password );
			}
			catch (SQLException e) { e.printStackTrace();  }
			catch (SecurityException e) { e.printStackTrace();  }
			catch (IOException e) { e.printStackTrace();  }
		}
	}

Archivo log

En el siguiente ejemplo utilizamos un registro dinámico y además utilizamos un archivo .log para ver los eventos que suceden en la conexión JDBC, para lo cual utilizamos la función setLogWriter():


	import java.sql.DriverManager;
	import java.sql.Connection;
	import java.lang.ClassNotFoundException;
	import java.sql.SQLException;
	import java.io.FileOutputStream;
	import java.io.File;
	import java.io.IOException;
	import java.io.PrintWriter;

	public class jdbc01_conexion4 {
		public static void main(String[] args) {
			try {
				Class.forName("com.mysql.jdbc.Driver");
				activar_log( "ejemplo.log" );
				Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/prueba", "root", "palabra" );
			}
			catch( ClassNotFoundException e ) { e.printStackTrace();  }
			catch (SQLException e) { e.printStackTrace();  }
		}

		public static void activar_log( String archivo ) {
			try {
				FileOutputStream fs = new FileOutputStream(new File(archivo));
				PrintWriter p = new PrintWriter(fs, true);
				DriverManager.setLogWriter(p);
			}
			catch (IOException e) { e.printStackTrace();  }
		}
	}

En el archivo log aparece la carga de controlador y la conexión:


DriverManager.getConnection("jdbc:mysql://localhost/prueba")
	trying driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@5224ee]
getConnection returning driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@5224ee]

Si tienes curiosidad, puedes provocar un error de conexión y verás que aparece descrito en el archivo log.


Volver al índice