Conectarnos a una base de datos con JDBC

10/ago/2007 Java , , , , , , 15 Comentarios
java

El objetivo de nuestro ejemplo es el de ver qué tenemos que hacer para crear una conexión JDBC con Java sobre una base de datos y ejecutar una consulta.

Las tres clases que manejaremos en nuestro ejemplo serán Connection para realizar la conexión a la base de datos, PreparedStatement que será la que contenga la sentencia SQL y ResultSet que será la que contenga el resultado.

Lo primero que tenemos que saber para realizar la conexión a la base de datos es donde se encuentra dicha base de datos. Para hacer referencia a la base de datos lo podemos hacer directamente mediante la IP o, por ejemplo, mediante una referencia ODBC.

Así, podríamos tener referencias como:

jdbc:db2:10.0.1.10:50000/BD1 (referencia directa)
jdbc:odbc:BD1 (referencia por ODBC)

Una vez conocemos la localización de nuestra base de datos debemos de saber el nombre de la clase que tiene implementada la conexión a la base de datos. Es lo que llamamos driver. Dependiendo de la forma en la que este implementado el driver, este, recibirá el apelativo de driver tipo1, tipo2, tipo3 o tipo4.

Si nos ponemos a escribir código, lo primero que debemos de hacer es instanciar la clase del driver.

  1. Class.forName(sDriver).newInstance();

Dicha clase será la que nos proporcione una conexión a la base de datos, y como bien hemos dicho, la conexión la guardaremos en una instancia de la clase Connection.

  1. con = DriverManager.getConnection(sURL);

Un vez que hemos conseguido una conexión a la base de datos lo siguiente será el preparar una sentencia SQL en un PreparedStatement. No haremos nada complicado con el SQL, algo así como...

  1. stmt = con.prepareStatement("SELECT titulo FROM libros");

Construida nuestra sentencia, realizamos la ejecución de la misma. Y el resultado al ResultSet.

  1. s = stmt.executeQuery();

Un ResultSet no deja de ser una especie de matriz (filas x columnas) que deberemos de recorrer mediante el movimiento de un cursor. Y la forma más fácil en Java es mediante un bucle while. Y para acceder a las columnas bastará con utilizar los métodos getXXX del ResultSet: getString() para las cadenas de texto, getDouble() para los decimales, getDate() para las fechas,......

  1. while (rs.next())
  2. System.out.println (rs.getString("titulo"));

Una vez que hemos finalizado el cometido de nuestro ejercicio deberemos de cerrar las conexiones a la base de datos. Para ello invocaremos el método close() sobre los tres objetos mencionados.

Y en todo este proceso, las excepciones. No nos debemos de olvidar de ellas. A tal respecto deberemos de ejecutar nuestro código en un bloque try-catch que controle la SQLException. Excepción común que se produce en el acceso a la base de datos.

El código podría quedar como el que sigue:

  1. try {
  2. Class.forName(sDriver).newInstance();
  3. con = DriverManager.getConnection(sURL);
  4.  
  5. try {
  6.  
  7. // La Query
  8. stmt = con.prepareStatement("SELECT titulo FROM libros");
  9. rs = stmt.executeQuery();
  10.  
  11. // Recorremos el resultado
  12. while (rs.next())
  13. System.out.println (rs.getString("titulo"));
  14.  
  15. } catch (SQLException sqle) {
  16. System.out.println("Error en la ejecución:"
  17. + sqle.getErrorCode() + " " + sqle.getMessage());
  18. }

Vídeos sobre Java

Difunde el Conocimiento

Si te ha gustado el artículo o te ha sido de utilidad, no dejes de compartirlo con tus amigos en las redes sociales... Te estaremos muy agradecidos. :-D

15 comentarios en “Conectarnos a una base de datos con JDBC”

Víctor Cuervo

Víctor Cuervo

@Mauricio,

Si te descargas el código completo del ejemplo se ve como se cierran las conexiones.

try {
  // Cerramos posibles conexiones abiertas
  if (rs!=null) rs.close();
  if (stmt!=null) stmt.close();
  if (con!=null) con.close();    
} catch (Exception e) {
  System.out.println("Error cerrando conexiones: "
    + e.toString());
}

Es muy recomendable el que se cierren siempre las conexiones a la base de datos. En el caso de que se nos olviden, el objeto se quedará en memoria (aunque sin usarse) hasta que termine el programa. Si la JVM necesita de más espacio es posible que quite de la memoria el objeto de las conexiones si ve que no se está utilizando.

Pero lo dicho, siempre cierra las conexiones. 😉

Víctor Cuervo

Mauricio

Una consulta… veo q abres la conexion pero no la cierras… sabes q pasa al hacer eso.. mas especificamente: El servidor se encarga de cerrar al conexion despues de un tiempo o sigue la conexion y la aplicacion se vuelve mas lenta cada vez????? o algo mas?

Gracias

Víctor Cuervo

Víctor Cuervo

@nestor,

Sí, se asume que se tiene una sentencia SQL en el PreparedStatement.
Si hay un error SQL se captura en el try-catch.
¿Cual es el problema?

Víctor Cuervo

nestor

stmt = con.prepareStatement(“SELECT titulo FROM libros”);
rs = stmt.executeQuery();
pero esa joda no sirve, de por si hay error, executeQuery debe tener un string sql…

Víctor Cuervo

dario espindola

hola… alguien me puede ayudar a halar los datos desde access para mostrarlo en la interfaz de java necesito que ingrese,consulte,modifique, elimine y haga un listado de una tabla que contiene cedula, nombres, apellidos, direccion y telefono….. gracias

Víctor Cuervo

mar

hola kiero saber como conectar de eclipce asi una base de datos

Víctor Cuervo

Alejandro

Tengo una duda al respecto de recorrer un resultset.
Está claro que utilizando .next() vamos pasando por cada uno de los registros, pero qué pasa cuando el resulset tiene sólo un registro????

En mi caso, la sentencia rs.next() da true y por tanto entra al bucle, pero cuando va a acceder al contenido da un error porque ya se saltó el registro.

Copio el código que he tenido que utilizar para contemplar ese caso:

boolean existe = rs.first();
if (existe) { //con esto obtengo los datos del primer registro
valor = rs.getString(“VAL”);
//líneas de código para trabajar con valor
while (rs.next()) { //ahora que ya tengo el primero sigo cogiendo los demás registros, si los hay
valor = rs.getString(“VAL”);
//líneas de código para trabajar con valor
}
}

**********************************

Como podéis intuir, las líneas de código para trabajar con valor son las mimas (tengo que repetir el código). Si no hago el rs.first() sino que directamente hago el rs.next() no puedo captar el valor del primer registro, si sólo tengo uno en el resultset.

Espero haberme expresado con claridad.

Saludos,

Víctor Cuervo

silver_7

amm… Hola!
Tengo que hacer una conexion remota para hacer una consulta… ahora mismo pruebo el codigo antes descrito aqui. solo que aun no me queda muy claro y pues no tengo donde probarlo. anteriormente en clase hice la prueba con el siguiente codigo en Java, desde el servidor y el cliente. El Server contiene el texto, y el Cliente recibe el texto. Ahora quiero hacer lo mismo pero con una consulta.
Me podria alguien explicar mas detalladamente? con el codigo que se explica aqui puedo modificar mi codigo para aplicar la conexion y consulta?

Server

import java.net.*;
import java.io.*;
public class Servidor{
public static void main(String [] args){
ServerSocket ss = null;
try{
ss = new ServerSocket(5432);
}
catch(IOException e1){
System.out.println(e1.toString());
}
try{
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(“Hola, soy yo!”);
s.close();
os.close();
}
catch(IOException ioe){}
}
}

Cliente

import java.net.*;
import java.io.*;
public class Cliente{
public static void main(String [] args){
try{
Socket s1 = new Socket(“192.168.0.89”, 5432);
InputStream is = s1.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println(dis.readUTF());
is.close();
dis.close();
}
catch(ConnectException ce){
}
catch(IOException ioe){}
}
}

Víctor Cuervo

Anthony

Estoy trabajando con eclipse y mySQL
Por favor si sabe como hacer la conexion le pido responda este mensaje

Víctor Cuervo

efra

Hola a todos. Tnego una curiocidad, para que me muestros todos los campos. que debeo hacer.Porque en sql server se hacer slect * from clientes. en java es igual.

Víctor Cuervo

carlos

necesito manipular una base de datos q ya esta enlazada conjava

Víctor Cuervo

MILTON CASAS

EXCELENTE APORTE, MUY AGRADECIDO

Víctor Cuervo

claudia

hola

Víctor Cuervo

natalia

estoy haciendo un proyecto con eclipse y maysql y necesito saber como hago la conexion de la base de datos con eclipse

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*


*