常言笑的家

          Spring, Hibernate, Struts, Ajax, RoR

          ibatis 對象關系實現

          hibernate 的強大在于完全的對象化,對于對象之間的關系解決的比較好,如1對1,1對多,多對1,以及多對多。當然也包括繼承關系。
              而ibatis這方面就比較遜色了,不過對于也支持簡單的關連查詢,如1對1,和1對多。對于一般的情況來說,這兩種已經足夠了,當然不能層疊更新是一個缺陷,看了半天文檔,也沒有找到對象之間的層疊更新,估計是不支持。
              以前的版本ibatis處理關連是通過執行兩次sql來實現的,如下的實例:
              一對多關聯:
          <sqlMap namespace="User">  
          <typeAlias alias="user" type="com.ibatis.sample.User"/>  
          <typeAlias alias="address" type="com.ibatis.sample.Address"/>  
          <resultMap id="get-user-result" class="user">  
          <result property="id" column="id"/>  
          <result property="name" column="name"/>  
          <result property="sex" column="sex"/>  
          <result property="addresses" column="id" select="User.getAddressByUserId"/>  
          </resultMap>  
          <select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result">  
          <![CDATA[ 
          select id,name,sex from t_user 
          where id = #id# 
          ]]>  
          </select>  
          <select id="getAddressByUserId" parameterClass="int" resultClass="address">  
          <![CDATA[ 
          select address,zipcode 
          from t_address 
          where user_id = #userid# 
          ]]>  
          </select>  
          </sqlMap>
          這里通過在resultMap 中定義嵌套查詢getAddressByUserId,我們實現了關聯數據的讀取。
          需要注意的是,這里有一個潛在的性能問題,也就是所謂“n+1”Select問題。
          一對一關聯:
          對于這種情況,我們可以采用一次Select兩張表的方式,避免這樣的性能開銷(假設上面示例中,每個User 只有一個對應的Address記錄):
          <resultMap id="get-user-result" class="user">  
          <result property="id" column="id"/>  
          <result property="name" column="name"/>  
          <result property="sex" column="sex"/>  
          <result property="address" column="t_address.address"/>  
          <result property="zipCode" column="t_address.zipcode"/>  
          </resultMap>  
          <select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result">  
          <![CDATA[ 
          select * 
          from t_user,t_address 
          where t_user.id=t_address.user_id 
          ]]>  
          </select>  
          在現在的版本中,對于n+1問題,ibatis已經很好的解決了。如下的配置:
          一對一
          <resultMap id=”get-product-result” class=”com.ibatis.example.Product”>  
          <result property=”id” column=”PRD_ID”/>  
          <result property=”description” column=”PRD_DESCRIPTION”/>  
          <result property=”category” resultMap=“get-category-result” />  
          </resultMap>  
          <resultMap id=”get-category-result” class=”com.ibatis.example.Category”>  
          <result property=”id” column=”CAT_ID” />  
          <result property=”description” column=”CAT_DESCRIPTION” />  
          </resultMap>  
          <select id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>  
          select *  
          from PRODUCT, CATEGORY  
          where PRD_CAT_ID
          =CAT_ID  
          and PRD_ID = #value#  
          </select>
          可以使用內在的resultMap來解決此問題。
          同樣一對多如下:
          <sqlMap namespace="ProductCategory">  
          <resultMap id=”categoryResult” class=”com.ibatis.example.Category” groupBy=”id”>  
          <result property=”id” column=”CAT_ID”/>  
          <result property=”description” column=”CAT_DESCRIPTION”/>  
          <result property=”productList” resultMap=”ProductCategory.productResult”/>  
          </resultMap>  
          <resultMap id=”productResult” class=”com.ibatis.example.Product”>  
          <result property=”id” column=”PRD_ID”/>  
          <result property=”description” column=”PRD_DESCRIPTION”/>  
          </resultMap>  
          <select id=”getCategory” parameterClass=”int” resultMap=”categoryResult”>  
          select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION  
          from CATEGORY C left outer join PRODUCT P  
          on C.CAT_ID 
          = P.PRD_CAT_ID  
          where CAT_ID = #value#  
          </select>  
          </sqlMap>
          注意,需要使用增加groupBy屬性來分類
          如果想實現,延遲加載的情況:
          <sqlMapConfig> 
            
          <settings lazyLoadingEnabled="true"  
          在日志中顯示sql語句
          log4j.logger.com.ibatis=DEBUG 
          log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG 
          log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG 
          log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG 

          posted on 2010-10-08 20:15 常言笑 閱讀(1704) 評論(0)  編輯  收藏 所屬分類: 技術總結

          My Links

          Blog Stats

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 获嘉县| 宽城| 彭水| 静宁县| 通辽市| 台东县| 大理市| 洪雅县| 竹山县| 清镇市| 临潭县| 祁阳县| 丹寨县| 搜索| 平阴县| 大竹县| 天柱县| 三亚市| 葫芦岛市| 徐闻县| 宁明县| 谷城县| 柘城县| 南平市| 东台市| 桓仁| 璧山县| 三门县| 靖边县| 信宜市| 张家口市| 麻阳| 宜黄县| 白水县| 无棣县| 城固县| 满洲里市| 阳西县| 新绛县| 社旗县| 廉江市|