2016-07-14 49 views
0

如何通過SQL查詢有效地從列中通過java有效獲取所有值,而無需在每次後續調用時連接到數據庫?檢索列中的所有值

我現在擁有的一切:

private List<String> retrieveSQLQuery(String sqlQuery) throws SQLException { 
    JDBC jdbc = new JDBC(); 
    ResultSet rs = jdbc.getResultsSet(sqlQuery); 
    List<String> values = new ArrayList<>(); 

    while (rs.next()) { 
     values.add(rs.getString("model")); 
    } 
    return values;   
} 

然而,其後每rs.next(),它連接到數據庫,創建了一個聲明,然後檢索值。

它看起來像這樣:

Connecting to database... Creating statement... Statement Created. Connecting to database... Creating statement... Statement Created. value1 Connecting to database... Creating statement... Statement Created. Connecting to database... Creating statement... Statement Created. value2 Connecting to database... Creating statement... Statement Created. Connecting to database... Creating statement... Statement Created. value3

有沒有更有效的方式來做到這一點?


編輯:

這裏是我的ResultSet方法:

public ResultSet getResultsSet(String QueryString) { 
     Connection conn = null; 
     Statement stmt = null; 
     ResultSet rs = null; 
     CachedRowSetImpl crs = null; 
     try { 
      // STEP 1: Register JDBC driver 
      Class.forName(jdbcDriver); 

      // STEP 2: Open a connection 
      logger.info("Connecting to database..."); 
      conn = DriverManager.getConnection(dbUrl, user, password); 

      // STEP 3: Execute a query. 
      logger.info("Creating statement..."); 
      stmt = conn.createStatement(); 
      String sql; 
      sql = QueryString; 
      rs = stmt.executeQuery(sql); 
      crs = new CachedRowSetImpl(); 
      crs.populate(rs); 

      logger.info("Statement Created."); 
      // STEP 5: Clean-up environment 
     } catch (ClassNotFoundException e) { 
      logger.error(e.getMessage()); 
     } catch (SQLException e) { 
      logger.error(e.getMessage()); 
     } finally { 
      try { 
       if (rs != null) { 
        rs.close(); 
       } 
      } catch (SQLException e) { 
       logger.error(e.getMessage()); 
      } 
      try { 
       if (stmt != null) { 
        stmt.close(); 
       } 
      } catch (SQLException e) { 
       logger.error(e.getMessage()); 
      } 
      try { 
       if (conn != null) { 
        conn.close(); 
       } 
      } catch (SQLException e) { 
       logger.error(e.getMessage()); 
      } 
     } // end try 

     return crs; 
    } 
+0

你應該創建一個簡單的,自包含的,可編譯示例http://sscce.org/。例如,我們不知道類型'JDBC'及其方法'getResultsSet()',因此很難知道什麼是錯誤的。從表中獲取特定列的常用方法是查詢選擇該列。 –

+0

@LewBloch現在就去編輯。 – Robben

+0

@LewBloch如果您需要更多信息,請讓我知道 – Robben

回答

3

的慣用辦法從DB在JDBC檢索數據是

  1. 獲取Connection
  2. 在0上創建一個
  3. 通過返回Resultset

這意味着,對於每個查詢,你應該只檢索Connection一次,並建立一個單一的Statement執行Statement

  • 迭代。請注意,每次檢索Connection時,不應將連接到數據庫;您應該從可用於JDBC的衆多connection pools之一中檢索它。另請注意,使用Class.forName(...)來初始化驅動程序is redundant for post-JDBC 4.0 drivers

    簡而言之,最好直接在JDBC API類上運行,而不是爲這些類推出自己的包裝器/緩存。另外,爲了防止資源泄漏,對象應該具有非常有限的範圍(意味着它們不應該在方法之間傳遞),因此應該具有非常有限的範圍(StatementResultSet)。通過使用try-with-resources statement而不是傳統的try-catch-finally結構,JDBC資源管理也是最好也是最安全的。

    保持上述記的retrieveSQLQuery()重寫(使用的,而不是您的自定義JDBC類只JDBC API類)可能看起來像下面這樣:

    public List<String> retrieveSQLQuery(String sqlQuery) throws SQLException { 
    
        List<String> values = new ArrayList<>(); 
    
        try (Connection conn = DriverManager.getConnection(dbUrl, user, password); 
          Statement statement = conn.createStatement(); 
          ResultSet rs = statement.executeQuery(sqlQuery)) { 
    
         while (rs.next()) { 
          // this assumes that the passed-in query string has 
          // a "model" column in the SELECT clause 
          values.add(rs.getString("model")); 
         } 
        } 
    
        return values;   
    } 
    
  • +0

    非常感謝! – Robben

    +0

    很高興幫助。如果您發現這個答案有用,您可以考慮將其標記爲已接受。 –

    +0

    嘿密歇根州,抱歉再次打擾你這個問題,但我有點困惑。創建一個自定義的JDBC類可以被其他需要連接到數據庫來檢索查詢的類使用嗎?或者,我應該只爲每個需要連接到數據庫的類重用現有的JDBC Api? – Robben

    相關問題