2016-09-29 9 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

[こちら](http://stackoverflow.com/a/3226433/1008671)をチェックしてみてください。 – budwiser

+0

クエリを実行する必要があるたびに、データベース接続の開始と終了を再検討することができます。オープニングは非常に高価で(時間がかかる)、クエリーが必要なときはいつでもmodが遅くなります。代わりに、最初にクエリを行う(またはあなたのmodが起動したときに)接続を開いて、開いたままにしてから、modがシャットダウンしたら接続を閉じることをお勧めします。この方法で、接続を複数回再利用して、継続的に再オープンするコストを節約できます。 – SnakeDoc

+0

ええ、これについて病気になっていただきありがとうございます! – TBrauwers

答えて

1

あなたはSQL injectionしかし、悪意のある攻撃を危険にさらしています。準備されたステートメントに切り替えます。ところで、あなたはあなたを更新する必要があり、次のコマンド

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

を使用してドライブをロードconnection.soデータベースを確立する前に、あなたはあなたのプログラムでドライブをロードしていないデータベースの書き込み操作のためのexecuteUpdate

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

私はあなたがなぜ 'PreparedStatement'を' stmt = conn.createStatement();と反対のものに使うのかについても言及します。 stmt.executeQuery(query); ' – SnakeDoc

+0

ありがとうございました! – TBrauwers

0

を使用下記のようにキャッチブロックを試してください

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

JDBC 4.0以降では、 'Class.forName()'を使ってドライバを手動でロードすることはもう必要ありません。したがって、最近JDBCドライバをダウンロードした場合、手動でロードする必要はありません。 – SnakeDoc

+0

アップデートありがとう – jeetendar

関連する問題