2012-10-14 182 views
1

我有一個java項目連接到數據庫的許多文件。任何人都可以告訴我,如果有可能使用Java類文件連接到數據庫,以便我不會爲每個文件創建一個數據庫連接,請教我如何..謝謝你的幫助:D 這是代碼I使用,但它沒有工作Java數據庫連接

dbConnect.java - 類文件

public class dbConnect { 

     public static void connect(){ 
     Connection conn; 
     Statement stmt; 
     ResultSet rs; 

     String sql; 
      conn = null; 
      String url = "jdbc:mysql://localhost:3306/db_oopproject"; 
      String driver = "com.mysql.jdbc.Driver"; 
      try{ 
       Class.forName(driver).newInstance(); 
       conn = DriverManager.getConnection(url,"user","12345"); 

       stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 
       sql = "Select * from user_account"; 
       rs = stmt.executeQuery(sql); 

      } 
      catch (Exception e){ 
       System.out.print(e.getMessage()); 
      } 
     } 


    } 

我叫這個類中使用這個dbConnect.connect()主文件; 代碼有什麼問題嗎?

回答

3

把數據庫連接代碼在一個單獨的類並在任何你喜歡的地方使用它。

像這樣的東西可能是一個良好的開端:

package persistence; 

import java.sql.*; 
import java.util.*; 

/** 
* util.DatabaseUtils 
* User: Michael 
* Date: Aug 17, 2010 
* Time: 7:58:02 PM 
*/ 
public class DatabaseUtils { 
    private static final String DEFAULT_DRIVER = "oracle.jdbc.driver.OracleDriver"; 
    private static final String DEFAULT_URL = "jdbc:oracle:thin:@host:1521:database"; 
    private static final String DEFAULT_USERNAME = "username"; 
    private static final String DEFAULT_PASSWORD = "password"; 
/* 
    private static final String DEFAULT_DRIVER = "org.postgresql.Driver"; 
    private static final String DEFAULT_URL = "jdbc:postgresql://localhost:5432/party"; 
    private static final String DEFAULT_USERNAME = "pgsuper"; 
    private static final String DEFAULT_PASSWORD = "pgsuper"; 
*/ 
/* 
    private static final String DEFAULT_DRIVER = "com.mysql.jdbc.Driver"; 
    private static final String DEFAULT_URL = "jdbc:mysql://localhost:3306/party"; 
    private static final String DEFAULT_USERNAME = "party"; 
    private static final String DEFAULT_PASSWORD = "party"; 
*/ 

    public static void main(String[] args) { 
     long begTime = System.currentTimeMillis(); 

     String driver = ((args.length > 0) ? args[0] : DEFAULT_DRIVER); 
     String url = ((args.length > 1) ? args[1] : DEFAULT_URL); 
     String username = ((args.length > 2) ? args[2] : DEFAULT_USERNAME); 
     String password = ((args.length > 3) ? args[3] : DEFAULT_PASSWORD); 

     Connection connection = null; 
     // No, I loaded the driver as I intended. It's correct. The edit is not. 
     try { 
      connection = createConnection(driver, url, username, password); 
      DatabaseMetaData meta = connection.getMetaData(); 
      System.out.println(meta.getDatabaseProductName()); 
      System.out.println(meta.getDatabaseProductVersion()); 

      String sqlQuery = "SELECT PERSON_ID, FIRST_NAME, LAST_NAME FROM PERSON ORDER BY LAST_NAME"; 
      System.out.println("before insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); 

      connection.setAutoCommit(false); 
      String sqlUpdate = "INSERT INTO PERSON(FIRST_NAME, LAST_NAME) VALUES(?,?)"; 
      List parameters = Arrays.asList("Foo", "Bar"); 
      int numRowsUpdated = update(connection, sqlUpdate, parameters); 
      connection.commit(); 

      System.out.println("# rows inserted: " + numRowsUpdated); 
      System.out.println("after insert: " + query(connection, sqlQuery, Collections.EMPTY_LIST)); 
     } catch (Exception e) { 
      rollback(connection); 
      e.printStackTrace(); 
     } finally { 
      close(connection); 
      long endTime = System.currentTimeMillis(); 
      System.out.println("wall time: " + (endTime - begTime) + " ms"); 
     } 
    } 

    public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException { 
     Class.forName(driver); 
     if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0)) { 
      return DriverManager.getConnection(url); 
     } else { 
      return DriverManager.getConnection(url, username, password); 
     } 
    } 

    public static void close(Connection connection) { 
     try { 
      if (connection != null) { 
       connection.close(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 


    public static void close(Statement st) { 
     try { 
      if (st != null) { 
       st.close(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void close(ResultSet rs) { 
     try { 
      if (rs != null) { 
       rs.close(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void rollback(Connection connection) { 
     try { 
      if (connection != null) { 
       connection.rollback(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static List<Map<String, Object>> map(ResultSet rs) throws SQLException { 
     List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(); 
     try { 
      if (rs != null) { 
       ResultSetMetaData meta = rs.getMetaData(); 
       int numColumns = meta.getColumnCount(); 
       while (rs.next()) { 
        Map<String, Object> row = new HashMap<String, Object>(); 
        for (int i = 1; i <= numColumns; ++i) { 
         String name = meta.getColumnName(i); 
         Object value = rs.getObject(i); 
         row.put(name, value); 
        } 
        results.add(row); 
       } 
      } 
     } finally { 
      close(rs); 
     } 
     return results; 
    } 

    public static List<Map<String, Object>> query(Connection connection, String sql, List<Object> parameters) throws SQLException { 
     List<Map<String, Object>> results = null; 
     PreparedStatement ps = null; 
     ResultSet rs = null; 
     try { 
      ps = connection.prepareStatement(sql); 

      int i = 0; 
      for (Object parameter : parameters) { 
       ps.setObject(++i, parameter); 
      } 
      rs = ps.executeQuery(); 
      results = map(rs); 
     } finally { 
      close(rs); 
      close(ps); 
     } 
     return results; 
    } 

    public static int update(Connection connection, String sql, List<Object> parameters) throws SQLException { 
     int numRowsUpdated = 0; 
     PreparedStatement ps = null; 
     try { 
      ps = connection.prepareStatement(sql); 

      int i = 0; 
      for (Object parameter : parameters) { 
       ps.setObject(++i, parameter); 
      } 
      numRowsUpdated = ps.executeUpdate(); 
     } finally { 
      close(ps); 
     } 
     return numRowsUpdated; 
    } 
} 
+0

對不起,該建議的修改,以我張貼3.5年以前的代碼是錯誤的。我已將其刪除。所寫的代碼是正確的。我不會接受它。我很抱歉,但祖拜爾不知道他在做什麼。如果你閱讀代碼,我確實創建了連接。 – duffymo

+0

您的評論對我很有價值。但代碼沒有爲我工作沒有我發佈的編輯:) – Zubair

+0

對不起,該代碼工作正常。我用過很多次。你做錯了什麼。 – duffymo

1

你必須做出簡單的Java類文件,用於連接到數據庫,並調用該類的對象需要時..

0

你可以這樣做:

class DBConnector{ 
static Connection c; 
public static Connection getConnection(){ 

    try{ 
    Class.forName("your fully qualified driver class name"); 
    c = DriverManager.getConnection("connection url"); 
    return c; 
    }catch(Exception e){ 
    return null; 
    } 

} 
} 

調用此方法時,你需要一個新的數據庫連接

0

當創建對象的成本高於使用對象時,數據庫連接池非常有用。數據庫連接通常是這種情況,因爲數據庫和服務器需要協商連接並處理身份驗證等。還需要在服務器端和數據庫端完成分配發送必要結構的工作數據。如果您使用的是SSL,那麼創建連接的另一個因素就會變慢。

如果您打算需要打開然後關閉很多連接,那麼您可能需要使用一個池。當然,如果不知道應用程序的具體細節,很難說。

我寫了一篇關於該主題的文章,詳細介紹了這方面的內容。閱讀完之後,你應該有足夠的理解來知道這對你是否合理。

你可以在這裏閱讀:

http://innolitics.com/10x/database-pools/