【问题标题】:Query / Code not returning required result查询/代码未返回所需结果
【发布时间】:2018-07-24 21:07:50
【问题描述】:

以下是我的代码,我正在传递 stateid,并根据 stateid 从表 base_path 中检索数据。

代码在第一次迭代时运行良好,即 stateid = 1 它返回一个结果,但对于第二次迭代,即 state_id = 2 它返回两个记录,即 s_id = 1 和 2。

如何解决这个问题并仅获取 s_id = stateid 的特定记录?

数据库结构是:-

s_id  base_formid           base_xpath
1          1        .//*[@id='collapse-text-dynamic-form-number-1']/div/fieldset/legend/span/a
2          2        .//*[@id='collapse-text-dynamic-form-number-1']/div/fieldset/legend/span/a



public static Map baseXpath(int stateid)
{
    Statement s2 = null;
    try {

        con=null;
        con = DriverManager.getConnection(conUrl, userName, password);
        s2 = con.createStatement();

        String query = "SELECT  base_formid,base_xpath FROM base_path where base_path.s_id = " + stateid;

         ResultSet rs2 = null;
     rs2 = s2.executeQuery(query);
    while (rs2.next()) {
        int basepath_id = rs2.getInt(1);
        String base_xpath = rs2.getString(2);

        basex_path.put(basepath_id, base_xpath);


    }
        con.close();
        return basex_path;

【问题讨论】:

  • 使用这样的 SQL 语句是一个非常糟糕的主意。它对注入开放。考虑参数化您的 SQL 或使用存储过程。
  • 我是 sql 新手,请您帮我解决这个问题
  • 恐怕我一点也不熟悉Java;所以不能建议你如何参数化一个声明。我相信有人可以做到。我的评论更像是对您当前设置的影响的有用警告。

标签: java sql-server database-connection resultset


【解决方案1】:

由于您将参数传递给select 查询,我建议您使用 PreparedStatement 而不是 Statement。下面的代码可以帮助你达到你想要的结果。

public static Map baseXpath(int stateid)
{
    PreparedStatement s2 = null;
    try {

        con=null;
        con = DriverManager.getConnection(conUrl, userName, password);

        String query = "SELECT  base_formid,base_xpath FROM base_path where    base_path.s_id = ?";
         s2 = con.prepareStatement(query);
         s2.setInt(1, stateid);
         ResultSet rs2 = null;
     rs2 = s2.executeQuery();
    while (rs2.next()) {
        int basepath_id = rs2.getInt(1);
        String base_xpath = rs2.getString(2);

        basex_path.put(basepath_id, base_xpath);


    }
        con.close();
        return basex_path;
    }

【讨论】:

  • 仍然得到相同的结果
  • 可能是因为您的 Map 对象 basex_path 保存了之前的结果,因此您看到了所有记录,即 1 和 2
  • 这是地图被声明为静态的问题
  • 太棒了!如果你觉得我的回答对你有帮助,你能不能点击下投票按钮(下数组)下面的勾号,让其他人知道你找到了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多