选择查询中的 JDBC PreparedStatement 和参数(?)

Posted

技术标签:

【中文标题】选择查询中的 JDBC PreparedStatement 和参数(?)【英文标题】:JDBC PreparedStatement and parameters (?) in select query [duplicate] 【发布时间】:2017-09-02 16:45:28 【问题描述】:

我与 oracle 数据库有这样的连接:

String selectSQL = "SELECT ?,supplier_name FROM supplier WHERE supplier_id = ?";
        PreparedStatement preparedStatement = con.prepareStatement(selectSQL);
        preparedStatement.setString(1, "supplier_id");
        preparedStatement.setInt(2, 1);
        ResultSet rs2 = preparedStatement.executeQuery();

        while (rs2.next()) 
            String userid = rs2.getString(1);
            String username = rs2.getString(2);
            System.out.println(userid);
            System.out.println(username);
        
        con.close();
    ;

问题是第二个参数像我想要的那样传递,这意味着

supplier_id = 1

但是我的第一个参数有问题。每次只传递字符串,所以我的查询看起来像

选择“supplier_id”,supplier_name FROM 供应商 WHERE supplier_id = ?

而不是

选择供应商 ID,供应商名称 FROM 供应商 WHERE 供应商 ID = ?

因此,我没有从对应于供应商 ID 的表中获取值,而是从字符串“供应商 ID”中获取值。 我究竟做错了什么?我应该改变什么以获得值而不是字符串?

【问题讨论】:

【参考方案1】:

这种方式无法创建动态查询,您必须使用正常的字符串操作。参数只能用于值,如字符串、数字等,不能用于名称。

在你的情况下,可以做类似的事情

String sqlTemplate = "SELECT <id_column>,supplier_name FROM supplier WHERE supplier_id = ?";
String selectSQL = sqlTemplate.replace("<id_column>", "supplier_id");

【讨论】:

正常的字符串操作是什么意思? 我已经编辑了我的答案以提供一个例子 现在我很清楚了 :) 非常感谢,你太棒了 :)

以上是关于选择查询中的 JDBC PreparedStatement 和参数(?)的主要内容,如果未能解决你的问题,请参考以下文章

选择查询中的 JDBC PreparedStatement 和参数(?)

jdbc的增删改查

传统JDBC操作数据库

如何在 java 中使用 jdbc 编写选择查询需要检查 COLUMN 是不是为 NULL?

MybatisMybatis简介与入门程序

JDBC 模板中的 DATEADD