2011-05-20 21 views
18

मैं अपनी कई SQL मानचित्र XML फ़ाइलों द्वारा एक अलग फ़ाइल में उपयोग किए गए एसक्यूएल टुकड़े रखना चाहता हूं। फिलहाल, <sql> इन टुकड़ों के साथ तत्व मैपर में से एक में <select> जैसे अन्य तत्वों के साथ हैं, जो उन्हें ढूंढना मुश्किल बनाता है।
क्या मेरे पास एक नक्शा है जो कुछ <sql> तत्वों को परिभाषित करता है और इंटरफ़ेस में कार्यान्वयन उत्पन्न करने के लिए उपयोग नहीं किया जाता है? इस मैपर का सही नामस्थान क्या होगा?
पहले Sql मानचित्र फ़ाइल:MyBatis/iBatis - एक अलग SQL मानचित्र फ़ाइल में पुन: प्रयोज्य एसक्यूएल टुकड़े?

<mapper namespace="com.company.project.dao.???"> 

    <sql id="whereDate"> 
     WHERE date(`time`) BETWEEN #{startDate} AND #{endDate} 
    </sql> 

    <sql id="someOtherSqlFragment"> 
     ... 
    </sql> 

</mapper> 

दूसरा Sql मानचित्र फ़ाइल

<mapper namespace="com.company.project.dao.someDao"> 

    <sql id="whereDate"> 
     WHERE date(`time`) BETWEEN #{startDate} AND #{endDate} 
    </sql> 

    <sql id="someOtherSqlFragment"> 
     ... 
    </sql> 

    <select id="getSomeData" 
      resultType="SomeClass" 
      parameterType="DateParam" > 
     SELECT some_column, another_column 
    </select> 

     FROM some_table 

     <include refid="whereDate"/> 

     <include refid="otherSqlFragment"/> 

    </select> 

</mapper> 

मैं इस तरह के तत्वों को अलग करना चाहते हैं:

यह framents साथ एसक्यूएल मानचित्र फ़ाइल है :

<mapper namespace="com.company.project.dao.someDao"> 

    <select id="getSomeData" 
      resultType="SomeClass" 
      parameterType="DateParam" > 
     SELECT some_column, another_column 
    </select> 

     FROM some_table 

     <include refid="whereDate"/> 

     <include refid="otherSqlFragment"/> 

    </select> 

</mapper> 

उत्तर

25

यह वही है जो मैंने काम करने के लिए किया था। सामान्य टुकड़े एक अलग फ़ाइल में परिभाषित किए गए थे जो मुख्य iBATIS कॉन्फ़िगरेशन फ़ाइल में शामिल था। हम इसे इस तरह का संदर्भ सकता है हमारे एसक्यूएल नक्शा फाइलों में

<sqlMap namespace="Core" > 

    <sql id="fragmentBasicAuditFieldNames"> 
     CreateDate, CreateUser, 
     UpdateDate, UpdateUser, UpdateCode 
    </sql> 

    .... 

और फिर:

<include refid="Core.fragmentBasicAuditFieldNames" /> 

मुझे आशा है कि

हम जो इस तरह देखा Core.ism.xml नामित रूट पर एक एसक्यूएल मानचित्र फ़ाइल था मैं समझ गया हूँ कि आप सही तरीके से क्या पूछ रहे थे!

+0

धन्यवाद हो सकता है! मैंने यह भी देखा कि मै मैपैटिस-स्प्रिंग से मैपरफैक्टरीबीन क्लास का उपयोग अन्य एसक्यूएल मैप फाइलों को "लोड" करने के लिए कर रहा हूं। सामान्य टुकड़ों वाली फ़ाइल कहीं भी "लोड नहीं" थी, इसलिए मुझे इसे मैन्युअल रूप से mybatis कॉन्फ़िगरेशन फ़ाइल में जोड़ना पड़ा। – prasopes

+1

यदि कोर मैपर फ़ाइल आपकी mybatis कॉन्फ़िगरेशन फ़ाइल में एकमात्र चीज है, तो सामान्य मैपर फ़ाइल लोड करने के लिए SqlSessionFactoryBean में 'मैपर लेक्शंस' प्रॉपर्टी का उपयोग करने के लिए और अधिक समझ हो सकती है। – AngerClown

+2

यदि आप MyBatis का उपयोग कर रहे हैं, तो "मैपर" के साथ "sqlMap" को प्रतिस्थापित करें। http://code.google.com/p/mybatis/wiki/DocUpgrade3 देखें। मैंने स्पष्ट रूप से उपर्युक्त समाधान का पालन किया और अन्य मुद्दों में भाग गया। तब मुझे एहसास हुआ कि मैं MyBatis का उपयोग कर रहा हूं और sqlMap के बजाय मैपर का उपयोग करना है। – Srikanth

1

कहो, यदि आप किसी अन्य नक्शाकार में से कुछ

<mapper namespace="Common"> 
    <sql id="idsIn"> 
     ${column} IN 
     <foreach item="id" collection="ids" separator="," open="(" close=")"> 
      #{id} 
     </foreach> 
    </sql> 
</mapper> 

आप इसे पसंद उपयोग कर सकते हैं:

<mapper namespace="OtherMapper"> 
    <sql id="someSql"> 
     ... 
     <include refid="Common.idsIn"> 
      <property name="column" value="${column}"/> 
      <!-- OR hardcode: <property name="column" value="id"/> --> 
      <property name="filterPksTable" value="${filterPksTable}"/> 
     </include> 
     ... 
    </sql> 
</mapper> 

इसके अलावा, आप एक बार देख here