<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 對(duì)象關(guān)系實(shí)現(xiàn)

    hibernate 的強(qiáng)大在于完全的對(duì)象化,對(duì)于對(duì)象之間的關(guān)系解決的比較好,如1對(duì)1,1對(duì)多,多對(duì)1,以及多對(duì)多。當(dāng)然也包括繼承關(guān)系。
        而ibatis這方面就比較遜色了,不過(guò)對(duì)于也支持簡(jiǎn)單的關(guān)連查詢,如1對(duì)1,和1對(duì)多。對(duì)于一般的情況來(lái)說(shuō),這兩種已經(jīng)足夠了,當(dāng)然不能層疊更新是一個(gè)缺陷,看了半天文檔,也沒有找到對(duì)象之間的層疊更新,估計(jì)是不支持。
        以前的版本ibatis處理關(guān)連是通過(guò)執(zhí)行兩次sql來(lái)實(shí)現(xiàn)的,如下的實(shí)例:
        一對(duì)多關(guān)聯(lián):
    <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>
    這里通過(guò)在resultMap 中定義嵌套查詢getAddressByUserId,我們實(shí)現(xiàn)了關(guān)聯(lián)數(shù)據(jù)的讀取。
    需要注意的是,這里有一個(gè)潛在的性能問(wèn)題,也就是所謂“n+1”Select問(wèn)題。
    一對(duì)一關(guān)聯(lián):
    對(duì)于這種情況,我們可以采用一次Select兩張表的方式,避免這樣的性能開銷(假設(shè)上面示例中,每個(gè)User 只有一個(gè)對(duì)應(yīng)的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>  
    在現(xiàn)在的版本中,對(duì)于n+1問(wèn)題,ibatis已經(jīng)很好的解決了。如下的配置:
    一對(duì)一
    <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>
    可以使用內(nèi)在的resultMap來(lái)解決此問(wèn)題。
    同樣一對(duì)多如下:
    <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屬性來(lái)分類
    如果想實(shí)現(xiàn),延遲加載的情況:
    <sqlMapConfig> 
      
    <settings lazyLoadingEnabled="true"  
    在日志中顯示sql語(yǔ)句
    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) 評(píng)論(0)  編輯  收藏 所屬分類: 技術(shù)總結(jié)

    My Links

    Blog Stats

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲性色精品一区二区在线| 美女18毛片免费视频| 国产卡一卡二卡三免费入口| 精品国产成人亚洲午夜福利| 免费人成网站在线播放| 国产自国产自愉自愉免费24区 | 亚洲日本va中文字幕久久| 无码人妻精品中文字幕免费| 亚洲日韩精品无码专区加勒比☆| 久久久久亚洲精品无码网址 | 免费一级做a爰片久久毛片潮喷| 国产vA免费精品高清在线观看| 伊人久久综在合线亚洲2019| 在线视频免费观看www动漫| 91福利免费网站在线观看| 亚洲国产最大av| 中文字幕亚洲一区二区三区| 99久久久国产精品免费无卡顿 | 亚洲国产成人精品青青草原| 亚洲无码日韩精品第一页| 五月婷婷在线免费观看| 一级特级女人18毛片免费视频| 亚洲成人网在线观看| 亚洲伦乱亚洲h视频| 亚洲天堂免费在线| 久久久精品国产亚洲成人满18免费网站| 亚洲日产2021三区| 中文字幕无码精品亚洲资源网| 男人的好免费观看在线视频| 久久免费精品一区二区| 国产亚洲视频在线观看网址| 亚洲美女在线观看播放| 亚洲精品无码久久不卡| 天天摸天天碰成人免费视频| 99热在线免费播放| 国产在线精品一区免费香蕉| 国产亚洲日韩在线a不卡| 亚洲a级片在线观看| 亚洲欧洲免费视频| 精品国产_亚洲人成在线高清| 国产免费131美女视频|