当前位置: 首页 > 知识库问答 >
问题:

ResultSet返回PreparedStatement参数而不是实际结果[duplicate]

姜嘉良
2023-03-14

我想从一个MariaDB数据库获取数据,并通过Maven安装了MariaDB JDBC连接器。下面的代码将PreparedStatementPSTMT数据的参数而不是实际的行/单元格数据添加到组合框中(请参见代码段,第10行)。这就是我要解决的问题。如果重要的话,我的表由1个int和4个varchar组成。

代码段(带行计数):

// WRITTEN IN NORMAL JAVA 11
 1| Connection db = DriverManager.getConnection("jdbc:mariadb://localhost:3306/DB", "USER", "PASSWORD");
 2| PreparedStatement pstmt = db.prepareStatement("SELECT ? FROM companies;");
 3| pstmt.setString(1, ((JComboItem) companySelectFilterCategoryComboBox.getSelectedItem()).getValue()); // getValue() returns "email"; Combo Box is JComboBox<ComboItem>, ComboItem.groovy is below
 4| System.out.println(pstmt); // OUTPUT: sql : 'SELECT ? from companies;', parameters : ['email']
 5| ResultSet rs = pstmt.executeQuery();
 6| ArrayList<ArrayList<String>> list = ResultSetService.resultSetToArrayLists(rs); // This returns an ResultSet as an deep ArrayList (as ArrayList<ArrayList<String>>), see below
 7| System.out.println(ResultSetService.toString(rs)); //OUTPUT: [[email], [email]]

// This output is already wrong, should be: [[mail1@localhost], [mail2@localhost]]
// This is the above mentioned problem I want to fix.

 8| companySelectOptionsComboBox.removeAllItems();
 9| for (ArrayList<String> arr: list) {
10|    companySelectOptionsComboBox.addItem(arr.get(0));
11| }
// WRITTEN IN GROOVY
class JComboItem {
    private String key;
    private String value;

    JComboItem(String key, String value)
    {
        this.key = key;
        this.value = value;
    }

    @Override
    String toString()
    {
        return key;
    }

    String getValue()
    {
        return value;
    }
}
// WRITTEN IN GROOVY
class ResultSetService {

    static ArrayList<ArrayList<String>> resultSetToArrayLists(ResultSet rs) throws SQLException {
        ArrayList<ArrayList<String>> list = new ArrayList<>()
        rs.beforeFirst()
        while (rs.next()) {
            ArrayList<String> row = new ArrayList<>()
            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                row.add(rs.getString(i))
            }
            list.add(row)
        }
        return list
    }
}

共有1个答案

龙晟睿
2023-03-14

不能使用占位符插入列名。有效的查询是:选择'email'from something。您必须将列的名称连接到sql字符串中。因此,要加倍小心,恶意用户不能在那里注入sql(例如,使用枚举或其他允许列表)。

 类似资料:
  • 我正在尝试用Akka / Scala编写一个actor,调用HTTP REST API并将结果发送回调用actor。API 可能会返回结果的集合/向量,必须首先将其转换为内部供应商中性格式,以便将来可以更改供应商,而无需对代码进行太多更改。大多数代码都在工作,但我不知道如何解压缩并发送内部向量。 这是我拥有的代码,它向调用的Actor返回一个。我想返回的是最终操作中创建的实际向量: 主叫演员: 如

  • 问题内容: 我想获取动态生成的HQL查询的结果计数,而无需实际获取结果列表。说我的查询是这样的: 我在Hibernate文档中看到: 您可以计算查询结果的数量而无需返回它们: 我怀疑应该用查询替换 .... ,但这不起作用,因为HQL不支持FROM中的子选择。 那么,我应该如何计算动态生成的HQL查询的结果?我认为通过执行它并获取结果列表的.size()可能是不必要的开销。 干杯! 更新: 我使用

  • 问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相

  • 我知道有很多与此相关的问题,但我似乎找不到一个能帮助我解决问题的答案。 我正在使用os.walk()循环浏览主文件夹中的子文件夹,其中包含文件夹和文件。 因此,我使用这段代码根据子文件夹名称创建一个新的文本文件。但是,这将返回folder/.txt,这意味着dirs将返回“/”,而files将返回['file.txt','file2.txt']。 如何修复它,使dirs返回['主文件夹/传递文件夹

  • 我试图用Java创建一个XPath表达式(8,默认XPath实现)。我正在做以下工作: 我在同一级别的文档中有多个PartyId节点,因为它的父节点是重复的。我得到了结果,但只有一个节点。(第一)。 补充信息:如果我在表达式的末尾写[$k],比如[1]或[2],我得到了我的元素,但是我需要它们。:( 但是,如果我正在测试同一个XPath,例如http://www.freeformatter.com

  • 问题内容: 这是我的图式 但是当我: 我得到了,虽然它应该返回 实际上,如果我去查询它,我会得到: 问题答案: 要使用嵌入式子文档(如)中命名的字段,您必须使用显式定义,否则Mongoose会感到困惑: