Modularization is really important. Since this is my first time to develop a portlet, For this portlet, I changed design several times because of performance. The last time, I changed it because of modularization. There're three projects which target one goal. Previously, I connect database separately, mybatis scatters in those projects.
In the new design, I have a persistence project. It'll be a jar in the near future. I just add dependency in those projects' pom.xml, one thing I need to do in those projects is to load spring config.xml in the jar.
In my case, two projects are web projects, it's good to get datasource from tomcat/conf/context.xml since many portlets will use the same datasource. But I have a standalone project, I can't get the datasource from tomcat, I have two ways to do that: one is to change datasource in config.xml in jar; the other is to override jar's configuration. Obviously, the second one is better.
Let me show you some code:
Persistence-Context.xml in jar file
<jee:jndi-lookup id="myDataSource" jndi-name="jdbc/sqlserver/liferay"/>
<Resource name="jdbc/sqlserver/liferay" auth="Container" type="javax.sql.DataSource" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://IP:Port;databaseName=mydatabasename" username="***" password="***" maxActive="20" />
<import resource="classpath*:Persistence-Context.xml"></import>Then, in your portlet, we can use all beans in the jar. It's very convenient.
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://IP:PORT;databaseName=mydatabasename" /> <property name="username" value="***" /> <property name="password" value="***" /> </bean>