2016-06-14 7 views
0

私はMySQLを使用していますが、私にアンドロイドのような構文SQLを与える独自のデータベースヘルパークラスを作成することに決めました。 PreparedStatement、コードを実行すると、データベースに変更は起こりませんが、例外はスローされません。私は接続文字列を二重チェックし、自分の.jarsが順番になっていることを確認し、構文を三重にチェックしましたが、何もしませんでした。コード:java.sql.PreparedStatement.executeUpdate()がmysqlデータベースと連携していません

DatabaseHelper.java:

public class DatabaseHelper { 

String dbHost = "localhost"; 
String dbPort = "3306"; 
String dbName = "nakomangdb"; 
String dbUsername = "root"; 
String dbPassword = "sqldb"; 
String connectionString = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName; 
Connection connection; 
PreparedStatement preparedStatement; 

public DatabaseHelper() { 
} 

public void closeDatabase() { 
    try { 
     if (!connection.isClosed()) 
      connection.close(); 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
    } 

} 

public void openDatabase() { 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     connection = DriverManager.getConnection(connectionString, dbUsername, dbPassword); 
     connection.setAutoCommit(true); 
    } catch (ClassNotFoundException | SQLException ex) { 
     ex.printStackTrace(); 
    } 
} 

public void update(String table, String[] set, Object[] to, String whereClause, Object[] whereArgs) { 
    StringBuilder sql = new StringBuilder("update "); 
    sql.append(table); 
    sql.append(" set "); 

    for (int i = 0; i < set.length; i++) { 

     sql.append(set[i]); 
     sql.append(" = ?"); 

     if (i != (set.length - 1)) { 
      sql.append(", "); 
     } 

    } 
    sql.append(" "); 

    int argCount = to.length; 

    try { 

     if (whereClause != null) { 
      sql.append(whereClause); 
      sql.append(";"); 

      preparedStatement = connection.prepareStatement(sql.toString()); 

      for (Object s : whereArgs) { 
       preparedStatement.setObject(argCount++, s); 
      } 

     } else { 

      sql.append(";"); 
      preparedStatement = connection.prepareStatement(sql.toString()); 

     } 

     argCount = 0; 

     for (Object s : to) { 
      preparedStatement.setObject(argCount++, s); 
     } 

     preparedStatement.executeUpdate(); 

     preparedStatement.close(); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

} 

} 

呼び出すコード:範囲外

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    DatabaseHelper dbHelper = new DatabaseHelper(); 

    dbHelper.openDatabase(); 
    dbHelper.update("customer", 
      new String[]{"fullName"}, 
      new Object[]{"vernon"}, 
      "where ID=?", 
      new Object[]{1}); 
    dbHelper.closeDatabase(); 
    response.getWriter().append("Done!"); 
} 
+0

stacktraceにサーバーログをチェックしましたか? – DiogoSantana

+0

私は今、java.sql.SQLExceptionを取得しました。パラメータインデックスが範囲外です(0 <1)。これは、argCountが決して0でないため意味がありません。チェックすると、PrepaaredStatement.setXXXメソッドの順序が決まりますいわゆる物質?私は厳密に1,2,3などのargの位置をその順番に設定する必要がありますか、または3,4,1,2を設定できますか? – BiGGZ

+1

_ "argCountは決して0です" _ - 申し訳ありませんが、これは間違っています。 'argCount'はゼロに初期化され、' argCount ++ 'は*** post *** incrementです。 –

答えて

1

パラメータインデックス(0 < 1)、argCountため意味をなさない決して0ではない

ああそうです。例外は存在しません。

私は再び

チェックをチェックします。あなたのコードを読んでください。私は引用:

argCount = 0; 

はPrepaaredStatement.setXXX方法が問題で呼び出される順序のでしょうか?

iが厳密にこの順序

またはI 3を設定することができるのArg位置1,2,3などを設定しなければなりませんの、4,1,2?

はい。

argCountはゼロではなく1に初期化する必要があります。そうでない場合はargCount++ではなく++argCountを使用する必要があります。

あなたのヘルパークラスは、データベースがコンストラクタで開かれていればずっと簡単になります。また、ステートメント関連のものをコンストラクターに渡して、そこに準備することもできます。

autoCommit=trueがデフォルトです。 Class.forName()は2007年以降に必要とされていません。

関連する問題