Javaサーブレットクラスを使用して、登録フォームから取得したユーザー情報をDerby DBに挿入しようとしています。
ユーザーの情報が入力された状態でユーザーが送信ボタンをクリックした直後に、NetBeansのDBに接続しました。次に、このメソッドを実行する必要があります。
public void insertNewUser(String userName, String passWord, String lastName, String firstName, String age, char sex, String email) {
try {
stmt = conn.createStatement();
String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES ('" + userName + "', '" + passWord + "', '" + lastName + "', '" + firstName + "', " + age + ", '" + sex + "', '" + email + "')";
System.out.println(insertNewUserSQL);
stmt.executeQuery(insertNewUserSQL);
stmt.close();
} catch(SQLException sqlExcept) {
sqlExcept.printStackTrace();
}
}
しかし、私は次の例外を受け続けます:
Java.sql.SQLException: executeQuery method can not be used for update.
これはどういう意味ですか?
NetBeans SQLコマンドウィンドウで手動で実行できるため、SQLコマンドは正しいです。
サーブレットや私が知らないことについての制限はありますか?
前もって感謝します!
レコードを挿入するので、executeUpdate()
ではなくexecuteQuery()
を使用する必要があります。
通常は誤用されるいくつかの方法を次に示します。
ブール実行()
このPreparedStatementオブジェクト内のSQLステートメントを実行します。これは、どのような種類のSQLステートメントでもかまいません。
ResultSet executeQuery()
このPreparedStatementオブジェクトでSQLクエリを実行し、クエリによって生成されたResultSetオブジェクトを返します。
int executeUpdate()
このPreparedStatementオブジェクト内のSQLステートメントを実行します。これは、SQL INSERT、UPDATE、またはDELETEステートメントでなければなりません。または、DDLステートメントなど、何も返さないSQLステートメント。
さらに、SQL Injection
に対して脆弱であるため、クエリは脆弱です。 PreparedStatement
を使用してパラメーター化してください。
サンプルコードスニペット:
String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES (?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(insertNewUserSQL);
pstmt.setString(1, userName);
// ... repeat this step until the last parameter ....
pstmt.setString(7, email);
pstmt.executeUpdate();
値を更新するには、次のように更新可能なResultSetを使用する必要があります。
_ResultSet res = preparedStatement.executeQuery(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
res.first();
res.updateInt("id", 2);
res.updateRow();
_
または、次のように、ステートメントのexecuteUpdateメソッドを使用できます。statement.executeUpdate("update table set id = 2");