閑人野居
          好好學(xué)習(xí),天天向上
          posts - 57,  comments - 137,  trackbacks - 0
          ??? 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è)缺陷,看了半天文檔,也沒(méi)有找到對(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)分類

          posted on 2007-01-16 16:22 布衣郎 閱讀(5498) 評(píng)論(8)  編輯  收藏 所屬分類: orm

          FeedBack:
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-01-17 09:49 | 實(shí)用主義
          ibatis 最主要的作用是什么,LZ還不知道呀,不要白讀書呀  回復(fù)  更多評(píng)論
            
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-01-17 10:41 | 布衣郎
          @實(shí)用主義
          既然是半成品的orm,當(dāng)然不能完全只是依賴于sql和存儲(chǔ)過(guò)程,那還不如直接去用jdbc了。  回復(fù)  更多評(píng)論
            
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-05-22 10:28 | murphy
          你好,我在做ibatis時(shí)使用你所提到的方法,但是出現(xiàn)了問(wèn)題,提示是無(wú)法找到類似你提到的1:1關(guān)系中的get-category-result,不知道是什么原因呢?

          附:
          --- The error happened while setting a property on the result object.
          --- Cause: com.ibatis.sqlmap.client.SqlMapException: There is no result map named getPartByID in this SqlMap.
            回復(fù)  更多評(píng)論
            
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-05-22 15:35 | 布衣郎
          @murphy
          你沒(méi)有定義getPartByID這個(gè)SqlMap,仔細(xì)看看你的配置文件  回復(fù)  更多評(píng)論
            
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-05-23 10:12 | murphy
          你好,已經(jīng)配置了,就是因?yàn)榕渲昧诉€不行啊.
          附:
          <resultMap id="getPartByID" class="com.****.domain.Part">
          <result property="part_ID" column="part_ID"/>
          <result property="part_Code" column="part_Code"/>
          <result property="part_Name" column="part_Name"/>
          </resultMap>

          ---------------------------------------------------------------
          <resultMap id="pdpList" class="pdp">
          <result property="pdp_ID" column="pdp_ID"/>
          <result property="pdp_Code" column="pdp_Code"/>
          <result property="pdp_Charge" column="pdp_Charge"/>
          <result property="part" resultMap="getPartByID"/>
          .............................
          </resultMap>   回復(fù)  更多評(píng)論
            
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-05-23 14:49 | 布衣郎
          你的Part中的屬性也是part_ID,part_Code,而不是字段名稱嗎?  回復(fù)  更多評(píng)論
            
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-05-25 11:33 | murphy
          Part中屬性和數(shù)據(jù)庫(kù)中的字段是基本對(duì)應(yīng)的,這和找不到Map有什么直接關(guān)系嗎?  回復(fù)  更多評(píng)論
            
          # re: ibatis 對(duì)象關(guān)系實(shí)現(xiàn)
          2007-05-25 15:40 | 布衣郎
          有可能,主要的問(wèn)題在于part_ID這個(gè)命名,以前beanutils對(duì)于兩個(gè)連寫的大寫字符有個(gè)小bug,解析不了。要不換換看看。  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(12)

          隨筆分類(59)

          隨筆檔案(57)

          blog

          java

          uml

          搜索

          •  

          積分與排名

          • 積分 - 357736
          • 排名 - 155

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 贵德县| 寿阳县| 固始县| 盖州市| 治多县| 洛阳市| 神木县| 垣曲县| 丰县| 鄄城县| 习水县| 银川市| 昌平区| 宁城县| 洪江市| 龙陵县| 平果县| 濮阳县| 得荣县| 红安县| 霍山县| 昌图县| 道真| 丰都县| 金门县| 西吉县| 望奎县| 合阳县| 南靖县| 体育| 中方县| 乳源| 大庆市| 丹巴县| 锡林浩特市| 佳木斯市| 莱西市| 淅川县| 桃江县| 钟祥市| 澄城县|