0

Java で意思決定支援システムを構築しています。以下は、ユーザーが入力した検索語をスキャンし、それをデータベースの searchlog.searchcolumn 値と比較し、単語が存在しない場合は新しいエントリを作成するコードの一部です。しかし、ifステートメントでは、エントリをチェックし、すでにsearchlog.searchcolumn列にある場合は、新しい重複エントリを作成するのではなく、searchlog.counter列に+1値を追加したい特定の単語。たとえば、検索ワードが「UMBRELLA」で、データベースに既に 1 つの傘のエントリがある場合、UMBRELLA 行のカウンター列に +1 を追加します。

この目的は、すべての検索語を保存し、最も人気のあるものを追跡することです。お時間をいただきありがとうございます String CheckSearch = "SELECTsearchcolumn FROMsearchlog";

String InsertColumn = "INSERT INTO `mydb`.`searchlog` (`searchcolumn`) VALUES ('"+ InputScanner + "'); 
         //
if (InputScanner.equals(CheckSearch)) 
   System.out.println("value ealready exist, counter well be updated"); 
else
   stmt.executeUpdate(InsertColumn); 

編集 PreparedStatement の使用に関するアドバイスをありがとうございます。しかし、これは多かれ少なかれ深刻な最初の課題であり、今回はコードの脆弱性を無視しましょう。ありがとう

4

4 に答える 4

1

どのデータベースを使用していますか? MySQL を使用している場合は、INSERT ... ON DUPLICATE KEY UPDATEステートメントを調べる必要があります。(他の SQL データベースMERGEは.

searchcolumnaUNIQUEまたはPRIMARYcolumn を作成してから、次の行に沿って何かを作成する必要があります。

INSERT INTO searchlog( searchcolumn, count) VALUES ("私の検索クエリ", 0) ON DUPLICATE KEY UPDATE count= count+ 1;
あなたが望むものを達成します。

于 2012-12-06T22:58:34.690 に答える
1

クエリは次のようになります。

String InsertColumn = "INSERT INTO `mydb`.`searchlog` (`searchcolumn`) VALUES ('"+ InputScanner + "'"); 

値句も角かっこで囲む必要があります。

また、常に equals() を使用して、2 つの文字列が意味的に等しいかどうかを確認します。オブジェクトの==場合、2 つの参照変数が同じオブジェクトを参照しているかどうかを確認します。

      if (InputScanner == CheckSearch) {

should be:

      if (InputScanner.equals(CheckSearch)) {

次に、InputScanner が checkSearch と同じ場合、if ステートメントは true を返します。

アドバイス:

SQL インジェクションを防ぐために、単純なステートメントではなく、PreparedStatementを使用することを強くお勧めします。

PreparedStatement st = conn.preparedStatement(InsertColumn);
st.setString(1, val1);
于 2012-12-06T22:27:22.920 に答える
0

タスク用のMySQL ステートメントがあります。

要件:searchcolumn一意のキーです。

String sql = "INSERT INTO mydb.searchlog(searchcolumn, counter) VALUES(?, 1) "
    + " ON DUPLICATE KEY UPDATE counter = counter + 1";
PreparedStatement stmt = connection.createPreparedStatement(sql);
stmt.setParameter(1, checkSearch.toUpperCase());
int updateCount = stmt.executeUpdate();

updateCountただし、INSERT と UPDATE のどちらが発生したかを区別するかどうかはわかりません。getGeneratedKeys言及されていない AUTOINCR 主キーがある場合は、その目的で使用できます。

于 2012-12-06T23:06:53.807 に答える