Friday, August 27, 2010

IBatis ResultMap – Using resultMap as property in another resultMap


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