IBatis ResultMap – Using resultMap as property in another resultMap
We can use the one resultMap in another resultMap. This requires the additional attribute i.e groupBy in resultMap and we can specify other resultMap as property. This helps us to get the top level objects along with contained objects, while getting the data from database. The following code snippet shows how to get contained objects along with the top level object using iBatis.
USER_INFO_SqlMap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="USERS_INFO">
<resultMap id="usersPhoneMap" class="data.beans.UserPhone">
<result column="P_USER_ID" property="userId" jdbcType="NUMBER" />
<result column="PHONE_TYPE" property="phoneType" jdbcType="VARCHAR" />
<result column="PHONE_NUMBER" property="phoneNumber" jdbcType="VARCHAR" />
</resultMap>
<resultMap id="usersInfoMapWithPhoneNumbersMap" class="data.beans.UserInfo"
groupBy="userId">
<result column="USER_ID" property="userId" jdbcType="NUMBER" />
<result column="USERNAME" property="userName" jdbcType="VARCHAR" />
<result column="STATE" property="state" jdbcType="VARCHAR" />
<result column="COUNTRY" property="country" jdbcType="VARCHAR" />
<result column="IS_ACTIVE" property="isActive" jdbcType="CHAR" />
<result property="userPhones" resultMap="USERS_INFO.usersPhoneMap" />
</resultMap>
<select id="USERS_PROFILE_userInfoWithPhoneNumbersByUserName"
resultMap="usersInfoMapWithPhoneNumbersMap" parameterClass="java.lang.String">
SELECT
UI.USER_ID, UI.USERNAME, UI.STATE, UI.COUNTRY, UI.IS_ACTIVE,
UP.USER_ID AS P_USER_ID, UP.PHONE_TYPE, UP.PHONE_NUMBER
FROM USERS_INFO
UI, USERS_PHONE UP
WHERE UP.USER_ID(+) = UI.USER_ID
AND UI.USERNAME = #userName#
</select>
</sqlMap>
sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<sqlMap resource="USER_INFO_SqlMap.xml" />
</sqlMapConfig>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@sbkj2kdbd02.wsjdev.dowjones.net:1521:COMMERCE" />
<property name="username" value="provision" />
<property name="password" value="provision123" />
</bean>
<bean id="userInfoDAO" class="data.dao.UserInfoDAOImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="userInfoBO" class="data.bo.UserInfoBO">
<property name="userInfoDAO" ref="userInfoDAO" />
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>sqlMapConfig.xml</value>
</property>
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="iBtaisUserInfoDAO" class="data.dao.IBatisUserInfoDAOImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
</beans>
IBatisUserInfoDAO.java
package data.dao;
import data.beans.UserInfo;
public interface IBatisUserInfoDAO {
UserInfo retrieveUser(String userName);
}
IBatisUserInfoDAOImpl.java
package data.dao;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import data.beans.UserInfo;
public class IBatisUserInfoDAOImpl extends SqlMapClientDaoSupport implements IBatisUserInfoDAO {
public UserInfo retrieveUser(String userName) {
UserInfo userInfo = (UserInfo) getSqlMapClientTemplate().queryForObject(
"USERS_PROFILE_userInfoWithPhoneNumbersByUserName", userName);
return userInfo;
}
}
ApplicationContextUtil.java
package data.util;
import java.io.IOException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextUtil {
private static final String CONTEXT_CONFIG = "applicationContext.xml";
private static ApplicationContext applicationContext = null;
private ApplicationContextUtil() {
}
public static ApplicationContext getApplicationContextInstance() {
if (applicationContext == null) {
synchronized (ApplicationContextUtil.class) {
if (applicationContext == null) {
try {
applicationContext = createApplicationContext();
} catch (IOException io) {
io.printStackTrace();
}
}
}
}
return applicationContext;
}
private static ApplicationContext createApplicationContext() throws IOException {
return new ClassPathXmlApplicationContext(CONTEXT_CONFIG);
}
}
Code snippet to get the UserInfo Object.
ApplicationContext ctx = ApplicationContextUtil.getApplicationContextInstance();
IBatisUserInfoDAO iBtaisUserInfoDAO = (IBatisUserInfoDAO) ctx.getBean("iBtaisUserInfoDAO");
UserInfo userInfo = iBtaisUserInfoDAO.retrieveUser(username);
No comments:
Post a Comment