Enlaces
Artículos de miembros
Spring + DAO Pattern (usando JDBC/iBATIS/JPA) | Spring + DAO Pattern (usando JDBC/iBATIS/JPA) |
|
|
|
| escrito por diego.silva | |
|
Spring es un poderoso framework para Java donde su principal objetivo (y muy útil) es la instanciación de objetos. Desde nuestros programas - en vez de hacer new() y con cientos de inicializaciones de valores - simplemente obtenemos el objeto ya armadito desde el Spring. Lo que veremos en este micro tutorial es cómo usar Spring bajo el patrón Dao y patrón Factory. Veremos una aplicación web (usando JSF) que accede a la base de datos "sample" que viene incluido en el NetBeans. Nuestra aplicación se ejecutará en Glassfish, y debe contar con un JDBC Resource que accede a la base de datos mencionada.
En los ejemplos publicados, veremos que existe el archivo sun-resources.xml que contiene la configuración del JDBC Resource y JDBC Pool para crear el DataSource en nuestro Glassfish: <?xml version="1.0" encoding="UTF-8"?> En resumen, para acceder a nuestra base de datos lo haremos por el dataSource, usando el JDNI: jdbc/sample. Usando JDBCRowMapperEste es quizás la manera de acceder a la base de datos más simple y básica. Recordemos que cuando usábamos un JDBC normal, después de hacer un executeQuery(), haciamos un while (rs.next()) y dentro del bucle haciamos un new a cada objeto por cada fila y lo agregábamos a una lista. Pues con el Spring es lo mismo, pero nos da una ayudadita.
El Spring es el que hace el executeQuery() y le decimos cómo lo va a tratar por cada fila del resultado. Esto se hace implementado la interfaz org.springframework.jdbc.core.RowMapper. Para mayor información como hacer queries desde Spring, visitar: http://static.springframework.org/spring/docs/2.5.x/reference/jdbc.html ¿Y el jdbcTemplate?Pues este objeto es una propiedad que fue recibida desde el Spring: private JdbcTemplate jdbcTemplate; ¿Y cómo el Spring pone el valor del DataSource?Así: <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> Proyecto ejemplohttp://diesil-java.googlecode.com/files/SpringDaoJdbc.tar.gzUsando IBatisiBATIS es un framework de Apache que consiste en mapear las consultas y los objetos que son resultado de las consultas o que son usados como parámetros de ellas. Solo hace eso: mapea consultas. No confundir ni comparar con JPA. Con iBATIS, ya no se tiene que poner los comandos SQL dentro de los programas Java, sino se usa un archivo .xml. Archivos .XML para iBATISEste es el contenido del archivo Product.xml que contiene las consultas que refiere a la tabla PRODUCT: <?xml version="1.0" encoding="UTF-8"?> Como se puede ver, el mapeo de cada columna con cada propiedad del objeto beans.Product está dado en el tag <resultMap> y es utilizado en el <select>. iBATIS ya sabe que cada resultado de ese query será mapeado por el resultMap="productResult". El archivo de configuración de iBATIS requiere cierta configuración para acceder a la base de datos; pero usando Spring, el archivo quedará reducido a lo siguiente:(Archivo SqlmapConfig.xml)
beans.xml para iBATISAhora, necesitamos configurar el beans.xml para que la conexión a la base de datos lo configure a nuestro iBATIS. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> La implementación del acceso a IBatis.Ahora, nuestra clase para manejar el IBatis es el siguiente: public class IBatisProductsDao extends SqlMapClientDaoSupport implements ProductDao {Por la herencia de la clase org.springframework.orm.ibatis.support.SqlMapClientDaoSupport, se tiene el método setSqlMapClient(), que es lo que se está usando en el archivo beans.xml Para mayor información de cómo usar IBatis con Spring, ver: http://static.springframework.org/spring/docs/2.5.x/reference/orm.html#orm-ibatis Proyecto ejemplohttp://diesil-java.googlecode.com/files/SpringDaoIBatis.tar.gz Usando JPA¿Será necesario usar Spring con JPA? Si vamos usar el patrón DAO + Factory, definitivamente que sí. Ya que el Factory se encargará de devolver una interfaz implementada según sea haya decidido usar. La aplicación misma no cambia, solo cambiará la implementación del acceso a la base de datos. La clase entidadPara usar JPA, es necesario hacer unos ajustes a nuestros Objetos de Transferencia (Transfer Objects, es decir, los objetos que usamos para mostrar en el lista y obtener datos de la base de datos). Es necesario que sean declarados como Entidades. @Entity beans.xml para JPAEl archivo persistence.xml ya tiene la conexión a la base de datos por el JNDI del datasource. Pero ahora lo que nos tiene que preocupar es acceder desde nuestra implementación de ProductoDao usando JPA. NetBeans tiene un asistente para acceder al JPA usando el JNDI, pero como nuestra implementación de ProductoDao no es un componente de JEE, entonces nos va a generar bastante código con referente a Context y demas cosas de JNDI. Lo ideal es que se use anotaciones. Para ello, debemos considerar lo siguiente en nuestro beans.xml. <bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> El tag <context:annotacion-config/> es el que se encargará de permitir las anotaciones en nuestra implementación de ProductDao. Implementación de la interfaz ProductDaoAhora bien, nuestra implementación de la interfaz ProductDao es como sigue: @Repository Y todo lo demás, sigue igual. Proyecto ejemplohttp://diesil-java.googlecode.com/files/SpringDaoJpa.tar.gz El resto del proyectoComo hemos visto, nos hemos centrado más en el acceso a la base de datos que en la aplicación en sí. El DAOFactoryEsa es la idea del DAO + Factory: solo cambiar el acceso a la base de datos, el resto de la aplicación no debe sufrir modificación alguna. De tal manera que si se necesita cambiar la manera de acceder a la base de datos, solo se necesita cambiar en el beans.xml la implementación que necesitemos: <!-- Usando JDBC --> Los tres casos son accedidos por el nombre "ProductDao". Esto quiere decir que nuestra clase DAOFactory, deberá tener el siguiente código: public class DaoFactory {La interfaz Dao: ProductoDaoProductDao es una interfaz que solo tiene los métodos a implementar. No tiene nada más. Así que nuestro DaoFactory no sabrá qué devolverá el método factory.getBean(). Solo sabe que lo que devuelva será una interfaz ProductDao. public interface ProductDao {El cliente: ProductManagedBeanEl objeto que usará el DAOFactory para acceder a la base de datos, queda reducido a lo siguiente: private ProductDao productDao; En nuestra aplicación es el ManagedBean encargado de mostrar el listado en el JSP. Proyectos utilizados |
| < Anterior | Siguiente > |
|---|