java、mysql比较和编辑值

java、mysql比较和编辑值,java,mysql,comparison,Java,Mysql,Comparison,我正在用java构建一个决策支持系统。下面是代码的一部分,它扫描用户键入的搜索词,然后将其与数据库searchlog.searchcolumn值进行比较,如果该词不存在,则创建一个新条目。但是在if语句中,我希望它检查条目,如果它已经在searchlog.searchcolumn列中,那么我希望它不要创建新的重复条目,而是为特定单词的searchlog.counter列添加+1值。 例如,若搜索词是“伞”,并且数据库中已经有一个伞条目,我希望它将+1添加到伞行中的计数器列 这样做的目的是存储所有

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

这样做的目的是存储所有搜索词,并跟踪最流行的搜索词。 谢谢你抽出时间 String CheckSearch=“SELECTsearchcolumn FROMsearchlog”

编辑
感谢您提出使用PreparedStatement的建议,但这是我的第一个或多或少严重的挑战,这一次,让我们忽略我代码的漏洞。谢谢

您的查询应该是:

String InsertColumn = "INSERT INTO `mydb`.`searchlog` (`searchcolumn`) VALUES ('"+ InputScanner + "'"); 
Values子句也应该用括号括起来

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

      if (InputScanner == CheckSearch) {

should be:

      if (InputScanner.equals(CheckSearch)) {
然后,如果InputScanner与checkSearch相同,则if语句将返回true

忠告: 我强烈建议您使用而不是简单的语句来防止SQL注入

PreparedStatement st = conn.preparedStatement(InsertColumn);
st.setString(1, val1);
1) 值也需要放在大括号中

例如:

VALUES ('"+ InputScanner + "');
if (InputScanner.equals(CheckSearch)) {
2) 假设
InputScanner
CheckSearch
是字符串/可比较对象,则需要执行
.equals()
而不是
=

例如:

VALUES ('"+ InputScanner + "');
if (InputScanner.equals(CheckSearch)) {

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

您使用的是什么数据库?如果您使用的是MySQL,那么您应该查看
INSERT。。。在重复密钥更新时
语句。(其他SQL数据库有
MERGE
,我不太熟悉)

您需要将您的
搜索列
设置为一个
唯一的
主要的
列,然后按照以下内容进行操作:将完成您想要的任务。

您的任务有:

INSERT INTO
searchlog
(
searchcolumn
,
count
) VALUES ("my search query", 0) ON DUPLICATE KEY UPDATE
count
=
count
+ 1; 要求:
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
是否区分是否发生了插入或更新。如果有一个未提及的AUTOINCR主键,您可以使用
getGeneratedKeys

如果您正在开发一个系统(如您所说的决策支持系统),则一目了然然后,如果可能的话,您必须使用来缓解SQL注入攻击,或者使用诸如Hibernate或JPA之类的ORM模型以及控制器来实现完整的MVC体系结构。感谢您提供使用PreparedStatement的建议,但这是我的第一个或多或少严重的挑战,这一次,让我们忽略我代码的漏洞。Thanksit看起来很有效,但我在同一个表中有一个autoincrement ID列,使用这个查询,它在每次执行语句时增加1。例如,如果伞形搜索10次,id将变为11而不是2如果您的用例已经规定
searchcolumn
必须是唯一的,我不明白您为什么需要第二个自动增量列。但是,如果还必须具有自动增量,则只需使两列的组合唯一即可。看见