bloque5: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 | ||
| bloque5:bbdd [18/05/2018 16:04] – [Conexión con la Base de Datos MySQL] Fernando Valdeón | bloque5:bbdd [04/09/2018 08:04] (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:// | ||
| - | |||
| - | Debemos descargar el conector para JDBC (Java Database Connectivity). En la sección descargas indicaremos nuestro //ssoo// (//platform independent// | ||
| - | |||
| - | 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 ===== | ||
| - | __Siempre usaremos las clases del paquete java.sql__. | ||
| - | |||
| - | Para realizar una conexión con la base de datos necesitamos: | ||
| - | |||
| - | * Obtener una instancia de la Clase '' | ||
| - | * La obtenemos a partir del método estático '' | ||
| - | |||
| - | '' | ||
| - | |||
| - | <code java> | ||
| - | Connection conexionBD = null; | ||
| - | String servidor = " | ||
| - | String bbdd = " | ||
| - | String user = " | ||
| - | String password = ""; | ||
| - | conexionBD = DriverManager.getConnection(servidorYbbdd, | ||
| - | </ | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | A partir del objeto '' | ||
| - | |||
| - | ==== Cerrar conexión ==== | ||
| - | El método '' | ||
| - | <code java> | ||
| - | conexionBD.close(); | ||
| - | </ | ||
| - | |||
| - | ==== 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 ===== | ||
| - | Las operaciones CRUD responden a un acrónimo usado en bases de datos que hace referencia a las operaciones básicas (create, read, update, delete). En SQL todas las consultas se asocian a algún tipo de operación de las anteriores. | ||
| - | |||
| - | Podremos tratar las consultas desde un enfoque muy simple: | ||
| - | * **Consultas que no devuelven datos** (INSERT, DELETE, UPDATE): llamadas también consultas de acción. | ||
| - | * **Consultas que devuelven datos** (SELECT): llamadas también de selección, porque seleccionamos los datos a mostrar. | ||
| - | |||
| - | ==== Preparación de consultas ==== | ||
| - | |||
| - | Para preparar una consulta para su ejecución necesitamos usar la clase '' | ||
| - | |||
| - | <code java> | ||
| - | String consulta = " | ||
| - | |||
| - | //A partir del objeto Connection obtenemos una consulta preparada | ||
| - | PreparedStatement sentencia = conexion.prepareStatement(consulta); | ||
| - | |||
| - | ... | ||
| - | |||
| - | String consulta = " | ||
| - | |||
| - | PreparedStatement sentencia = conexion.prepareStatement(consulta); | ||
| - | </ | ||
| - | |||
| - | ==== Ejecución de consultas ==== | ||
| - | |||
| - | |||
| - | La clase '' | ||
| - | |||
| - | * **Consultas de acción** (INSERT, UPDATE, DELETE) | ||
| - | Usaremos el método '' | ||
| - | <code java> | ||
| - | //Ejecuto la consulta | ||
| - | sentencia.executeUpdate(); | ||
| - | |||
| - | //Ejecuto la consulta y obtengo el número de registros afectados (si lo necesitara) | ||
| - | int numeroRegistros = sentencia.executeUpdate(); | ||
| - | </ | ||
| - | |||
| - | * **Consultas de selección** (SELECT, funciones, procedimientos que muestren datos) | ||
| - | Si la consulta devuelve registros, usaremos el método '' | ||
| - | |||
| - | <code java> | ||
| - | ResultSet resultado = sentencia.executeQuery(); | ||
| - | </ | ||
| - | |||
| - | Una vez que tenemos el objeto '' | ||
| - | <code java> | ||
| - | while(resultado.next()){ | ||
| - | | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | De esta forma mostraríamos por pantalla las columnas 1 y 2 de cada registro obtenido. También podemos usar '' | ||
| - | **Las columnas están numeradas empezando en el nº 1**. | ||
| - | |||
| - | * **Ejecutar cualquier tipo de consulta** | ||
| - | El método boolean '' | ||
| - | |||
| - | <code java> | ||
| - | boolean estado = sentencia.execute(); | ||
| - | </ | ||
| - | |||
| - | Si el método devuelve true, quiere decir que el primer resultado obtenido es un ResultSet (Consulta Select). Podemos acceder a dicho conjunto de registros con el método '' | ||
| - | <code java> | ||
| - | boolean estado = sentencia.execute(); | ||
| - | //Si devuelve true es que he obtenido registros | ||
| - | if(estado){ | ||
| - | | ||
| - | // | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | 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 '' | ||
| - | |||
| - | ==== Parametrizar una consulta ==== | ||
| - | La clase '' | ||
| - | |||
| - | <code java> | ||
| - | String consulta = " | ||
| - | PreparedStatement sentencia = conexion.prepareStatement(consulta); | ||
| - | |||
| - | //Despues de precompilar la consulta, damos valores a sus parámetros | ||
| - | sentencia.setString(1, | ||
| - | sentencia.setInt(2, | ||
| - | sentencia.setFloat(3, | ||
| - | |||
| - | // | ||
| - | sentencia.executeUpdate(); | ||
| - | |||
| - | </ | ||
| - | |||
| - | En la consulta SQL puedo indicar mediante el caracter ''?'', | ||
| - | |||
| - | Posteriormente mediante el objeto PreparedStatement puedo dar valor a esos parámetros indicando el tipo de valor, y el número de parámetro al que le doy el valor (1, 2 ó 3, ya que hay 3 interrogaciones). | ||
| - | |||
| - | ==== 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 '' | ||
| - | |||
| - | Existen dos formas de usar dicho método. Se puede invocar desde un objeto de tipo '' | ||
| - | <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 '' | ||
| - | <code java> | ||
| - | … | ||
| - | PreparedStatement sentencia = conexión.preparedStatement(consulta); | ||
| - | |||
| - | ResultSetMetaData resultadoMetaData = sentencia.getMetaData(); | ||
| - | int numeroColumnas = resultadoMetaData.getColumnCount(); | ||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | ===== Anexo: Ejemplos ===== | ||
| - | |||
| - | ==== Seleccionar datos ==== | ||
| - | <code java> | ||
| - | String sentenciaSql = " | ||
| - | PreparedStatement sentencia = null; | ||
| - | |||
| - | try { | ||
| - | sentencia = conexion.prepareStatement(sentenciaSql); | ||
| - | ResultSet resultado = sentencia.executeQuery(); | ||
| - | | ||
| - | //Mostramos los datos | ||
| - | while(resultado.next()){ | ||
| - | | ||
| - | } | ||
| - | | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } finally { | ||
| - | if (sentencia != null) | ||
| - | try { | ||
| - | sentencia.close(); | ||
| - | } catch (SQLException sqle) { | ||
| - | sqle.printStackTrace(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ==== 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(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ---- | ||
| - | (c) {{date> %Y}} Fernando Valdeón | ||
bloque5/bbdd.1526659468.txt.gz · Última modificación: 16/09/2024 20:53 (editor externo)
