2017-04-01 30 views
1

我在我的項目中創建了一個數據庫連接類,以便在項目中的所有類中創建和共享數據庫實例。使用此代碼在java mysql數據庫連接類中實現一個使用preparedStatements的方法

void createConnection(){ 
    try{ 
     connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "root", ""); 
     System.out.println("Connected"); 
    }catch(Exception e) { 
     System.out.println("Connection Failed"); 
     System.out.println(e); 
    } 

} 

然後獲得

數據庫連接我創建使用準備的語句如下

public boolean execAction(String query){ 
    try { 
     pstatement = (PreparedStatement) connection.prepareStatement(query); 
     pstatement.execute(query); 
     System.out.println("Values inserted"); 
     return true; 
    } catch (SQLException ex) { 
     Logger.getLogger(databaseHandler.class.getName()).log(Level.SEVERE, null, ex); 
     System.out.println("Values insertion failed"); 
     return false; 
    } finally { 

    } 

我想找到一種方法來傳遞的PreparedStatement變量值插入值到數據庫的方法到這個方法。

+0

你的'execAction()'泛型方法接受任何值或目標爲一個表? – developer

+0

它是一種可以接受任何值的通用方法 –

回答

0

如果您正在尋找execAction(String query)來處理任何數據庫表,那麼你就需要編寫大量複雜的邏輯,以檢查其數據類型(即,一滴,整型,字符串,等等。),它是不是一個好想再次重新發明一些東西。它可以很好的和容易處理,如果你使用任何的ORM(對象關係映射)如Hibernate工具等

的ORM的概念是,你需要映射每個模型(實體)類的表在數據庫和框架將處理所有樣板代碼(即,添加preparedstatement,setString(),setInt()等)。

如果我通過整體項目共享 數據庫類實例,是否有辦法在另一個類中獲取連接對象?

它不是共享一個連接對象在整個應用程序,而return不同的連接對象,如下圖所示,同時,還要確保你需要關閉通過調用連接的close()一個很好的做法。

還有一點是,您可能需要設置連接池,否則最終會出現錯誤。

public class DBUtil { 

    public static Connection createConnection(){ 
    try{ 
     Connection connection = (Connection) DriverManager. 
       getConnection("jdbc:mysql://localhost:3306/testdb", 
        "root", ""); 
     System.out.println("Connected"); 
     return connection; 
    }catch(Exception e) { 
     System.out.println("Connection Failed"); 
     System.out.println(e); 
    } 
} 

    public static void closeConnection(Connection conn) { 
     conn.close(); 
    } 
} 
+0

如果通過整體項目共享數據庫類實例,是否有方法可以在另一個類中獲取連接對象? –

0

我想找到一種方法,通過PreparedStatement的變量值此方法。

通常,您可以將變量作爲參數傳遞給另一個方法,或者如果在類級別聲明變量,則可以訪問變量。

我不知道查詢及其提供參數的確切細節。請參閱解釋使用Prepared Statement的示例。

Example:見鏈接

private static void insertRecordIntoTable() throws SQLException { 

    Connection dbConnection = null; 
    PreparedStatement preparedStatement = null; 

    String insertTableSQL = "INSERT INTO DBUSER" 
      + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" 
      + "(?,?,?,?)"; 

    try { 
     dbConnection = getDBConnection(); 
     preparedStatement = dbConnection.prepareStatement(insertTableSQL); 

     preparedStatement.setInt(1, 11); 
     preparedStatement.setString(2, "mkyong"); 
     preparedStatement.setString(3, "system"); 
     preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 

     // execute insert SQL stetement 
     preparedStatement.executeUpdate(); 

     System.out.println("Record is inserted into DBUSER table!"); 

    } catch (SQLException e) { 

     System.out.println(e.getMessage()); 

    } finally { 

     if (preparedStatement != null) { 
      preparedStatement.close(); 
     } 

     if (dbConnection != null) { 
      dbConnection.close(); 
     } 

    } 

} 

有沒有辦法獲取連接對象另一個類,如果我通過整個項目共享一個數據庫類實例的詳細信息?

如果您想要在不同的類或項目級別之間共享連接,可以使用單例模式創建連接對象,這樣可以靈活地爲所有類創建一個連接。

0

我的建議是: 首先想想你需要什麼方法去做。它只需要採取單一的值,還是很多?參數是相同類型的嗎?

一旦你有了這些,決定什麼數據結構最能代表這一點。由於PreparedStatement通過索引來引用參數,如果您想要很多值,您可能需要某種列表。如果每個條目也需要一個類型,那麼您可能需要創建一個數據類來將該值和值保存在一個地方。

因爲這看起來像一個編程作業,我不會寫代碼的你,但會給我這樣的事情作爲一個起點:

public class DatabaseHandler { 
    public boolean execAction(String query, List<PreparedStatementArgument> arguments){ 
     // code here 
    } 
} 

class PreparedStatementArgument { 
    private final PreparedStatementArgumentType type; 
    private final Object value; 

    // Constructor, getters 
} 

enum PreparedStatementArgumentType { 
    INT, STRING; //etc 
} 

您也可以考慮使用多態的PreparedStatementArguments,這取決於你準備得到多少複雜。

如果這個不是一個編程任務,請注意,這樣的方法的問題是它不能驗證它給出的與SQL匹配的參數 - 這使得難以發現如果有一個不匹配,並且很可能會使您的應用程序在長期運行中更容易出錯。

相關問題