2012-11-13 22 views
9

मैं स्प्रिंग्स jdbctemplate उपयोग कर रहा हूँ और नीचे की तरह एक क्वेरी चलाने में एक सूची के लिए क्वेरी करने के लिए: कैसे jdbctemplate

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

पारित कर दिया है, तथापि, स्तंभ नाम, COLNAME जा रहा है कोई नाम वाले पैरामीटर रहे हैं, होगा उपयोगकर्ता द्वारा पारित किया जाना चाहिए।

प्रश्न

  1. वहाँ, प्लेसहोल्डर के लिए स्तंभ नाम के लिए ? की तरह एक तरीका है? उदाहरण के लिए SELECT ? FROM TABLEA GROUP BY ?

  2. यदि मैं केवल उपरोक्त क्वेरी को चलाने के लिए और List<String> प्राप्त करना चाहता हूं तो सबसे अच्छा तरीका क्या है?

वर्तमान में मैं कर रहा हूँ:

List <Map<String, Object>> data = getJdbcTemplate().queryForList(query); 
for (Map m : data) 
    System.out.println(m.get("COLNAME")); 

उत्तर

7

वहाँ प्लेसहोल्डर के लिए एक रास्ता है, की तरह? कॉलम नामों के लिए? उदाहरण के लिए चयन करें? टेबल ग्रुप से?

उपयोग गतिशील के रूप में नीचे क्वेरी:

String queryString = "SELECT "+ colName+ " FROM TABLEA GROUP BY "+ colName; 

मैं बस एक सूची क्या सबसे अच्छा तरीका है इसके बाद के संस्करण क्वेरी चलाने के लिए और प्राप्त करना चाहते हैं?

List<String> data = getJdbcTemplate().query(query, new RowMapper<String>(){ 
          public String mapRow(ResultSet rs, int rowNum) 
                 throws SQLException { 
            return rs.getString(1); 
          } 
         }); 

संपादित करें: SQL इंजेक्शन बंद करो करने के लिए, के रूप में colName में गैर शब्द अक्षरों के लिए जाँच:

  Pattern pattern = Pattern.compile("\\W"); 
      if(pattern.matcher(str).find()){ 
       //throw exception as invalid column name 
      } 
+1

गतिशील क्वेरी मैं डाल दिया जाएगा जो उपयोगकर्ता मेरी गतिशील क्वेरी जो एक डरावना हिस्सा है में प्रवेश करता है का उपयोग कर में। – birdy

+0

@birdy: आप एक सरल regex '\\ w' का उपयोग करके स्ट्रिंग को केवल 'शब्द वर्ण' की जांच कर सकते हैं। इससे किसी भी एसक्यूएल इंजेक्शन की संभावना को रोका जा सकेगा। –

+4

आपको इस रेगेक्स सामान को करने के बजाय तैयार कथन का उपयोग करना चाहिए। इसे आज़माएं: '' jdbcTemplate() क्वेरी ("चुनें? टैबलेट ग्रुप बाय से?", नया रोमैपर () { सार्वजनिक स्ट्रिंग मैपरो (परिणामसेट आरएस, int rowNum) एसक्यूलेक्सप्शन { रिटर्न आरएस फेंकता है।GetString (1); } }, कॉलनाम, कॉलनाम); '' ' – Jean

1

आप स्तंभ नाम, टेबल नाम, डेटा प्रकार नाम के लिए प्लेसहोल्डर उपयोग नहीं कर सकते, या मूल रूप से कुछ भी जो डेटा नहीं है।

6

उपयोग निम्न कोड

List data = getJdbcTemplate().queryForList(query,String.class)

18

स्ट्रिंग की एक सूची को पॉप्युलेट करने के लिए, आप कस्टम पंक्ति नक्शाकार का उपयोग नहीं है। इसे queryForList का उपयोग करके कार्यान्वित करें।

List<String>data=jdbcTemplate.queryForList(query,String.class) 
3

BeanPropertyRowMapper मेरे लिए महान काम करता है:

public List<String> getListOfStrings(){ 
     return jdbcTemplate.query("SELECT * FROM strings", new BeanPropertyRowMapper(String.class)); 
    }