<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    常言笑的家

    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 常言笑 閱讀(1701) 評論(0)  編輯  收藏 所屬分類: 技術總結

    My Links

    Blog Stats

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲特级aaaaaa毛片| 亚洲高清在线视频| 国产成人精品日本亚洲专| 日本在线免费观看| 亚洲精品无码国产| 中文字幕在线免费视频| 国产亚洲精品高清在线| 国产成人无码精品久久久久免费| 免费看国产曰批40分钟| 免费精品视频在线| 亚洲午夜无码片在线观看影院猛| 一级**爱片免费视频| 国产a v无码专区亚洲av| 曰韩无码AV片免费播放不卡| 精品亚洲一区二区三区在线观看| 成年免费a级毛片| 亚洲午夜无码久久久久| 免费无码av片在线观看| 中文字幕亚洲免费无线观看日本| 最近最好最新2019中文字幕免费| 亚洲校园春色小说| 免费av欧美国产在钱| 老司机午夜在线视频免费观| 亚洲人成中文字幕在线观看| 久久综合给合久久国产免费| 亚洲av成人综合网| 国产成人免费a在线视频色戒| 青青草国产免费国产是公开| 亚洲av无码国产精品色午夜字幕| 在线精品一卡乱码免费| 日本系列1页亚洲系列| 亚洲毛片αv无线播放一区| 6080午夜一级毛片免费看| 亚洲AV女人18毛片水真多| 国产亚洲精品拍拍拍拍拍| 97精品免费视频| 欧美亚洲国产SUV| 久久伊人久久亚洲综合| 四虎免费在线观看| 在线毛片片免费观看| 亚洲中文无码永久免|