2012-11-12 20 views
8

स्प्रिंग जेडीबीसी में डेटाबेस विधियां एक एकल पैरामीटर स्रोत स्वीकार करती हैं। उदाहरण के लिए -स्प्रिंग जेडीबीसी में एकाधिक पैरामीटर स्रोतों को कैसे गठबंधन करें?

int org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(String sql, SqlParameterSource paramSource) throws DataAccessException 

क्या एकाधिक पैरामीटर स्रोतों को एक साथ जोड़ना संभव है?

class Order { 
int id; 
float price; 
int customerId; 
Date date; 
//Lots of other fields 
} 

मैं recordModificationTime और accessLevel जैसे कुछ अतिरिक्त फ़ील्ड के साथ इस सेम सहेजना चाहते - उदाहरण के लिए, मैं एक सेम Order है लगता है।

यदि मैं बीन के बाहर मौजूद इन अतिरिक्त क्षेत्रों के लिए MapSqlParameterSource का उपयोग करता हूं, तो मैं BeanPropertySqlParameterSource का उपयोग नहीं कर सकता क्योंकि विधि केवल एक पैरामीटर स्रोत स्वीकार करती है। मेरे सभी डेटा के लिए MapSqlParameterSource का उपयोग करने का अर्थ है मुझे सभी बीन गुणों को मैन्युअल रूप से निकालना है, जो बहुत अधिक काम है।

इस समस्या से निपटने का सबसे अच्छा तरीका क्या है?

उत्तर

12

आप AbstractSqlParameterSource विस्तार कर सकते हैं और दोनों BeanProperty और मानचित्र संस्करणों कुल:

public class CombinedSqlParameterSource extends AbstractSqlParameterSource { 
    private MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource(); 
    private BeanPropertySqlParameterSource beanPropertySqlParameterSource; 

    public CombinedSqlParameterSource(Object object) { 
    this.beanPropertySqlParameterSource = new BeanPropertySqlParameterSource(object); 
    } 

    public void addValue(String paramName, Object value) { 
    mapSqlParameterSource.addValue(paramName, value); 
    } 

    @Override 
    public boolean hasValue(String paramName) { 
    return beanPropertySqlParameterSource.hasValue(paramName) || mapSqlParameterSource.hasValue(paramName); 
    } 

    @Override 
    public Object getValue(String paramName) { 
    return beanPropertySqlParameterSource.hasValue(paramName) ? beanPropertySqlParameterSource.getValue(paramName) : mapSqlParameterSource.getValue(paramName); 
    } 

    @Override 
    public int getSqlType(String paramName) { 
    return beanPropertySqlParameterSource.hasValue(paramName) ? beanPropertySqlParameterSource.getSqlType(paramName) : mapSqlParameterSource.getSqlType(paramName); 
    } 
} 

और अब इस तरह इसका इस्तेमाल:

CombinedSqlParameterSource mySource = new CombinedSqlParameterSource(myOrder); 
mySource.addValue("recordModificationTime", time); 
mySource.addValue("accessLevel", level); 

jdbcTemplate.update(sql, mySource); 
+0

धन्यवाद @dei, getValue पर बदल वापसी प्रकार। – mrembisz

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