Prog Acceso a base de datos relacionales
Sumario
Introdución
Descargando las librerías para conectar a Mysql
- Debemos ir a este enlace.
- Nota: Estos pasos están probados en un Linux Mint 18 (basado en Ubuntu 16.04) de 64bits.
- Si descargamos el paquete deb, las librerías necesarias se instalarán el el directorio /usr/share/java. El fichero (en este caso) es mysql-connector-java-8.0.11.jar.
- Si queremos desarrollar una aplicación desde NetBeans, debemos de añadir el jar a las librerías del proyecto como vimos en este punto de la wiki.
- Si queremos ejecutar desde consola la aplicación ya compilada (el class) o compilarla desde otro editor, tendremos que modificar la variable de entorno classpath para añadir el jar, como está indicado en este enlace.
- La librería descargada, obliga a que el servidor Mysql tenga establecido el huso horario. Podríamos indicarlo en la cadena de conexión desde el cliente java con la siguiente línea:
- useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
- O bien ejecutar la orden SQL: SET GLOBAL time_zone = '+1:00'
Trabajando contra una base de datos Mysql
- Lo primero que tenemos que hacer es realizar una conexión a la base de datos.
- Entre los datos que vamos a necesitar estarán:
- Usuario para conectarse a la base de datos con permisos para realizar las operaciones que necesitemos.
- Password del usuario.
- Nombre de la base de datos a la que nos vamos a conectar.
- Nombre del host donde está instalado el servidor Mysql.
- La cadena de conexión que representa una conexión a un servidor Mysql en JDBC.
- En la versión en la que estamos trabajando hay que añadir dos opciones más:
- Una en la que se le indica el huso horario.
- Otra opción en la que se le indica que no se va a conectar utilizando una conexión segura (SSL), ya que si no lo indicamos, aparecerá un warning.
- Veamos un ejemplo de código:
1 try { 2 String servidor = "localhost"; 3 String basedatos = "ejemplo"; 4 String user = "root"; 5 String password = "root"; 6 7 String husoHorario = "useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"; 8 String noUsarSSL = "&useSSL=false"; 9 10 String cadenaConexion = String.format("jdbc:mysql://%s/%s?%s%s",servidor,basedatos,husoHorario,noUsarSSL); 11 12 Connection conexion = DriverManager.getConnection(cadenaConexion,user,password); 13 14 15 } catch (SQLException ex) { 16 Logger.getLogger(ConsultaSimple.class.getName()).log(Level.SEVERE, null, ex); 17 }
- En versiones anteriores del conector JDBC, era necesario cargar el controlador que representaba la conexión al gestor Mysql con las siguientes instrucciones:
1 try { 2 Class.forName("com.mysql.jdbc.Driver"); 3 } catch (ClassNotFoundException e) { 4 5 }
- Ahora ya no es necesario, a parte de que la clase que carga el driver ya no es la anterior, es com.mysql.cj.jdbc.Driver
- Una vez realizadas las operaciones contra la base de datos, se llama al método close() del objeto de la clase Connection:
1 conexion.close();
Consultas
- Partimos siempre que tenemos definido previamente un objeto de la clase Connection conectado a la base de datos.
- Veamos un ejemplo:
1 Statement consulta = conexion.createStatement(); 2 ResultSet resultados = consulta.executeQuery("SELECT nombre,f_nacimiento FROM alumnos"); 3 while(resultados.next()) { 4 Date fechaBD = resultados.getDate("f_nacimiento"); 5 String fechaSpain = new SimpleDateFormat("dd-MM-yyyy").format(fechaBD); 6 System.out.printf("Nombre:%s----F_nac:%s%n",resultados.getString("nombre"),fechaSpain); 7 } 8 9 resultados.close();
- Al igual que la conexión, se debe llamar al método close() de la clase ResultSet para liberar los recursos.
- Podemos llamar a procedimientos almacenados poniendo como orden a ejecutar CALL y el nombre del procedimiento, de la siguiente forma:
1 ResultSet resultados = consulta.executeQuery("CALL alumno_listar()");
- Siendo alumno_listar() un procedimiento con el siguiente código:
1 DELIMITER $$ 2 CREATE DEFINER=`root`@`localhost` PROCEDURE `alumno_listar`() 3 NO SQL 4 SELECT nombre,f_nacimiento 5 FROM alumnos 6 ORDER BY nombre$$ 7 DELIMITER ;
- De todas formas, si el procedimiento lleva parámetros es mejor hacer la llamada utilizando la clase CallableStatement.
- Podéis consultar un ejemplo en este enlace.
Inserción
- Partimos siempre que tenemos definido previamente un objeto de la clase Connection conectado a la base de datos.
Actualización
- Partimos siempre que tenemos definido previamente un objeto de la clase Connection conectado a la base de datos.
Borrado
- Partimos siempre que tenemos definido previamente un objeto de la clase Connection conectado a la base de datos.
-- Ángel D. Fernández González -- (2017).