apuntes:bbdd
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| apuntes:bbdd [17/10/2017 21:27] – Fernando Valdeón | apuntes:bbdd [17/10/2017 21:44] (actual) – borrado Fernando Valdeón | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ===== Conexión a bases de datos ===== | ||
| - | La librería Java Database Connectivity (JDBC) es una API que proporciona acceso a bases de datos desde Java. Consta de dos paquetes: | ||
| - | java.sql | ||
| - | javax.sql | ||
| - | {{: | ||
| - | Para poder trabajar con un sistema gestor de bases de datos determinado, | ||
| - | Por lo tanto, solo tenemos que descargar el controlador o driver concreto para dicha plataforma. | ||
| - | A la hora de usar cualquier SGDB que use SQL las sentencias son siempre las mismas, solo cambia el driver de conexión. | ||
| - | |||
| - | ==== Añadir el conector JDBC a nuestro proyecto ==== | ||
| - | |||
| - | {{ : | ||
| - | Para conectarnos con MySQL desde Java necesitamos el driver JDBC para MySql. Lo podemos descargar desde la web de Mysql. https:// | ||
| - | Para usar otro SGBD debemos buscar el driver conector en su soporte web. | ||
| - | |||
| - | Una vez que lo tenemos descargado debemos añadirlo al classpath de nuestro proyecto. Click derecho sobre nuestro proyecto en el explorador de proyectos de **eclipse -> Build Path -> Configure Build Path**. | ||
| - | En la ventana que se abre seleccionamos Libraries y pulsamos sobre Add External JARs. Y añadimos el fichero jar que acabamos de descargar. | ||
| - | |||
| - | ==== Conexión con la Base de Datos MySQL==== | ||
| - | |||
| - | Desde la versión 7 de Java ya no necesitamos cargar el driver; se carga automáticamente. Anteriormente debíamos indicar la siguiente instrucción: | ||
| - | <code java> | ||
| - | Class.forName(" | ||
| - | </ | ||
| - | Lo siguiente que necesitamos es conectarnos a la base de datos mediante la clase **Connection** y la clase **DriverManager** con su método estático **getConnection()**. Estas clases esperan una cadena que indique todos los parámetros de conexión con la base de datos. __Siempre usaremos las clases del paquete java.sql__. | ||
| - | <code java> | ||
| - | Connection conexionBD = null; | ||
| - | String SERVIDOR = " | ||
| - | String baseDatos = " | ||
| - | String user = " | ||
| - | String pass = ""; | ||
| - | conexionBD = DriverManager.getConnection(SERVIDOR+baseDatos, | ||
| - | </ | ||
| - | user es el nombre de usuario con el que te conectas a la base de datos, y pass representa la contraseña, | ||
| - | |||
| - | === Conexión con otros SGBD === | ||
| - | (p.e. PostgreSql, MariaDb) | ||
| - | El proceso es el mismo, pero varía el tipo de servidor de bases de datos y también el driver: | ||
| - | <code java> | ||
| - | String SERVIDOR = " | ||
| - | String SERVIDOR = " | ||
| - | </ | ||
| - | |||
| - | ==== Consultas sobre la base de datos ==== | ||
| - | |||
| - | === Preparación de consultas === | ||
| - | |||
| - | Para preparar una consulta para su ejecución necesitamos usar la clase **PreparedStatement**. Su sintaxis de uso es bastante sencilla, ya que el método **preparedStatement**(String consulta) de la clase **Connection** nos devuelve un objeto de este tipo: | ||
| - | <code java> | ||
| - | String consulta = " | ||
| - | |||
| - | PreparedStatement sentencia = conexion.prepareStatement(consulta) | ||
| - | </ | ||
| - | |||
| - | === Ejecución de consultas === | ||
| - | |||
| - | La clase PreparedStatement contiene principalmente 3 tipos de métodos de ejecución de consultas: | ||
| - | |||
| - | * Consultas de acción (INSERT, UPDATE, DELETE) | ||
| - | Usaremos el método **executeUpdate()**, | ||
| - | <code java> | ||
| - | int numeroRegistros = sentencia.executeUpdate(); | ||
| - | </ | ||
| - | * Consultas de selección (SELECT, funciones, procedimientos) | ||
| - | Si consulta devuelve registros, usaremos el método **executeQuery()**, | ||
| - | <code java> | ||
| - | ResultSet resultado = sentencia.executeQuery(); | ||
| - | </ | ||
| - | Una vez que tenemos el objeto **ResultSet** con el conjunto de registros obtenidos, podemos acceder a ellos mediante el método **getString()** de la clase ResultSet. | ||
| - | <code java> | ||
| - | while(resultado.next()){ | ||
| - | System.out.println(resultado.getString(1)+", | ||
| - | } | ||
| - | </ | ||
| - | De esta forma mostraríamos por pantalla las columnas 1 y 2 de cada registro obtenido. También podemos usar **getString**(" | ||
| - | |||
| - | * Cualquier tipo de consulta | ||
| - | El método boolean **execute()** se usa cuando la consulta puede devolver uno o varios conjuntos de registros **ResultSet**. | ||
| - | <code java> | ||
| - | boolean estado = sentencia.execute(); | ||
| - | </ | ||
| - | Si el método devuelve true, quiere decir que el primer resultado obtenido es un ResultSet. Podemos acceder a dicho conjunto de registros con el método **getResultSet()**. | ||
| - | <code java> | ||
| - | boolean estado = sentencia.execute(); | ||
| - | if(estado){ | ||
| - | ResultSet resultado = sentencia.getResultSet(); | ||
| - | // | ||
| - | } | ||
| - | </ | ||
| - | Si devuelve false indica que la consulta es del tipo (INSERT, UPDATE o DELETE), o que no ha devuelto resultados. Podemos acceder al número de registros afectados mediante el método int getUpdateCount(). | ||
| - | |||
| - | === Obtener el número de columnas de una consulta === | ||
| - | |||
| - | Si en algún caso al realizar una consulta no sabemos cuántas columnas nos va a devolver, podemos usar el método getMetaData() que devuelve un objeto del tipo ResultSetMetaData. | ||
| - | |||
| - | Existen dos formas de usar dicho método. Puede invocarlo desde un objeto de tipo ResultSet obtenido de la ejecución de una consulta: | ||
| - | <code java> | ||
| - | … | ||
| - | ResultSet resultado = sentencia.executeQuery(); | ||
| - | |||
| - | ResultSetMetaData resultadoMetaData = resultado.getMetaData(); | ||
| - | int numeroColumnas = resultadoMetaData.getColumnCount(); | ||
| - | </ | ||
| - | También puedo obtenerlo antes de ejecutar la consulta llamando al método desde un objeto de tipo PreparedStatement: | ||
| - | <code java> | ||
| - | … | ||
| - | PreparedStatement sentencia = conexión.preparedStatement(consulta); | ||
| - | |||
| - | ResultSetMetaData resultadoMetaData = sentencia.getMetaData(); | ||
| - | int numeroColumnas = resultadoMetaData.getColumnCount(); | ||
| - | </ | ||
| - | |||
| - | === Cerrar conexión === | ||
| - | El método close() de la clase Connection, cierra la conexión con la base de datos. | ||
| - | <code java> | ||
| - | conexion.close(); | ||
| - | </ | ||
| - | |||
| - | ==== Anexo: Ejemplos ==== | ||
| - | |||
| - | === Insertar datos === | ||
| - | <code java> | ||
| - | String sentenciaSql = " | ||
| - | PreparedStatement sentencia = null; | ||
| - | |||
| - | try { | ||
| - | sentencia = conexion.prepareStatement(sentenciaSql); | ||
| - | sentencia.setString(1, | ||
| - | sentencia.setFloat(2, | ||
| - | sentencia.executeUpdate(); | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } finally { | ||
| - | if (sentencia != null) | ||
| - | try { | ||
| - | sentencia.close(); | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | === Modificar datos === | ||
| - | <code java> | ||
| - | String sentenciaSql = " | ||
| - | "WHERE nombre = ?"; | ||
| - | PreparedStatement sentencia = null; | ||
| - | |||
| - | try { | ||
| - | sentencia = conexion.prepareStatement(sentenciaSql); | ||
| - | sentencia.setString(1, | ||
| - | sentencia.setFloat(2, | ||
| - | sentencia.setString(3, | ||
| - | sentencia.executeUpdate(); | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } finally { | ||
| - | if (sentencia != null) | ||
| - | try { | ||
| - | sentencia.close(); | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | === Eliminar datos === | ||
| - | <code java> | ||
| - | String sentenciaSql = " | ||
| - | PreparedStatement sentencia = null; | ||
| - | |||
| - | try { | ||
| - | sentencia = conexion.prepareStatement(sentenciaSql); | ||
| - | sentencia.setString(1, | ||
| - | sentencia.executeUpdate(); | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } finally { | ||
| - | if (sentencia != null) | ||
| - | try { | ||
| - | sentencia.close(); | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | |||
| - | === Otras Clases === | ||
| - | - HashMap | ||
| - | - HashSet | ||
| - | - HashTable | ||
| - | - Enum | ||
| - | ---- | ||
| - | |||
| - | (c) 2017 Fernando Valdeón | ||
apuntes/bbdd.1508275637.txt.gz · Última modificación: 16/09/2024 20:53 (editor externo)
