Developing Portlets using Eclipse. Part II
As I told you, the architecture that I use for these post, has iBATIS for it's persistence layer.
The main reason for use this framework was that iBatis give you the flexibility of write your own optimized sql code, and an easy way to call directly to a sql procedure. Not to mention, the existence of iBator, the code generator for iBatis :)
Spring will be a pivotal piece for the application, the reason for use of this framework it's as simple as I want to sleep as a baby. Some of the things that I want accomplish with spring is to have transparency over my data-source connection, jms..,, to make uncouple implementations from each other...
Well, the first interaction between ibatis and spring it's done in the configuration files, the next example show you how to make a configuration that also makes the application container independent.
Extract from applicationContext.xml:
<!-- obtain datasource --> <jee:jndi-lookup id="dataSourceWebProd" jndi-name="jdbc/webProd" cache="true" resource-ref="true" lookup-on-startup="false" proxy-interface="javax.sql.DataSource"/> <!-- map iBatis to datasource --> <bean id="sqlMapBaseWeb" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"><value>classpath:/config/sqlmap-configWebProd.xml</value></property> <property name="dataSource"><ref bean="dataSourceWebProd" /></property> </bean> <bean id="aliascuentasDAO" class="es.struts2PortletTemplate.dao.WebProd.AliascuentasDAOImpl"> <property name="sqlMapClient"> <ref bean="sqlMapWebProd"/> </property> </bean> <bean id="informesServicio" class="es.struts2PortletTemplate.miGestion.informes.service.InformesServiceImpl"> <property name="aliascuentasDAO"> <ref bean="aliascuentasDAO"/> </property> </bean>
sqlmap-configWebProd.xml:
<settings cachemodelsenabled="true" enhancementenabled="true" usestatementnamespaces="true"> <sqlmap resource="es/struts2PortletTemplate/dao/WebProd/sqlMap/WebProd_dbo_aliasCuentas_SqlMap.xml"> </sqlmap></settings>
And of course, you may well decide to use the Spring Framework's declarative transactions offer...
<bean id="txManagerWebProd" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSourceWebProd"/> </bean> <tx:advice id="txAdviceWebProd" transaction-manager="txManagerWebProd"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="view*" read-only="true"/> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>