12

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

4

7 回答 7

26

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

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

不是

SELECT * from messages WHERE msgid = d-f05708071f8f;

所以代码应该读

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

我建议使用 aPreparedStatement来避免此类问题和任何 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);
}
于 2013-04-19T07:26:08.440 回答
6

您需要使用绑定变量。

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

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

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

于 2013-04-19T07:26:15.073 回答
3

由于 msgid 是一个 varchar,因此您需要用单引号将 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();
于 2013-04-19T07:26:08.000 回答
3

在参数周围使用单引号:

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

或者更好地使用准备好的语句

于 2013-04-19T07:26:15.140 回答
3

你可以试试这个:

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

您错过了有关 msgid 的引号。(我假设msgidString而不是Integer值。)

于 2013-04-19T07:27:36.097 回答
1

您需要使用单引号

SELECT * from messages WHERE msgid = 'd-f05708071f8f'; 
于 2013-04-19T07:27:02.153 回答
0
String sql1 ="SELECT Time FROM monday_wednesday WHERE Time ='"+time.getSelectedItem()+"'";
pst=con.prepareStatement(sql1);
rs=pst.executeQuery();
if(rs.next()) {
    if(rs.getString("Time").equals(time.getSelectedItem())) {
        JOptionPane.showMessageDialog(null,"Time is already taken","",JOptionPane.INFORMATION_MESSAGE); 
    }
} else {
    String sql="INSERT INTO monday_wednesday(pfname,pmname,plname,Birthdate,Gender,Address,City,Contact,Contactperson,Time,Date)\n" + "VALUES ('"+txtFirstName1.getText()+"','"+txtMiddleName1.getText()+"','"+txtLastName1.getText()+"','"+d+"','"+gender.getSelectedItem()+"','"+ txtAddress.getText()+"','"+txtCity.getText()+"','"+txtContact.getText()+"','"+txtContactPerson1.getText()+"','"+time.getSelectedItem()+"','"+dateFormat.format(date)+"')";
}

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

于 2017-07-29T16:30:45.860 回答