Java 如何根据用户输入的表名和条件从oracle数据库中读取数据?

Java 如何根据用户输入的表名和条件从oracle数据库中读取数据?,java,oracle,Java,Oracle,我试图从oracle数据库中读取数据,用户将在其中输入表名。这里没有问题。但当我添加任何条件时,它就会显示错误。下面给出了带有堆栈跟踪的代码 package jdbc_test; import java.sql.*; import java.util.Scanner; public class JDBC_Test { public static void main(String[] args) { String tab

我试图从oracle数据库中读取数据,用户将在其中输入表名。这里没有问题。但当我添加任何条件时,它就会显示错误。下面给出了带有堆栈跟踪的代码

    package jdbc_test;

    import java.sql.*;
    import java.util.Scanner;

    public class JDBC_Test {
        public static void main(String[] args) {

            String tableName=null;
            Scanner input = new Scanner(System.in);
            int id=8;

            System.out.println("Enter the table name: ");
            tableName = input.nextLine();

            try
            {

                Connection con = DriverManager.getConnection(
                        "jdbc:oracle:thin:@localhost:1521:oracle12c", "system", "oracle12c");


                Statement stmt = con.createStatement();


                ResultSet rs = stmt.executeQuery("select * from "+tableName+"where id='"+id+"'");

                System.out.printf("%15s%15s","Name","ID");

                while (rs.next())
                {
                    System.out.printf("\n%15s",rs.getString("name"));
                }

                con.close();
                stmt.close();
            }
            catch (Exception e)
            {
                System.out.println(e);
            }
          }
      }
控制台:

Enter the table name: 
t
例外情况:

java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
如何读取具有条件的用户指定表名的数据?

从“+tableName+”中选择*,其中id=”“+id+””
更改为
从“+tableName+”中选择*,其中id=”“+id+””

请注意where子句前面的空格。

您的示例中,提供的答案“有效”容易受到攻击。请仔细阅读这个危险的做法。因此,我建议你不要使用它

您希望对列字段使用。请仔细阅读准备好的声明的重要性,因为它将为您在编写更安全的解决方案方面的更美好未来做好准备


允许用户输入表名不是一个好主意 这不仅不是一个好主意,它甚至不受
PreparedStatement
的支持

在准备好的语句中,不能将表名用作参数(
)。您必须找到另一种方法将其放在那里,例如字符串连接,这是很危险的

除非使用预先确定的白名单,否则不能允许用户选择表名,因为这将允许SQL注入

存储库中的凭据是另一个安全风险

您还应该避免将用户名和密码直接放入
getConnection()
。使用秘密管理器,或者至少从未提交到存储库的属性文件(如果使用秘密管理器加密,则会获得额外的点数)中读取

这是您的固定试块:

try
{
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oracle12c", username, password);

    // You want to prepare a statement so you can pass parameters.
    PreparedStatement stmt = con.prepareStatement();

    // The first question mark (?)
    // Assuming this is an INT type. If not, there is setString, setLong, etc.
    ps.setInt(1, id);

    // Note the first question mark is where the ID is supposed to be. This is a parameter.
    ResultSet rs = stmt.executeQuery("select * from tableName where id = ?");

    while (rs.next())
    {
        // Replace "column_name" with the name of your column
        System.out.println(rs.getString("column_name"));
    }

    con.close();
    stmt.close();
}

如果你正在学习编码,无论是谁告诉你按照你的方式编码,都会让你一生都处于非常糟糕的编码实践中,这将导致你工作的公司遭到黑客攻击。

也许你只是错过了“where”之前的一个空格?这个例子很容易受到攻击,并且会让你在编程方面有一个糟糕的未来。请阅读更多信息。这易受SQL注入攻击。不要使用。不需要负片标记。当然,我可以回顾一下最好的方法,但我强调了确切的问题。你本可以在回答中提到所有正确的JDBC方法。@BhushanBhangale如果你同时在他的程序中插入一个非常危险但容易避免的漏洞,那么你解决他的问题这一事实是无关紧要的。虽然我同意Bhushan试图通过查明问题来帮助OP,但请注意他所做的;it’他想做的事会使它成为一个更好的答案。无论如何,这不值得那么多的反对票。@BhushanBhangale对不起,我不想投反对票。。。但我不能让别人继续使用不安全的解决方案。