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 15:59] – [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 baseDatos = " | ||
- | String user = " | ||
- | String password = ""; | ||
- | conexionBD = DriverManager.getConnection(servidor + baseDatos, user, password); | ||
- | </ | ||
- | |||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | * '' | ||
- | |||
- | 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.1526659145.txt.gz · Última modificación: 16/09/2024 20:53 (editor externo)