2011-12-05 14 views
6

सबसे पहले समस्या: मैं XML- परिभाषित क्वेरी का उपयोग कर रहा हूं और SQL में तालिका नाम के हिस्से के रूप में डेटाबेस नाम शामिल है। उदाहरण के लिए: SELECT * from mydb.bar। दुर्भाग्य से, डेटाबेस सभी जगहों पर बनाए/नामित होते हैं और mudb भाग वास्तव में गतिशील है और किसी भी समय बदल सकता है। तो मैं एक संपत्ति से बदलने के लिए तो यह SELECT * FROM ${dbname}.bar कैसा दिखेगा चाहता था और फिर मैं mybatis-config.xml में निम्न अनुभाग में परिभाषित किया गया:MyBatis - वैश्विक पैरामीटर को परिभाषित करना

<properties> 
    <property name="dbname" value="mydb"/> 
</properties> 

लेकिन जब मैं क्वेरी चलाने ${dbname} शून्य पर मूल्यांकन करता है। वही होता है यदि मैं गुण फ़ाइल में इस संपत्ति को परिभाषित करता हूं। मैं इसे प्रत्येक कॉल पैरामीटर के हिस्से के रूप में पास करने से नफरत करता हूं क्योंकि यह वास्तव में एक वैश्विक संपत्ति है। क्या यह किया जा सकता है? और यदि हां - कैसे?

उत्तर

4

हाँ, आप कर सकते हैं! यह शायद एक अजीब अनियंत्रित सुविधा है। अपनी कॉन्फ़िगरेशन ऑब्जेक्ट का निर्माण करते समय, ऐसा कुछ करें। (Org.apache.ibatis.session.Configuration)

configuration.getVariables().put("global_param", "123"); 
फिर अपने एक्सएमएल नक्शे में

, आप संदर्भित कर सकते हैं।

select * from ${global_param} 
+1

धन्यवाद! दुर्भाग्य से मैं वसंत से अमूर्त MyBatis का उपयोग कर रहा हूं और मेरी सभी कॉन्फ़िगरेशन applicationContext.xml में परिभाषित हैं। मुझे आश्चर्य है कि अगर इन चरों का खुलासा किया गया है और इसे एप्लीकेशन कॉन्टेक्स्ट.एक्सएमएल में एक्सएमएल कॉन्फ़िगरेशन के माध्यम से सेट किया जा सकता है, तो यह – Bostone

+0

में देखने जा रहा है ऐसा लगता है कि इसे काम करना चाहिए। मैंने SqlSessionFactoryBean के लिए स्रोत कोड देखा, ऐसा प्रतीत होता है कि वे गुणों को चर सेट करते हैं। मैंने वसंत एकीकरण के साथ काम नहीं किया है, लेकिन मैं यह देखने के लिए कि यह गुण कहां लोड कर रहा है, एसक्लूसशन फैक्ट्रीबीन में buildSqlSessionFactory विधि को डीबग करने का प्रयास करूंगा। – Andy

+0

गुणों को 'SqlSessionFactoryBean.setConfigurationProperties()' को पास किया गया है MyBatis कॉन्फ़िगरेशन में चर के रूप में सेट करें। आप स्प्रिंग एक्सएमएल में एक प्रॉपर्टी बनाने में सक्षम होना चाहिए और फैक्ट्री बीन को कॉन्फ़िगर करते समय इसका इस्तेमाल करना चाहिए। – AngerClown

3

मैं एक ही मुद्दा स्प्रिंग + MyBatis का उपयोग कर किया था, और 'configurationProperties' का उपयोग कर sqlSessionFactory के लिए मेरे स्प्रिंग XML परिभाषा निर्धारित करके इसे हल। नीचे दिया गया मेरा उदाहरण दिखाता है कि 'एन्क्रिप्शनकी' नामक एक कस्टम वैश्विक संपत्ति कैसे सेट करें, जिसमें आप XML फ़ाइल में हार्ड-कोड या संदर्भ का उपयोग कर बाहरी फ़ाइल से लोड कर सकते हैं: संपत्ति-प्लेसहोल्डर टैग (नीचे के रूप में)।

<context:property-placeholder location="/WEB-INF/spring/config-datasource.properties" /> 

<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="typeAliasesPackage" value="com.example.model" /> 
    <beans:property name="configurationProperties"> 
     <beans:props> 
      <beans:prop key="encryptionKey">${jdbc.encryptionKey}</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 
0

मैं एक XML विन्यास का उपयोग कर रहा था लेकिन वसंत और विन्यास वस्तु के अंदर एक गुण सेट लेकिन (here देखें) को पता चला कि इससे पहले कि नक्शाकार फ़ाइलें लोड किए गए हैं किया जाना नहीं। मैं विन्यास वस्तु दृष्टिकोण को त्याग दिया और इस दृष्टिकोण है, जो मेरे लिए काम किया साथ चला गया:

Reader reader = Resources.getResourceAsReader("..../mybatis-config.xml"); 
    Properties properties = new Properties(); 
    properties.setProperty("dbname", "mydb"); 
    SqlSessionFactory.factory = new SqlSessionFactoryBuilder().build(reader, "development", properties); 

फिर, के रूप में एंडी प्रायर तैनात, एक्सएमएल नक्शाकार में select * from ${dbname} का उपयोग करें।

संबंधित मुद्दे