代码之家  ›  专栏  ›  技术社区  ›  Brandon Benefield

Java+JDBC:准备好的语句失败

  •  0
  • Brandon Benefield  · 技术社区  · 6 年前

    我正试图做一个准备好的陈述,驱动程序正在按照我假设的方式工作,但唯一的问题是我的查询不再有效。

    SELECT ip_address
    FROM log_activity
    WHERE created_at
      BETWEEN "2017-01-01 00:00:00"
      AND DATE_ADD("2017-01-01 00:00:00", INTERVAL 1 HOUR)
    GROUP BY ip_address
    HAVING COUNT(*) > 200;
    

    但在为准备好的语句插入参数后,结果是:

    SELECT ip_address
    FROM log_activity
    WHERE created_at
      BETWEEN '\'2017-01-01 00:00:00\''
      AND DATE_ADD('\'2017-01-01 00:00:00\'', INTERVAL 1 'hour')
    GROUP BY ip_address
    HAVING COUNT(*) > 200;
    

    它不再是有效的SQL。那么我如何从参数中删除这些引用,或者什么是解决这个问题的好方法呢?

    ...
    
    String startDateArg = "'" + args[0].split("=", 2)[1].replace(".", " ") + "'";
    String durationArg = args[1].split("=", 2)[1];
    int thresholdArg = Integer.parseInt(args[2].split("=", 2)[1]);
    
    String duration = durationArg.equals("hourly") ? "hour" : durationArg.equals("daily") ? "day" : null;
    
    String getUsersOverAPILimitQuery = "" +
        "select ip_address " +
        "from log_activity " +
        "where created_at " +
        "  between ?" +
        "  and date_add(?, interval 1 ?) " +
        "group by ip_address " +
        "having count(*) > ?;";
    PreparedStatement preparedStatement = con.prepareStatement(getUsersOverAPILimitQuery);
    preparedStatement.setString(1, startDateArg);
    preparedStatement.setString(2, startDateArg);
    preparedStatement.setString(3, duration);
    preparedStatement.setInt(4, thresholdArg);
    
    System.out.println(preparedStatement);
    
    ResultSet getUsersOverAPILimit = preparedStatement.executeQuery();
    
    while (getUsersOverAPILimit.next()) {
        String ip_address = getUsersOverAPILimit.getString("ip_address");
        System.out.println(ip_address);
    }
    
    ...
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Justin    6 年前

    与此相反:

    String startDateArg = "'" + args[0].split("=", 2)[1].replace(".", " ") + "'";
    

    这样做:

    String startDateArg = args[0].split("=", 2)[1].replace(".", " ");