Java MySQL 检查数据库中是否存在值

2022-09-05 00:09:11

我正在尝试检查我的数据库中是否已经存在特定值。我正在使用JDBC从java独立应用程序访问数据库(用于将记录插入数据库工作的查询,因此我的设置和连接正常)。

String queryCheck = "SELECT * from messages WHERE msgid = " + msgid;
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(queryCheck); // execute the query, and get a java resultset

// if this ID already exists, we quit
if(rs.absolute(1)) {
     conn.close();
     return;
}

我收到此错误(我的SQL语法显然有问题):

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd-f05708071f8f' at line 1

但是,如果我尝试在MySQL命令行中执行此命令,它可以工作!你能告诉我,我的陈述有什么问题吗?感谢您的任何提示!


答案 1

您需要在MySQL中将a括在引号中,因此查询需要String

SELECT * from messages WHERE msgid = 'd-f05708071f8f';

SELECT * from messages WHERE msgid = d-f05708071f8f;

所以代码应该读

String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";

我建议使用 a 来避免这些问题和 SQL 注入的任何风险:PreparedStatement

final String queryCheck = "SELECT * from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();

使用字符串串联来构建查询被认为是非常糟糕的做法。已经很久了。

此外,我建议使用而不是完整,因为这返回的数据要少得多(想想大小),MySQL也可以优化它。select count(*)select *ResultSet

final String queryCheck = "SELECT count(*) from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
if(resultSet.next()) {
    final int count = resultSet.getInt(1);
}

答案 2

您需要使用绑定变量。

 PreparedStatement st = conn.prepareStatement(
    "SELECT * from messages WHERE msgid = ?");
 st.setString(1, msgid);
 ResultSet rs = st.executeQuery(queryCheck); 

或者进入手动报价,但这是有风险的。

除了防止 SQL 注入之外,如果重复运行相同的查询,预准备语句还应提高性能。


推荐