Bienvenido(a), Visitante. Favor de ingresar o registrarse.

Ingresar con nombre de usuario, contraseña y duración de la sesión

Foros del Club

Páginas: [1]   Ir Abajo
  Enviar tema  |  Imprimir  
Autor Tema: JDBC y MySQL  (Leído 1741 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Sherekan
Moderador
Savant
*****

Prestigio: 8
Desconectado Desconectado

Sexo: Femenino
Mensajes: 30


Just Sherekan


WWW
Lenguajes:
PHP, Java, C/C++
XML, HTML/XHTML
Bases de datos:
MySQL
« en: 27/08/2008, 12:47:23 »

Que es JDBC

JDBC (Java Database Connectivity) es un API que brinda un conjunto de interfaces y clases para acceder a cualquier motor de base de datos que lo implemente. JDBC se abstrae de los detalles específicos del motor, permitiendo así conectarse prácticamente de la misma manera a cualquier base de datos.
Las empresas, crean drivers para JDBC, para brindar una manera sencilla de conectarse a sus productos desde Java. En el caso de MySQL, este driver se llama Connector/J y está actualmente en su versión 5.1.
En este post voy a explicar como se usa JDBC con MySQL, por lo que vamos a necesitar MySQL y Connector/J. En caso de usar otro motor de base de datos, pueden leer igual el tutorial, ya que no varía demasiado.

Descarga e instalación

Descargamos el driver de JDBC para MySQL desde el sitio oficial de MySQL.
Lo descomprimimos y colocamos el jar en nuestra aplicación.

Ejemplo

Veamos un ejemplo sencillo. Vamos a conectarnos a la base de datos y hacer algunas consultas sencillas.

Importamos paquete sql

Código
import java.sql.*;
 

Creamos conexión

Para conectarnos a la base de datos, tenemos que cargar el driver y crear un objeto Connection desde el DriverManager, pasándole la URL de conexión, el nombre de usuario y la contraseña de la base de datos.

Una URL de conexión tiene el siguiente formato:

Código:
jdbc:<subprotocol>://<hostname>:port/<db_name>

Que en este caso sería algo así:

Código:
jdbc:mysql://localhost:3306/my_db

Veamos un ejemplo:

Código
Connection conexion = null;
try {
 Class.forName("com.mysql.jdbc.Driver");
 conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_db", "my_user", "my_pass");
} catch (SQLException e) {
 System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
 System.out.println("Error inesperado: " + e.getMessage());
}
 

Si ejecutamos la aplicación ahora, debería conectarse correctamente a la base de datos (sin ninguna salida en pantalla). En caso contrario, arrojaría alguna excepción.

Hacemos algunas consultas

Una vez realizada la conexión a la base de datos. Para hacer consultas tenemos que crear un objeto Statement desde el objeto Connection, de la siguiente manera:

Código
Statement stmt = conexion.createStatement();
 

Y para ejecutar la consulta podemos usar alguno de los siguientes métodos del objeto Statement:

  • executeQuery()
    Sirve para hacer consultas que devuelven resultados (generalmente consultas SELECT). Devuelve un objeto ResultSet con el resultado.
  • executeUpdate()
    Sirve para hacer consultas del tipo INSERT, UPDATE, DELETE que no devuelven un resultado. Este método retorna un entero con la cantidad de registros afectados.

Veamos un ejemplo con executeUpdate():

Código
try {
 Statement stmt = conexion.createStatement();
 
 int registrosAfectados = stmt.executeUpdate("UPDATE noticias SET activo = 0 WHERE id > 100");
 System.out.println("Registros afectados: " + registrosAfectados + " registros");
 
 registrosAfectados = stmt.executeUpdate("INSERT INTO usuarios (nombre, clave) VALUES (&#39;Homero&#39;, &#39;123&#39;)");
 System.out.println("Registros afectados: " + registrosAfectados+ " registros");
} catch (SQLException e) {
 System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
 System.out.println("Error inesperado: " + e.getMessage());
}
 

Ahora un ejemplo con executeQuery():

Código
try {
 Statement stmt = conexion.createStatement();
 
 ResultSet resultado = stmt.executeQuery("SELECT * FROM usuarios");
 while (resultado.next()) {
     System.out.println("ID: " + resultado.getInt("id"));
     System.out.println("Nombre: " + resultado.getString("nombre"));
     System.out.println("Clave: " + resultado.getString("clave"));
 }
} catch (SQLException e) {
 System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
 System.out.println("Error inesperado: " + e.getMessage());
}
 

Como podrán ver, mediante un bucle recorremos el ResultSet, obteniendo los datos de cada registro, sacando los valores de sus campos mediante los métodos getInt() y getString().

Prepared statements

Si queremos usar prepared statements, creamos un objeto PreparedStatement desde el objeto Connection:

Código
PreparedStatement preparedStatement = conexion.prepareStatement("UPDATE notas SET copete = ? WHERE posicion > ?");

Seteamos los datos al prepared statement así:

Código
preparedStatement.setString(1, "blabla");
preparedStatement.setInt(2, 10);
 

Y finalmente ejecutamos el prepared statement, en este caso con executeUpdate():

Código
preparedStatement.executeUpdate();

Ejemplo completo:

Código
try {
 PreparedStatement preparedStatement = conexion.prepareStatement("UPDATE notas SET copete = ? WHERE posicion > ?");
 preparedStatement.setString(1, "blabla");
 preparedStatement.setInt(2, 10);
 preparedStatement.executeUpdate();
} catch (SQLException e) {
 System.out.println("Error de MySQL: " + e.getMessage());
} catch (Exception e) {
 System.out.println("Error inesperado: " + e.getMessage());
}
 
« Última modificación: 27/08/2008, 22:43:42 por Sherekan » En línea
CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #1 en: 27/08/2008, 15:39:25 »

Muy pero muy buen post.

Creo que merece ser publicado como artículo en el sitio principal, solo faltaría quizá agregarle un script sql con la definición de las tablas del ejemplo para que el usuario descargue y pueda ver el ejemplo andando en poco tiempo.

+1 de prestigio!

Saludos.,
En línea

Pnux
Elite
********

Prestigio: -1
Desconectado Desconectado

Sexo: Masculino
Profesión: Programador web
Mensajes: 88



WWW
Lenguajes:
(X)HTML
Javascript
CSS
PHP
Bases de datos:
MySQL
XML
« Respuesta #2 en: 27/08/2008, 16:06:26 »

Aunque no se de Java pero si (My)SQL, parece un excelente post. Felicitaciones.
En línea
Sherekan
Moderador
Savant
*****

Prestigio: 8
Desconectado Desconectado

Sexo: Femenino
Mensajes: 30


Just Sherekan


WWW
Lenguajes:
PHP, Java, C/C++
XML, HTML/XHTML
Bases de datos:
MySQL
« Respuesta #3 en: 27/08/2008, 16:09:28 »

Hola, gracias Sonreir

Dejo los scripts SQL de las tablas:

Código
CREATE TABLE usuarios (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
clave VARCHAR(100) NOT NULL
);

Código
INSERT INTO noticias (id, posicion, activo, titulo, copete, cuerpo) VALUES (40, 10, 0, "un titulo", "un copete", "un cuerpo");
INSERT INTO noticias (id, posicion, activo, titulo, copete, cuerpo) VALUES (105, 10, 0, "otro titulo", "otro copete", "otro cuerpo");
INSERT INTO noticias (id, posicion, activo, titulo, copete, cuerpo) VALUES (22, 10, 0, "otro titulo más", "otro copete más", "otro cuerpo más");
INSERT INTO noticias (id, posicion, activo, titulo, copete, cuerpo) VALUES (146, 10, 0, "yy otro título", "yy otro copete", "yy otro cuerpo");
 

Código
CREATE TABLE noticias (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
posicion INT NOT NULL,
activo TINYINT NOT NULL,
titulo VARCHAR(255) NOT NULL,
copete TEXT NOT NULL,
cuerpo TEXT NOT NULL
);

Código
INSERT INTO usuarios(nombre, clave) VALUES ("jack", "bauer");
INSERT INTO usuarios(nombre, clave) VALUES ("pepe", "argento");
 

Saludos!
En línea
CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #4 en: 27/08/2008, 16:11:41 »

Una consulta.

Para ejecutar sentencias DDL como CREATE TABLE desde Java con JDBC, existe algún método especializado para ello o simplemente deberíamos utilizar executeUpdate?
En línea

Sherekan
Moderador
Savant
*****

Prestigio: 8
Desconectado Desconectado

Sexo: Femenino
Mensajes: 30


Just Sherekan


WWW
Lenguajes:
PHP, Java, C/C++
XML, HTML/XHTML
Bases de datos:
MySQL
« Respuesta #5 en: 27/08/2008, 19:13:11 »

Sip, para consultas DDL también se usa el método executeUpdate(), la diferencia es que va a retornar siempre cero. En cambio si se usa para sentencias INSERT/UPDATE/DELETE va a retornar el número de registros afectados.

Saludos.
En línea
Foros del Club
   

 En línea
Páginas: [1]   Ir Arriba
  Enviar tema  |  Imprimir  
 
Ir a: