2016-09-29 46 views
0

我正在研究一個小小的Minecraft插件。我試圖用我的DatabaseManager類將數據插入到數據庫中,但由於某種原因,它不起作用。沒有錯誤消息,密碼和用戶名是正確的。此外,我試圖手動插入SQL代碼到數據庫中,它的工作原理,所以沒有SQL語法錯誤。對我來說,似乎這個聲明不是由於某種原因而被執行的,但我無法找到失敗。以下是我班的代碼。JDBC語句沒有執行(沒有錯誤)

import java.sql.*; 

public class DatabaseManager { 
    Connection conn = null; 
    Statement stmt = null ; 
    ResultSet result = null; 

    String user = "root" ; 
    String pass = ""; 

    public ResultSet executeQuery(String query) throws SQLException{ 
     try{ 
     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/metrocraft",user,pass); 
     stmt = conn.createStatement(); 
     result = stmt.executeQuery(query); 

     }catch (Exception ex){ 
      ex.printStackTrace(); 
     }finally{ 
     if(result != null) 
      result.close(); 
     if(stmt != null) 
      stmt.close(); 
     if(conn != null) 
      conn.close(); 
     } 
     return result ; 
    } 
    //Metrocraft relevant code 

    public void addZone(double p1X , double p1Y,double p2X,double p2Y) throws SQLException{ 
     String sql = "INSERT INTO `zones`(`p1X`, `p1Y`,`p2X`, `p2Y`) VALUES (" + p1X + ","+ p1Y+","+p2X+","+p2Y+"); "; 
     System.out.print(sql); 
     executeQuery(sql); 
    } 
} 
+0

您可能想查看[this](http://stackoverflow.com/a/3226433/1008671)。 – budwiser

+0

每次需要運行查詢時,您可能都想重新考慮打開和關閉數據庫連接。打開是非常昂貴的(耗時),並且會導致你的mod在需要查詢時很慢。相反,我建議在第一次需要查詢時(或者你的mod啓動時)打開你的連接,保持它打開,然後在你的mod關閉時關閉它。通過這種方式,您可以多次重新使用連接,並節省連續重新打開的成本。 – SnakeDoc

+0

是的,謝謝你生病考慮這個! – TBrauwers

回答

1

雖然SQL injection您正在冒着惡意攻擊的風險。切換到準備好的語句。 BTW,使用executeUpdate

PreparedStatement stmt = conn.prepareStatement(query); 
result = stmt.executeUpdate(); 
+2

我還會提到爲什麼你使用'PreparedStatement'來反對'stmt = conn.createStatement(); stmt.executeQuery(查詢);' – SnakeDoc

+0

其工作謝謝! – TBrauwers

0

您還沒有加載驅動程序中的建立數據庫之前使用以下命令

Class.forName("com.mysql.jdbc.Driver") 

必須更新connection.so加載驅動數據庫寫操作的請嘗試下面提到的catch塊

try { 

    Class.forName("com.mysql.jdbc.Driver"); 

    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/metrocraft",user,pass); 
    stmt = conn.createStatement(); 
    result = stmt.executeQuery(query); 

} catch (Exception ex) { 
    ex.printStackTrace(); 
} 
+2

只需注意 - 通過'Class.forName()'手動加載驅動程序不再需要JDBC 4.0及更高版本。因此,如果您最近下載了JDBC驅動程序,則不需要手動加載它。 – SnakeDoc

+0

感謝您的更新 – jeetendar