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

时间:2013-04-19 07:23:20

标签: java mysql jdbc

我正在尝试检查我的数据库中是否已存在特定值。我正在使用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命令行中执行此命令,它会起作用!你能告诉我,我的陈述有什么不对吗?感谢您的任何提示!

7 个答案:

答案 0 :(得分:24)

您需要在MySQL中用String括起引号,因此查询需要

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

SELECT * from messages WHERE msgid = d-f05708071f8f;

所以代码应该是

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

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

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

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

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

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);
}

答案 1 :(得分:5)

您需要使用绑定变量。

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

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

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

答案 2 :(得分:3)

由于msgid是一个varchar,你需要用where引号括起where子句中的值。

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

不建议动态生成SQL字符串,因为它可以将应用程序暴露给sql注入。

而是使用PreparedStatement

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

答案 3 :(得分:3)

在参数周围使用单引号:

"SELECT * FROM messages WHERE msgid = '" + msgid + "'";

或者您更好地使用prepared statements

答案 4 :(得分:3)

你可以试试这个:

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

你错过了msgid的引用。 (我假设 msgid String而不是Integer值。)

答案 5 :(得分:1)

您需要使用单引号

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

答案 6 :(得分:0)

change

只是一个简单的重复输入算法