Acceso a BDs en Java: JDBC Bases de Datos II 1 Introducción • Para hacer una aplicación de BDs en Java se necesita disponer del driver adecuado para el SGBD. • En nuestro caso necesitamos el de mysql. http://dev.mysql.com/downloads/connector/j/3.0.html • Ahí se obtiene el archivo: mysql-connector-java-3.0.14-production.jar 2 1 Introducción • Este fichero debe estar en un sitio visible para Java tanto al compilar la aplicación como al ejecutarla. javac –classpath mysql-connecor-java-3.0.12-production.jar;. Aplicación.java java –classpath mysql-connecor-java-3.0.12-production.jar;. Aplicación • Al inicio de nuestra aplicación debe aparecer (al menos) la siguiente biblioteca de clases: import java.sql.*; 3 Introducción • Lo primero que hemos de hacer es ver cual es la clase que implementa al controlador JDBC: com.mysql.jdbc.Driver • Y debe ser registrado para poder ser utilizado en la aplicación (en el código de la propia aplicación) Class.forName(“com.mysql.jdbc.Driver”); DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 4 2 Introducción • Después se debe construir una URL a la base de datos para JDBC. • Por ejemplo, para mysql sería de la siguiente forma: jdbc.mysql://[host][:port]/[database][?propName1][=propValue1][&propName2]=[propValue2]... jdbc.mysql://localhost:3306/Libros?user=usuario&password=clave jdbc:mysql://misiapepa.uv.es:3306/estancias 5 Crear conexión • Una vez que se ha registrado la clase del controlador se crea una conexión (con el siguiente método estático de la clase DriverManager): public static Connection getConnection(String url) throws SQLException string url = “jdbc:mysql://localhost:3306/estancias?user=usu1&password=clave”; Connection con = DriverManager.getConnection(url); 6 3 Ejecución de sentencias • Se necesita crear un objeto de la clase Statement a partir del objeto de tipo Connection. Statement sentencia = con.createStatement(); • Una vez creada la sentencia se pueden ejecutar consultas: ResultSet executeQuery(String SQL); int executeUpdate(String SQL); boolean execute(String SQL); //Cuando no se sabe de antemano el tipo //Ejemplo: ResultSet res = sentencia.executeQuery("SELECT ciudad from casas"); 7 Ejecución de sentencias • El último de estos métodos devuelve true si la senctencia contenía un SELECT. En ese caso se pueden obtener los resultados llamando al método getResultSet() que devuelve un objeto del tipo ResulSet. //Ejemplo: tiposentencia = sentencia.execute(sentenciaSQL); if (tiposentencia){ ResultSet res = sentencia.getResulSet(); } 8 4 Ejecución de sentencias II • También se puede ejecutar sentencias utilizando la clase PreparedStatement: se utiliza en las que se va a ejecutar varias veces la misma consulta. String Consulta =“INSERT INTO tabla(usuario,email,fecha) values (?,?,?)”; PreparedStatement psentencia = con.prepareStatement(consulta); • Después se rellenan los los valores que se desee: psentencia.setString(1,user); //Supongo variable user contiene el valor correcto psentencia.setNull(2,email); psetencia.setDate(3,fecha); //Y se ejecuta psentencia.executeUpdate(); 9 Obtención de resultados • La clase ResultSet dispone de métodos para moverse en filas y de métodos para seleccionar una determinada columna: void beforeFirst() void first(); void afterLast(); void last(); boolean next(); boolean previous(); float getFloat(int numeroColumna); float getFloat(String NombreColumna); int getInt(int numeroColumna); int getInt(String NombreColumna); java.sql.Date getDate(string NOmbreColumna); int getColumnCount() //Devuelve número de columnas String getColumnName(int column) //Obtiene el nombre de la columna String getColumnTypeName(int column); 10 5 Obtención de resultados • El resultSet proporciona también una forma de detectar si el valor de una columna es NULL: boolean wasNull() //devuelve true si la última columna leida era NULL 11 import java.sql.* ; import java.math.*; class EjemploJDBCmysql{ public static void main (String args []) { try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //Registro el driver //Obtengo una conexión Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3 306/estancias"); 12 6 Statement sentencia = con.createStatement(); ResultSet res = sentencia.executeQuery("SELECT IdCasa,ciudad, DispDesde,DispHasta from casas"); while (res.next()) { String s = res.getString("ciudad"); int id = res.getInt("IdCasa"); java.sql.Date fecha1 = res.getDate("DispDesde"); System.out.println(id + " " + s + " " + fecha1); } sentencia.close(); con.close(); } catch( SQLException ex) { System.out.println("SQLException:" + ex.getMessage()); System.out.println("SQLEState:" + ex.getSQLState()); System.out.println("Vendor Error:" + ex.getErrorCode()); } } } 13 import java.sql.*; public class prujdbc { public prujdbc() { } public static void main(String args[]) { try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); System.out.println("Conectando..."); Connection con; con = DriverManager.getConnection("jdbc:oracle:oci8:@",“bdii01",“bdii01"); System.out.println("CONECTADO."); String query = "SELECT nombre,estilo FROM autores"; Statement stmt; stmt = con.createStatement(); 14 7 ResultSet result = stmt.executeQuery(query); while ( result.next() ) { String name = result.getString(1) + " " + result.getString(2); System.out.println(name); } result.close(); stmt.close(); String inser = "INSERT INTO autores (id,nombre,estilo,fechanacimiento) values (100,'desconocido','???','2002-01-01')"; stmt = con.createStatement(); stmt.execute(inser); stmt.close(); con.close(); } catch (SQLException ex) { System.err.print("SQLException: "); System.err.println(ex.getMessage()); } } } 15 8