0

我正在用java构建一个决策支持系统。下面是代码的一部分,它扫描用户输入的搜索词,然后将其与数据库 searchlog.searchcolumn 值进行比较,如果该词不存在则创建一个新条目。但是在 if 语句中,我希望它检查条目,如果它已经在 searchlog.searchcolumn 列中,那么我希望它不要创建新的重复条目,而是为 searchlog.counter 列添加 +1 值具体的词。例如,如果搜索词是“UMBRELLA”并且数据库中已经有一个伞条目,我希望它在 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

您的查询应该是:

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

Values 子句也应该用括号括起来。

并始终使用 equals() 检查两个字符串是否有意义地相等。如果是对象,==则检查两个引用变量是否引用同一个对象。

      if (InputScanner == CheckSearch) {

should be:

      if (InputScanner.equals(CheckSearch)) {

然后,如果 InputScanner 与 checkSearch 相同,您的 if 语句将返回 true。

建议:

我强烈建议您使用PreparedStatement而不是简单的 Statement 来防止 SQL 注入。

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

你用的是什么数据库?如果您使用的是 MySQL,那么您应该查看INSERT ... ON DUPLICATE KEY UPDATE语句。(其他 SQL 数据库有MERGE,我不太熟悉。)这里是MySQL 文档

您将需要制作您searchcolumn的 aUNIQUEPRIMARY专栏,然后是以下内容:

INSERT INTO searchlog( searchcolumn, count) VALUES ("my search query", 0) ON DUPLICATE KEY UPDATE count= count+ 1;
会完成你想要的。

于 2012-12-06T22:58:34.690 回答
0

1) 值也需要用大括号括起来

例子:

VALUES ('"+ InputScanner + "');

2)假设InputScannerCheckSearch是字符串/可比较的对象,你需要做.equals()而不是==

例子:

if (InputScanner.equals(CheckSearch)) {

注意:您的 SQL 语句容易受到 SQL 注入攻击。最好使用PreparedStatement

于 2012-12-06T22:28:51.033 回答
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 回答