【问题标题】:Java MySQL check if value exists in databaseJava MySQL检查数据库中是否存在值
【发布时间】:2013-04-12 12:54:16
【问题描述】:

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

【问题讨论】:

  • 拜托,拜托,拜托,请始终使用查询绑定...您不仅可以防止 SQL 注入攻击,还可以帮助数据库,因为它会缓存执行计划,使下一个查询更快。跨度>

标签: java mysql jdbc


【解决方案1】:

您需要在 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);
}

【讨论】:

  • 是的,忘记了连字符,我只用整数测试它......我的错......谢谢!
【解决方案2】:

您需要使用绑定变量。

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

或者手动报价,但这样做有风险。

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

【讨论】:

    【解决方案3】:

    你可以试试这个:

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

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

    【讨论】:

    • 只是在这里回答时的一个建议,如果用户连接字符串以用于 sql 查询,请始终推荐PreparedStatement 如果您不这样做,许多用户会立即对您投反对票,同样请注意,您会因提及 sql 注入/preparedstatements 而获得一些支持。
    【解决方案4】:

    由于 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();
    

    【讨论】:

      【解决方案5】:

      在参数周围使用单引号:

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

      或者你最好使用prepared statements

      【讨论】:

        【解决方案6】:

        你需要使用单引号

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

        【讨论】:

          【解决方案7】:
          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)+"')";
          }
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-02
            • 1970-01-01
            • 2022-11-26
            • 1970-01-01
            • 2018-03-05
            • 2010-10-24
            相关资源
            最近更新 更多