8. Programación para bases de datos8.1 Conceptos GeneralesTodo DBMS que se digne tener calidad debe proveer una manera de comunicarse con él. 8.1.1 IntroducciónPor qué hacer programas que interactúen con nuestras bases de datos ??? Customizar la entrada de datos
Customizar la salida de datos
Trabajar alrededor de las limitantes inherentes de SQL
Integración en alguna aplicación
8.1.2 API's (Application Programming Interface)
C C++ DBI (Database Interface) PHP (Hypertext Preprocessor) Java (JDBC Driver) Qué API debo utilizar ?? Aspectos a considerar:
8.1.3 Interactuando con el DBMSActividades a realizar
Error Handling Es muy importante manejar los errores: 1) Mantener informado al usuario 2) Poder recuperarse de ellos
Causas de errores 1) Errores de sintáxis en expresiones de queries 2) Problemas de privilegios en determinadas tablas o bases de datos 3) Caídas del DBMS: luz, espacio en disco, NFS. 8.1.4 Terminología
8.2 Java Database Connectivity (JDBC)8.2.1 Arquitectura8.2.2 Versiones
8.2.3 Tipos de Drivers:
Vendedores: - Actualmente la mayoría de los DBMS proveen sus drivers Información necesaria para inicializar un Driver MySQL
Informix
URL= url :// server : port / database
URL = url : database
|
1:import java.sql.*; 2: 3:class Insert{ 4: public static void main (String argv[ ]) { 5: Connection con=null; 6: try { 7: 8: // Busca el driver para el tipo de DBMS en cuestion 9: Class.forName("com.mysql.jdbc.Driver"); 10: 11: //definiendo url de conexion con la base de datos 12: String url="jdbc:mysql://localhost:9096/prueba"; 13: 14: //Abriendo conexion 15: con= DriverManager.getConnection(url, "carlos","lolo"); 16: 17: 18: con.setAutoCommit(false); 19: 20: // crear enunciado 21: Statement stmt = con.createStatement(); 22: 23: 24: 25: //ejecutar query 26: int inserted = stmt.executeUpdate("insert into users values (56,'juan perez');"); 27: 28: con.commit(); 29: 30: // Ciclo para recorrer los resultados 31: System.out.println("Inserted:"+inserted); 32: //cerrando el statement 33: stmt.close( ); 34: 35: //cerrando conexion 36: con.close( ); 37: } 38: catch( Exception e) { 39: e.printStackTrace( ); 40: 41: try 42: 43: { 44: 45: con.rollback(); 46: 47: con.close(); 48: 49: }catch(Exception e2){} 50: 51: } 52: } 53:}
|
//Selección de tuplas
// Teniendo la tabla users(id int, name char(255))
1:import java.sql.*; 2: 3:class Select { 4: public static void main (String argv[ ]) { 5: 6: Connection con=null; 7: try { 8: 9: // Busca el driver para el tipo de DBMS en cuestion 10: Class.forName("com.mysql.jdbc.Driver"); 11: 12: //definiendo url de conexion con la base de datos 13: String url="jdbc:mysql://localhost:9096/prueba"; 14: 15: //Abriendo conexion 16: con = DriverManager.getConnection(url, "carlos","lolo"); 17: 18: 19: // crear enunciado 20: 21: 22: Statement stmt = con.createStatement(); 23: 24: // Teniendo la tabla users(id int, name char(255)) 25: 26: //ejecutar query 27: ResultSet rs = stmt.executeQuery ("select * from users;"); 28: 29: // Ciclo para recorrer los resultados 30: System.out.println("Got results:"); 31: while (rs.next( )) { 32: 33: int ID= rs.getInt(1); 34: String Name= rs.getString(2); 35: System.out.print(ID +" "+ Name ); 36: System.out.print("\n"); 37: 38: } 39: //cerrando el statement 40: stmt.close( ); 41: 42: //cerrando conexion 43: con.close( ); 44: } 45: catch( Exception e) { 46: e.printStackTrace( ); 47: 48: } 49: } 50:}
|
setenv CLASSPATH ${CLASSPATH}:$HOME/mysql-connector-java-3.0.9-stable-bin.jar
%> javac Select.java
%> java Select
Got results:
1 carlos
2 alfredo
%>
Ejemplo de una aplicacion en JDBC usando PreparedStatements
//Inserción y Selección de una tupla
// Teniendo la tabla datafiles(id int, description varchar(255), category int, files blob)
// blob ~ byte
1:import java.sql.*; 2:import java.io.*; 3: 4:class BlobSample{ 5: public static void main (String argv[ ]) { 6: 7: Connection con=null; 8: try { 9: 10: // Busca el driver para el tipo de DBMS en cuestion 11: Class.forName("com.mysql.jdbc.Driver"); 12: 13: //definiendo url de conexion con la base de datos 14: String url="jdbc:mysql://localhost:9096/prueba"; 15: 16: //Abriendo conexion 17: con = DriverManager.getConnection(url, "carlos","lolo"); 18: 19: 20: 21: 22: //ejecutar query 23: // Teniendo la tabla datafiles(id int, description varchar(255), category int, files blob) 24: // blob ~ byte 25: String sql = "insert into datafiles values(?,?,?,?);"; 26: 27: 28: // crear enunciado 29: PreparedStatement ps = con.prepareStatement(sql); 30: 31: ps.setInt(1, 34); 32: ps.setString(2,"rock"); 33: ps.setString(3,"music"); 34: FileInputStream fis = null; 35: int fileLength = Integer.MIN_VALUE; 36: 37: try 38: { 39: File file=new File("/home/digital/biblio_news.txt"); 40: fis = new FileInputStream(file); 41: fileLength= (int) file.length(); 42: ps.setBinaryStream(4, fis, fileLength); 43: } 44: catch(FileNotFoundException fnfe) 45: { fnfe.printStackTrace();} 46: 47: 48: 49: ps.executeUpdate(); 50: //-------------------------------------- 51: //recuperamos esa informacion 52: 53: // crear enunciado 54: Statement stmt = con.createStatement(); 55: 56: //ejecutar query 57: ResultSet rs = stmt.executeQuery ("select * from datafiles;"); 58: // Ciclo para recorrer los resultados 59: System.out.println("Got results:"); 60: while (rs.next( )) { 61: 62: InputStream is= rs.getBinaryStream("files"); 63: ByteArrayOutputStream baos=new ByteArrayOutputStream(); 64: int abyte; 65: while(true) 66: { 67: try 68: { 69: abyte=is.read(); 70: if (abyte== -1) 71: break; 72: 73: baos.write(abyte); 74: } 75: catch(Exception e1) 76: { break; } 77: }//while 78: 79: System.out.println(new String(baos.toByteArray())); 80: 81: } 82: //cerrando el statement 83: stmt.close( ); 84: 85: //cerrando conexion 86: con.close( ); 87: } 88: catch( Exception e) { 89: e.printStackTrace( ); 90: 91: } 92: } 93:}
|
Usualmente la programación para bases de datos consiste de varios objetos que son parte de patrones (patterns) bien conocidos, tomando en cuenta las 3 capas de toda aplicación (presentation, business e integration), como son los DTO's (Data Transfer Objects) y los DAO's (Data Access Objects), de manera que el DTO se ubica en la capa de negocio y contiene toda la informacion de los objetos a salvarse en la base datos y el DAO asociado se encuentra en la capa de integración y realiza todas las operaciones de persistencia de dicho objeto.
Más información de estos patrones se puede encontrar en:
http://www.corej2eepatterns.com/Patterns2ndEd/index.htm