Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenidos del curso ..................................................................................................................... 2 JDBC ............................................................................................................................................... 3 Drivers ....................................................................................................................................... 3 Operaciones con JDBC............................................................................................................... 4 Carga de drivers..................................................................................................................... 4 Conectar/desconectar a BD .................................................................................................. 4 Enviar rdenes a la BD. Sentencias ....................................................................................... 8 Sentencias preparadas ....................................................................................................... 12 Procedimientos almacenados ............................................................................................. 13 Tansaciones ......................................................................................................................... 14 Optimizaciones y otras mejoras .................................................................................................. 15 Porcentaje de carga: ............................................................................................................... 15 Actualizaciones en modo bach ................................................................................................ 15 Nuevos tipos de resultSet ....................................................................................................... 16 No asist a clase . ................................................................................................................. 17 EntityManager ......................................................................................................................... 18 Creaccin de las clases URM en un proyecto con un modelo de datos existente.................. 18 Queryes con nombre. Anotaciones......................................................................................... 22 Patrones de diseo. DAO ............................................................................................................ 23 Persistencia de relaciones entre clases ....................................................................................... 24 Aplicaciones WEB ........................................................................................................................ 28 Curiosidades ................................................................................................................................ 30
Lunes 14 Junio
Contenidos del curso
Dos bloques claramente distinguidos: JDBC (acceso a base d edatos) y URM (mapeadores de objeto relacin)
JDBC
APLICACIN WEB
AD (acceso datos)
Clsica (desktop)
Orientacin objetos
JSP
Servlet
Libro: Web development with Java que cubre la parte de aplicaciones Web El blog del profe: http://formanntt.blogspot.com/ Sobre la tecnologa del curso: La herramienta sobre la que trabajaremos es NetBeans 6.8, que es la versin estable. Gua de referencia rpida de JDBC: C:\MCSE\Lunes 14 de junio de 2010\Documentacin\Manual Jdbc.htm El directorio de los ejemplos se guardarn en: C:\MCSE\Lunes 14 de junio de 2010\Ejemplos Necesitamos una base de datos que puede ser cualquiera por ejemplo: Derby, MySQL Para nosotros ser MySQL que la encontramos en: Inicio> Progarmas > MySQL Clave: root
Cuanto ms actualizada este la versin que utilicemos de java podremos hacer el mismo trabajo pero trabajando menos. (JSE v6.0 Edicin Standard java, JEE v.6.0 versin Enterprice de java y JME tecnologa de mviles en java) La primera tecnologa que veremos en el curso que forma parte de la edicin Estndar es la JDBC (Conectividad para bases de datos en java) y por tanto es aplicable a cualquier aplicacin java. JDBC es un API (interface para la creacin de aplicaciones, biblioteca de clases para facilitarnos los accesos a datos), i.e, es una especificacin de cmo se debe acceder a la base de datos y adems es una implementacin.
JDBC
[ver 2.1] La arquitectura de esta herramienta sigue el siguiente esquema: Este primer nivel es el cdigo que nosotros escribimos JBDC para el Acceso a datos Los drivers son los nicos que saben que estn hablando con una BD. Son los que nos van a dar la conexin a la BD. Son las BD a las que se accede n ap
Drivers
[ver 2.3] Para funcionar nicamente necesita java. Todas las aplicaciones que actualmente existen en java tiene los drivers para ejecutarlos de tipo 4. 3 Un driver es una clase java con la diferencia que el driver debe implementar la interface, DRIVER, para que java reconozca que es un driver.
Los drivers traducen cualquier sentencia SQl de forma que la BD a la que vaya a acceder sea capaz de entenderla.
Para encontrar la clase debe estar en el classpath (variable de entorno que contiene una serie de directorios donde hay clases java compiladas) del sistema. Conectar/desconectar a BD [Ver 3.2] Conectar Supongamos ya tenemos cargado el driver y ahora nos queremos conectar a la BD. Debemos recurrir a la clase DriverManager, que se encarga de gestionar los driver que tenemos en memoria. Definiremos un objeto de la clase : Connection con = new Conecction(); y despus hay que utilizar el mtodo getConection() que nos devolver un objeto que implementar la clase DriverManager. Este mtodo necesita tres parmetros, todos ellos de tipo string: 4 url (localizador uniforme de parmetros). Tiene el siguiente formato: protocolo : nombredriver : localizacin de la BD indicando mquina y puerto(opcional) Ejemplo: para conectarme a la base de datos de derby escribira la url: INDRA | Programacin java II
Desconectar Se coge la clase con la que trabajemos y llamamos al mtodo close(). Ejemplo: con.close(); Es importantsimo llamar al mtodo close() porque si no se cierra explcitamente se podra quedar conectado al servidor remoto de la BD. EJERCICIO 1: UN programa que nos conecte y desconecte de una Base de Datos Conexiones con BD en NetBeans
Desplegamos APP:
Esto que obtenemos es un intrprete de la BD. Nos hemos asegurado que tenemos BD en el ordenador.
Ese check nos permitir importar tbn las libreras para que si arrancamos esta nueva clase en otro lugar no nos de error de no encontrar las libreras. El cdigo de programa es: // Clase que conecta y desconecta de la base de datos try { System.out.println("Invocamos al mtodo forName"); Class.forName("org.apache.derby.jdbc.ClientDriver"); System.out.println("Creamos la conexin"); Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/curso", "app", "app"); System.out.println("Cerramos la conexin"); con.close(); } catch (SQLException ex) { Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex); }
Martes 15 Junio
Antes de ejecutar un programa debo conectarme a la base de datos para lo cual:
Enviar rdenes a la BD. Sentencias [Ver 3.3] Para crear una sentencia debemos crear una variable de tipo Statement, y escribir el cdigo:
Java distingue entre dos tipos de rdenes para ejecutar: Queryes mediante la sentencia select stmt.executeQuery (SELECT ); Todo lo dems: insert, delete, update, stmt.executeUpdate (INSERT | UPDATE | DELETE | CREATE | );
Todo lo que no sea sentencia Donde stmt es la variable de tipo Statement que hemos declarado con anterioridad. Estos mtodos nos devuelven un nmero que ser el nmero de filas que han sido modificadas con esta sentencia. No ser obligatorio capturar este valor que devuelve salvo que lo queramos usar para algo. Cuando se termina de trabajar con un Statement se debe cerrar con la instruccin: Stmt.close(); Ej: String x=insert into.. stmt.executeUpdate(x); stmt.close();
Los Strings desde java los haremos con simples comillas simples. La clase se llama Primera_1:
try { System.out.println("Invocamos al mtodo forName"); Class.forName("org.apache.derby.jdbc.ClientDriver"); System.out.println("Creamos la conexin"); Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/curso", "app", "app"); java.sql.Statement stmt = con.createStatement(); System.out.println("Insert en la BD"); String i1 = "INSERT into personas (id,nombre) values (1,'nombre1')"; stmt.executeUpdate(i1); String i2 = "INSERT into personas (id,nombre) values (2,'nombre2')"; stmt.executeUpdate(i2); String i3 = "INSERT into personas (id,nombre) values (3,'nombre3')"; stmt.executeUpdate(i3); System.out.println("Update en la BD"); String u2 = "UPDATE personas set nombre= 'nombreActualizado' where id=2"; stmt.executeUpdate(u2); System.out.println("Delete en la BD"); String d3 = "DELETE from personas where id in(1,2,3)"; stmt.executeUpdate(d3);
Sentencias
Para ejecutar sentencias utilizaramos la sentencia: String consulta= Select.from stmt.executeQuery (consulta); 10 Esto nos devolver una coleccin de filas. EN java tenemos una coleccin (metaclase) especial para guardar las filas de una consulta: ResultSet rs = stmt.executeQuery (consulta); INDRA | Programacin java II
Supongamos que la consulta nos va a devolver un nmero enorme de resultadosentonces el servidor se quedar frito para ello y JDBC hace lo siguiente: resultSet Jdbc BD
jdbc le dice a la BD que le devuelva un nmero adecuado de filas y esas son las que mete en el resultSet, entonces cuando vayamos recorriendo este resultSet las primeras N filas nos las devuelve del servidor de cliente y cuando se vayan acabando ir a la BD a buscar la otras N filas, de este modo nos aseguramos que se pueden obtener todas las filas sin dejar colgado el servidor. Lgicamente durante todo este proceso la conexin con la BD debe estar abierta, en cuanto se cierre el resultSet se invalida. La relacin entre los objetos es jerrquica: Connection puede tener cualquier nmero de St abiertos Statement puede tener cualquier nmero de rs abiertos resultSet De forma que si cierro al padre de cualquiera de ellos invalidar al que est por debajo. Entonces para abrir las connection, Sattement o resultSet, lo har de arriba abajo y para cerrarlos de abajo a arriba. Nota: Se deben crear siempre para programar bien el nmero mnimo de conexiones necesarias. Para recorrer el rs utilizaramos por ejemplo un bucle while, cuya sintaxis ser: While (rs.next()) se ejecutar mientras haya filas que devolver. Las columnas se numeran de izquierda a derecha de forma consecutiva comenzando por 1. Tambin se pueden recuperar indicando el nombre de la columna. OJO algunos drivers no me permiten acceder por parmetro posicional para obtener los valores Los pasos imprportantesson: 1. 2. 3. 4. 11 Documentacin para esto: http://java.sun.com/javase/6/docs/technotes/guides/jdbc/getstart/GettingStartedTOC.fm.ht ml INDRA | Programacin java II Se debe llamar al mtodo next() Acceder por parmetro posicional para obtener los valores No leer ms de dos veces cada lnea 4..cual es??
ACADEMIA
12
Mircoles 16 Junio
Procedimientos almacenados [Ver 3.5] Para la ejecucin en remoto de un procedimiento almacenado. Debo definirme una variable de tipo:
CallableStatement cstmt = con.prepareCall ({call ProcAlmacenado (?,?,?, , ?)});
Donde procAlmacenado es el nombre del procedimiento almacenado que exista en la base de datos. OJO HAY UN ERRRO EN LA SINTAXIS DE LOS APUNTES, LA CORRECTA LA INDICO AQU. La sintaxis correcta para llamar a PROC y a FUNC es: Para PROC: {call f(?,?)} Para FUNC: {? = call CrearPersona(?,?)} Si el PROC tiene parmetros hay que definirlos. En BD tenemos para los PROC tres tipos de parmetros: IN el servidor solo puede leer, no escribir el parmetro OUT el servidor solo puede escribir, no leer el parmetro IN/OUT el servidor puede leer y escribir el parmetro
Cuando un parmetro es de salida hay que decrselo a java y esto se hace mediante la el mtodo:
Para PROC: cstmt.registerOutParameter (Types.INTEGER); Para FUNC: cstmt.registerOutParameter (1, Types.INTEGER);
en el que se indica el parmetro que es de salida y el tipo de datos al que pertenece el parmetro de salida. A continuacin se dan valor a los parmetros al igual que ocn las sentencias predefinidas con los mtodos ser. Y finalmente se ejecutar el procedimiento teniendo en cuenta que si el PROC almacenado ejecuta a una sentencia o select se llamar al mtodo cstmt.executeUpdate(); y si no es una sentencia o select se utilizar: cstmt.executeQuery(); Ejemplo: 13
CallableStatement cstmt = con.prepareCall (? = call CrearPersona (?,?)); cstmt.registerOutParameter (1, Types.INTEGER); cstmt.setInt (2, 13456789); cstmt.setString (3, Bart);
OBSERVACIN: Con la BD de ApacheDerby todo esto no funciona, es decir, no se pueden manejar de este modo los PROC ni FUNC El mtodo: Execute(); se utiliza para ejecutar procedimientos mixtos, es decir, si en el PROC almacenado existen sentencias select peor tbn tiene otras instrcciones insert, update, delete entonces debemos usar este mtodo y no el executeQuery o executeUpdate.
Ejercicio: abrimos el proyecto UsoJdbcMySql que est en la careta de apuntes del profesor del lunes 14 de Junio. Recordemos que como vamos a utilizar la base de datos MYSQL, con lo que deben esar instalados los drivers de MySQL en el path de la mquina. Este ejemplo nos da la sintaxis para crear un modelo de datos a travs de un programa java. No es lo ms til peor si nos da una herramienta o una ayuda por si alguna vez y por temas de portabilidad nos interesa crear as el modelo. Tansaciones [ver 3.7] El objetivo de una transacione es agrupar un conjunto de sentencias SQl en un mismo paraguas, es decir, que en el momento que una de ellas falle se desharn todas las acciones realizadas hasta entonces en la BD. Si todas las sentencias han ido bien se realiza un commit(); y si falla se hace un rollback();. Jdbc cada vez que se lanza una sentencia con xito hace automticamente un commit(),pero hay que indicarle que lo haga. Para ello usamos el mtodo: con.setAutoCommit (false); False las transacciones sern controladas manualmente por el programador. En este caso tras la realizacin de la ssentencias de debe llamar adems la mtodo con.commit(); True las transacciones las hace automticamente jdbc.
Ej:
14
Con.commit(); // todo ha ido bien }catch (SQLException e){ Con.rollback(); //algo ha fallado }finally{ //el cdigo dentro de un finally se ejecuta siempre salten o no excepciones Con.setAutocommit(true); //toma el control jdbc } Un nivel de aislamiento o de transaccin bloquea procesos sobre una sentencia hasta que la transaccin correspondiente haya terminado. Hay varios niveles de aislamientos, que se consultan en la APIs de java mejor.
Porcentaje de carga:
[ver 5.1] setFechtSize() permite cambiar le procentaje de carga a nivel de resultSet o a nivel de Statement (en este caso todos los resulSet herdarn estas porcentaje de carga) getFechtSize() nos dice el porcentaje de carga del que disponemos.
Se aconseja que el porcentaje de carga no se modifique, hasta que no sepamos a quin se la debemos aplicar, es decir, saber de en que gasta el tiempo la aplicacin y que hacen los usuarios finales con la aplicacin.
15
As en vez de tener N rounds tendr 1 round con todas las sentencias, con lo que habremos disminuido sustancialmente el trfico. Este modo no aumenta la carga en el servido en ningn caso, por lo que no se conocen efectos negativos.
Para crearlos: Statement st = con.createStatement(parametro1,prametro2) A tener en cuenta: 1. Cuanto ms nuevo sea un rs ms lento ser. Todo lo que se haga con los nuevos rs se puede hacer con los rs ms simples de todos que son los que hemos expliacdo estos das atrs, puesto que todo ser ms rpido. 2. La mayora de las operaciones de nuevos rs no las soportan muchas BD. Si el Apartado[6] nos lo deja como ejercicio para nosotros y no lo haremos aqu.
EJERCICIO: Prcticas del epgrafe 8. Estn resueltas en el paquete UsoJdbcMySql que est en la careta de apuntes del profesor del lunes 14 de Junio. Vamos a revisar el cdigo
16
Jueves 17 Junio
No asist a clase . Se tocaron temas de persistencia *Ver + Comenzaron con JPA (Java persistence api)
17
Lunes 21 Junio
Continuacin del Jueves JPA
EntityManager
Se crea un EntityManager por cada conexin a una base de datos que desee. Intentar usar un nico EntityManager por cada mtodo. Despus abrir una transaccin de forma obligatoria. Ver ejemplo Mircoles 16 Junio del proyecto JpaUnaClase0000 la clase Principal. EL mtodo merge(): //Nota: la llamada al mtodo merge es innecesaria Se usa para actualizar versiones. Pero no es necesario pues cuando se opera con un objeto de tipo EntityManager al hacer el commit() se actualiza de forma automtica todas las versiones. El EntityManager debe estar abierto y debe conocer los objetos. Sin embargo si le hago persistente al hacer el el commit() los actualizar de forma automtica. Si utilizase ms de un entityManager y lo cierro cuando no lo utilice todas las actualizaciones se harn de forma automtica. Si utilizase uno al pripio d elcdgio que siempre sestuviese abierto tendri que controlar su crecimiento a travs d elos mtodos: Flush: har una actualizacin de tofo clear: Borrar el cach de la BD
Por eso se aconseja utilizar solo uno. Para crear un objeto EntityManager debo llamar al Mtodo CreateEntityManager.
18
Botn derecho para hacer ingeniera Inversa. Y selecciono opcin: Entity Classes for database
19
Este check tiene que estar marcado, porque si hay relaciones entre muchas tablas al hacer ingenieria inversa habr que hacer a mano muchas cosas para dejarlo bien. La ingeniera inversa por tanto con tablas aisladas o tablas relacionadas de 1 a n, si trabajan bien.
Al llegar a la pantalla:
20
Nos informa queno hay unidad de persistencia y nos indica si queremos que la herramienta nos ayude, para ello pulsamos el botn: Create persistence unit Sleccionamos como proveedor a Hibernate:
21
Lo aceptamos y seguimos el proceso llegando a esta pantalla, en la que marcamos los checks.
Nos crea en la carpeta META-INF el xml de persistence. (Que explicaron el jueves) y nos crea el cdigo de java de las clase correspondiente a la tabla de la BD. Que justo es d elo que se trataba la Ingeniera Inversa.
PRACTICA: montra un proyecto que tenga persistencia Ver Ejemplo mircoles 16 : JpaUnaClase0002
22
Martes 22 Junio
Patrones de diseo. DAO
Si el cdigo esta bajo JPA y cambiamos a hibrnate el cdigo puede ser que no compile.. Para resolver esto existen los Design Pattens o patrones de diseo. Los patrones de diseo, es una estrategia que se sabe que va a funcionar para resolver un escenario determinado, es decir, una solucin estndar que se sabe por anticipado que va a funcionar para un escenario problemtico determinado. Pero ojo no tiene por qu ser la solucin ptima. Los patrones de diseo ms utilizados en la tecnologa java son los GoF (Gangs of four). Nota Si queremos informacin sobre esto solicitarla al profe por el foro Nota: Recapitulando lo visto hasta hoy en curso tendremos la estructura: Jpa > ORM > Jdbc > BD. El patrn de diseo ms simple que hay es el DAO (objeto de acceso a datos). Cliente (cliente ) DAO (interface que ve el cliente) JpaDaO (implementacin de la interface DAO) Si el da d emaana quiero utilizar Hibernate en vez de JPA bastar implementar una nueva interface en hibrnate y para el cliente ser totalmente trasparente. Y lo mismo si nuevamente quisiera vambiar de tecnologa y utilizar otra como por ejemplo Jdbc t tendra que implementar jdbcDAO. Ejemplo: JpaUnaClase0002 El patrn DAO nos sirve para enumerar todos los mtodos de una clase persistente de una sola atacada en el ejemplo ser la clase PersonaDAO. Esta interface es publica peor su implementacin no lo ser. Luego tendremos que tener una clase que nos implemente el DAO. En el ejemplo es la clase PersonaDAOImple. En el ejemplo el main est en un paquete distinto a en el que est la implementacin del DAO, para que se puedan utilizar se ha creado otro patrn de diseo llamado Singleton, y que en el ejemplo es la clase: PersonaManager. En el escenario siguiente: 23 Solo una instancia de una clase: para o cual se llama Que sea instanciada desde cualquier sitio: para ello el constructor se define como privado y los atributos se define como privado y esttico
El mtodo getInstance() es el que nos asegura que nicamente se va a instanciar el Personamanager una nica vez puesto que el if del cdigo tras haberlo instanciado mas de una vez siempre nos devolver el mismo objeto. Si ahora quiero trabajar con los mtodos del DAO, me creo el mtodo getPersonaDao() que nos devolver un objeto de tipo implementacin de la clase PersonaDao. Si quiero cambiar de tecnologa lo que cambiar es justamente este mtodo: En el ejemplo tenemos: public PersonaDao getPersonaDao() { return new PersonaDaoImpl(); } Si quiero usar jdbc har: public PersonaDao getPersonaDao() { return new PersonajdbcImpl(); } Nota: En un escenario real de PROD cuanto menos nos cueste (rpido, fcil y barato) introducir cambios ser un indicador de que la aplicacin est bien programada, tal y como es el objetivo de la programacin orientada a objetos. Ver tambin ejemplo jueves 17 junio : JpaDosClases0001
@OneToOne @ManyToMany @OneToMany @ManyToOne En relaciones de 1 a muchos (1 *) necesitamos que se haga persistencia en objetos declarados en cascada. Podemos mandar a JPA que haga la persistencia en cascada. Una operacin en cascada en JPA significa que cuando se le dice al urm que haga persistencia sobre un objeto tambin lo har sobre todos los objetos que cuelguen de l. En JPA se hace con el comando cascade. Academia (18:00h 19:30h)
25
Mircoles 23 Junio
Ejemplo de persistencia carpeta del jueves 17Junio: EjemplosPersistencia y en la clase EjemplosPersistencia-ejb existen ejemplos de cmo hacer mapeos de relaciones de todos los tipos] Cualquier clase que compile el URM las har persistente, y podr elegir entre tres estrategias distintas para realizarlo: 1) SingleTabe 2) Joined 3) Table per class Vemoslo en un ejemplo:
1)Modelo singleTable: Es el que emplea URM por defecto. Crea una tabla para todas las clases y un campo discriminador que nos dice a que clase pertenece cada lnea A id x y DTYPE 1 8 null A 2 5 3 B @ A X:int id hereda B y:int 2) Joined: crea una tabla por cada clase A id x B id y
FK
3)Table per Clae: crea una tabla por clase en la que repite todos os atributos de cada tabla. A id x id B y x
26
El modelo 1) es el ms feo peor el ms eficiente, por eso es el que URM elige por defecto Por tanto por defetco usa la estrategia 1) peor si quiero que use otra d ela sestrategias hay que indicrselo. El cdigo es: 1 caso Modelo 1 @Inheritance(strategy=InheritanceType.SINGLE_TABLE) 2 caso Modelo 2 @Inheritance(strategy=InheritanceType.JOINED) 3 caso Modelo 3 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
27
Aplicaciones WEB
Lo que nos interesarn son las : www: World wide web Servidor Cliente Servidor Web
Para comunicar el cliente con la web se necesita un protocolo de comunicacin que para nosotros ser HTTP : Lo que se manda a un servidor web es una request y lo que el servidor responde se llama response Ej: http://www.google.es/index.html
El dominio de una url es lo que identifica un ordenador concreto. Ej: google.es Una direccin IP tiene el formato: 127.0.0.1 y representa al localhost desde el que se realiza la llamada. Cuando se teclea una url lo primero que har explorer es preguntarle al DNS(Servicio de nombre de dominio). ACADEMIA
28
Jueves 24 Junio
[Continuacin de servlets..]
Servlets
Ejemplo Jueves 24 Jnio : WebApplication1 Un servlet es una clase java con unas determinadas caractersticas entre ella que tiene que ser hija de HttServlet. Responde a un patrn de diseo llamado inversin de Control, que como su nombre indica invierte el control ya que es API quien nos llama a nosotros y no nosotros al l. Un servlet en java se representa con un pentgono,
29
Curiosidades
http: protocolo trasferencia de hipertexto www: worl wile web Ley no escrita de la informtica: Todo programa se tira el 90% de su tiempo en el 10% del cdigo. url: Localizador uniforme de resursos ftp: potocolo de transporte de archivos. Otro modo de que dos ordenadores intercambien informacin. TCP/IP: protocolo de transporte / protocolo de internet
30