2010-07-02 8 views
14

का उपयोग करके एकाधिक पंक्तियों को सम्मिलित करना मैं अपने SQL पर चल रहे JdbcTemplate का उपयोग कर स्केलेबल तरीके से निम्न SQL निष्पादित कैसे कर सकता हूं। इस मामले में, स्केलेबल साधन:JdbcTemplate

  1. केवल एक SQL विवरण सर्वर
  2. यह पंक्तियों के किसी भी संख्या के लिए काम करता है पर निष्पादित किया जाता है।

यहाँ बयान है:

INSERT INTO myTable (foo, bar) VALUES ("asdf", "asdf"), ("qwer", "qwer") 

मान लें कि मैं foo और bar क्षेत्रों के साथ POJO के की एक सूची है। मुझे लगता है कि मैं सिर्फ सूची पर पुनरावृति सकता है और निष्पादित करें:

jdbcTemplate.update("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMap) 

लेकिन यह है कि पहली कसौटी की पूर्ति नहीं करता नहीं है।

मेरा मानना ​​है कि मैं भी अमल कर सकते हैं:

jdbcTemplate.batchUpdate("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMapArray) 

लेकिन मैं क्या बता सकता से, कि बस एक बार एसक्यूएल संकलन और इसे कई बार निष्पादित, पहली कसौटी फिर नाकाम रहने देगा।

अंतिम मानदंड, जो दोनों मानदंडों को पारित करने लगता है, केवल StringBuffer के साथ स्वयं SQL को बनाना होगा, लेकिन मैं इससे बचना चाहता हूं।

+0

हम सिर्फ JDBC का उपयोग कर भी ऐसा ही कर सकते हैं? ? –

+0

इसका जेडीबीसी टेम्पलेट, या यहां तक ​​कि जेडीबीसी के साथ कुछ लेना देना नहीं है। आप SQL, अवधि (या मानक SQL, वैसे भी) में ऐसा नहीं कर सकते हैं, इसलिए आप निश्चित रूप से JdbcTemplate में ऐसा नहीं कर सकते हैं। – skaffman

+0

@ स्काफमैन: मैंने अपने प्रश्न को यह कहने के लिए अद्यतन किया है कि मैं mySQL का उपयोग कर रहा हूं। हो सकता है कि यह एक MySQL-only सुविधा है, लेकिन यह http://dev.mysql.com/doc/refman/5.1/en/insert.html पर नीचे की एक चौथाई के बारे में वर्णित है: "INSERT कथन जो VALUES वाक्यविन्यास का उपयोग कर सकते हैं ऐसा करने के लिए, ऐसा करने के लिए, कॉलम मानों की कई सूचियों को शामिल करें, प्रत्येक कोष्ठक के भीतर संलग्न किया गया है और अल्पविराम से अलग किया गया है। उदाहरण: " –

उत्तर

4

मल्टीरोव आवेषण ("पंक्ति मान कन्स्ट्रक्टर" का उपयोग करके) वास्तव में SQL-92 मानक का हिस्सा हैं। http://en.wikipedia.org/wiki/Insert_(SQL)#Multirow_inserts देखें।

कुछ डेटाबेस इस वाक्यविन्यास का समर्थन नहीं करते हैं, लेकिन कई लोग करते हैं। मेरे अनुभव में डर्बी/क्लाउडस्केप, डीबी 2, पोस्टग्रेस्क्ल और नए हाइपरोनिक 2। * + रिलीज इस का समर्थन करते हैं।

प्रीपेरस्टेटमेंट के रूप में काम करने के बारे में आपकी चिंता समझ में आ रही है, लेकिन मैंने इसी तरह के मामलों को देखा है जहां वसंत जेडीबीसी स्वचालित रूप से कुछ प्रश्नों (जैसे कि (?)) के लिए वस्तुओं का संग्रह संभालती है, लेकिन मैं झुका नहीं सकता इस मामले के लिए।

मुझे कुछ संभवतः उपयोगी जानकारी मिली (इस पोस्ट के दूसरे लिंक को नहीं जोड़ा जा सकता) जो कुछ मदद की हो सकती है।

मैं आपको बता सकता हूं कि शायद आपकी दूसरी आवश्यकता (किसी भी तर्क के लिए काम करता है) के लिए संभवतः सबसे सख्त अर्थ में पूरा नहीं किया जा सकता है: मैंने जो भी डेटाबेस उपयोग किया है, वह क्वेरी लंबाई सीमाएं लागू करता है जो खेल में आते हैं ।

+0

वह यूआरएल जिसने एसओ को ऊपर पोस्ट करने की अनुमति नहीं दी थी: http://fusesource.com/docs/router/2.2/transactions/DataAccess-JDBC.html – Will

-4

आप जेडीबीसी, अवधि में ऐसा नहीं कर सकते हैं। MySQL में यह सिर्फ वाक्य रचनात्मक चीनी है, लेकिन कथन का प्रभाव कई INSERT कथन जारी करने जैसा ही होगा। तो आप बैचअपडेट का उपयोग कर सकते हैं और इसका एक ही प्रभाव होगा।

+1

गलत। MySQL की "विस्तारित डालने" (जैसा कि प्रश्न में प्रस्तुत किया गया है) बैच डालने से तेज़ है (जहां आप अग्रिम रूप से तैयार करते हैं लेकिन एक समय में एक पंक्ति डालते हैं)। यह MySQL में एक वाक्य रचनात्मक चीनी नहीं है। –

28

आप नीचे दिए गए बैचपेरेडस्टेटमेंटसेटर का उपयोग कर सकते हैं।

public void insertListOfPojos(final List<MyPojo> myPojoList) { 

    String sql = "INSERT INTO " 
     + "MY_TABLE " 
     + "(FIELD_1,FIELD_2,FIELD_3) " 
     + "VALUES " + "(?,?,?)"; 

    getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() { 

     @Override 
     public void setValues(PreparedStatement ps, int i) 
      throws SQLException { 

      MyPojo myPojo = myPojoList.get(i); 
      ps.setString(1, myPojo.getField1()); 
      ps.setString(2, myPojo.getField2()); 
      ps.setString(3, myPojo.getField3()); 

     } 

     @Override 
     public int getBatchSize() { 
      return myPojoList.size(); 
     } 
    }); 

} 
+0

मुझे "पैरामीटर इंडेक्स सीमा से बाहर (1> संख्या मिली है पैरामीटर, जो 0 है) "जब उपयोग कर रहे हैं: के बजाय नामांकित पैरामीटर? NamedParameterJdbcTemplate के साथ उपयोग करने के लिए कुछ अद्यतन? – luso

-1

आप jdbcInsert के साथ भी प्रयास कर सकते हैं।(यहां से की नकल की) executeBatch (sqlParamSourceArray)

// define parameters 
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate); 
jdbcInsert.withTableName("TABlE_NAME"); 
SqlParameterSource[] sqlParamSourceArray = new SqlParameterSource[apiConsumer 
     .getApiRoleIds().size()]; 
for (int i = 0; i < myCollection.size(); i++) 
    { 
    sqlParamSourceArray[i] = new MapSqlParameterSource().addValue("COL1"); 
     ...................... 
} 
// execute insert 
int[] keys = jdbcInsert.executeBatch(sqlParamSourceArray); 
+0

यह उत्तर झूठा है! 'jdbcInsert.executeBatch()' कुंजी वापस नहीं करता है। यह जेडीबीसी चालक द्वारा लौटाए गए पंक्तियों की संख्या की सरणी देता है। Javadocs देखें। https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/simple/SimpleJdbcInsert.html#executeBatch-org.springframework.jdbc.core.namedparam.SqlParameterSource – Stewart

0

ऐसा नहीं है कि batchUpdate() JdbcTemplate की विधि इस मामले में सहायक हो सकता है मेरे लिए लग रहा है:

//insert batch example 
public void insertBatch(final List<Customer> customers){ 

    String sql = "INSERT INTO CUSTOMER " + 
    "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 

    getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() { 

@Override 
public void setValues(PreparedStatement ps, int i) throws SQLException { 
    Customer customer = customers.get(i); 
    ps.setLong(1, customer.getCustId()); 
    ps.setString(2, customer.getName()); 
    ps.setInt(3, customer.getAge()); 
} 

@Override 
public int getBatchSize() { 
    return customers.size(); 
} 

    }); 
} 
संबंधित मुद्दे