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