Java JDBC语法错误

Java JDBC语法错误,java,jdbc,Java,Jdbc,我有这个方法来加载对象,但是当我运行sql代码时,它给了我一个语法错误 public void loadObjects() { Statement s = setConnection(); // Add Administrators try { ResultSet r = s.executeQuery("SELECT * FROM Administrator;"); while (r.next()) { Admin

我有这个方法来加载对象,但是当我运行sql代码时,它给了我一个语法错误

public void loadObjects() {
    Statement s = setConnection();

    // Add Administrators
    try {
        ResultSet r = s.executeQuery("SELECT * FROM Administrator;");
        while (r.next()) {
            Administrator getUser = new Administrator();
            getUser.ID = r.getString(2);

            ResultSet r2 = s.executeQuery("SELECT * FROM Userx WHERE ID= {" + getUser.ID + "};");
            getUser.name = r2.getString(2);
            getUser.surname = r2.getString(3);
            getUser.PIN = r2.getLong(4);

            JBDeveloping.users.administrators.add(getUser);
        }
    } catch (Exception e) {
        System.out.println(e);
    }

}
我试过像其他问题中所说的那样插入花括号,但我要么做得不对,要么就是不起作用。 这个方法应该能够加载所有管理员,但我相信它只插入了ID的一半。 它获取的ID由数字和字符组成;示例“26315G”

错误- com.microsoft.sqlserver.jdbc.SQLServerException:“26315”附近的语法不正确

编辑-

private java.sql.Connection setConnection(){
    java.sql.Connection con = null;
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String url = "jdbc:sqlserver://" + host + ";DatabaseName=" + database + ";integratedSecurity=true;";
        con = DriverManager.getConnection(url, username, password);
    } catch(Exception e) {
        System.out.println(e);
    }
    return con;
}

public void loadObjects() {
    java.sql.Connection con = setConnection();

    // Add Administrators
    try {
        PreparedStatement sql = con.prepareStatement("SELECT * FROM Administrator");
        ResultSet rs = sql.executeQuery();
        while (rs.next()) {
            Administrator getUser = new Administrator();
            getUser.ID = rs.getString(2);

            PreparedStatement sql2 = con.prepareStatement("SELECT * FROM Userx WHERE ID=?");
            sql2.setString(1, getUser.ID);
            ResultSet r2 = sql2.executeQuery();

            getUser.name = r2.getString(2);
            getUser.surname = r2.getString(3);
            getUser.PIN = r2.getLong(4);

            JBDeveloping.users.administrators.add(getUser);
        }
    } catch (Exception e) {
        System.out.println(e);
    }

}

您不应该使用{},也不应该像这样将参数附加到SQL查询中

去掉大括号,改用PreparedStatement


请参见

您不应该使用{},也不应该像这样将参数附加到SQL查询中

去掉大括号,改用PreparedStatement


请参见

实际上,在JDBC中,这不是实现这一点的方法。这样,即使对语法错误进行排序,代码也很容易受到sql注入攻击

正确的方法是:

// Let's say your user id is an integer

PreparedStatement stmt = connection.prepareStatement("select * from userx where id=?");
stmt.setInt(1, getUser.ID);
ResultSet rs = stmt.executeQuery();

通过这种方式,您可以防止在应用程序请求参数中插入SQL的任何尝试,实际上在JDBC中并不是这样做的。这样,即使对语法错误进行排序,代码也很容易受到sql注入攻击

正确的方法是:

// Let's say your user id is an integer

PreparedStatement stmt = connection.prepareStatement("select * from userx where id=?");
stmt.setInt(1, getUser.ID);
ResultSet rs = stmt.executeQuery();

通过这种方式,可以防止在应用程序请求参数中插入SQL的任何尝试首先:如果同时使用结果集,则必须对其中的每一个使用单独的语句(不能在两个r和r2之间共享语句)。此外,在阅读r2.next()之前,还缺少它

另一方面,在循环中使用PreparedStatement要比一直重写查询有效得多

所以我会选择这样的方式:

public void loadObjects() {
    try (
        Statement st = getConnection().createStatement();
        //- As you read (later) only id, then why to use '*' in this query? It only takes up resources.
        ResultSet rs = st.executeQuery("SELECT id FROM Administrator");
        PreparedStatement ps = getConnection().prepareStatement("SELECT * FROM Userx WHERE ID = ?");
        ResultSet r2 = null;
    ) {
        while (rs.next()) {
            Administrator user = new Administrator();
            user.ID = rs.getString("id");
            ps.setInt(1, user.ID);
            r2 = ps.executeQuery();
            if (r2.next()) {
                user.name = r2.getString(2);
                user.surname = r2.getString(3);
                user.PIN = r2.getLong(4);
                JBDeveloping.users.administrators.add(user);
            }
            else {
                System.out.println("User with ID=" + user.ID + " was not found.");
            }
        }
    }
    catch (Exception x) {
        x.printStacktrace();
    }
}

请注意Java7自动关闭特性的使用(您没有关闭代码中的资源)。最后一点注意:在查询中不分离语句之前,对于JDBC文档,不应该放置“;”在语句末尾(在所有情况下都不应将“;”作为查询字符串中的最后一个字符)。

首先:如果同时使用结果集,则必须对它们中的每一个使用单独的语句(不能在两个r和r2之间共享语句)。此外,在阅读r2.next()之前,还缺少它

另一方面,在循环中使用PreparedStatement要比一直重写查询有效得多

所以我会选择这样的方式:

public void loadObjects() {
    try (
        Statement st = getConnection().createStatement();
        //- As you read (later) only id, then why to use '*' in this query? It only takes up resources.
        ResultSet rs = st.executeQuery("SELECT id FROM Administrator");
        PreparedStatement ps = getConnection().prepareStatement("SELECT * FROM Userx WHERE ID = ?");
        ResultSet r2 = null;
    ) {
        while (rs.next()) {
            Administrator user = new Administrator();
            user.ID = rs.getString("id");
            ps.setInt(1, user.ID);
            r2 = ps.executeQuery();
            if (r2.next()) {
                user.name = r2.getString(2);
                user.surname = r2.getString(3);
                user.PIN = r2.getLong(4);
                JBDeveloping.users.administrators.add(user);
            }
            else {
                System.out.println("User with ID=" + user.ID + " was not found.");
            }
        }
    }
    catch (Exception x) {
        x.printStacktrace();
    }
}


请注意Java7自动关闭特性的使用(您没有关闭代码中的资源)。最后一点注意:在查询中不分离语句之前,对于JDBC文档,不应该放置“;”在语句末尾(在所有情况下都不应将“;”作为查询字符串中的最后一个字符)。

还有什么问题?这不是JDBC语法,而是SQL语法。为什么要使用大括号
{}
。尝试以下方式进行查询:
“SELECT*FROM Userx,其中ID=“+getUser.ID+”;“
不带大括号。将
{}
替换为单引号
'
,您就可以了,或者使用
PreparedStatement
setString()
method institle.mu在microsoftI上执行查询时,SQL代码运行良好。我尝试了使用{}或“”的不同方法。但是,当我使用“”时,当它应该返回1时,它不返回任何行。如果这不起作用,我可能会用事先准备好的声明。还有什么问题吗?这不是JDBC语法,而是SQL语法。为什么要使用大括号
{}
。尝试以下方式进行查询:
“SELECT*FROM Userx,其中ID=“+getUser.ID+”;“
不带大括号。将
{}
替换为单引号
'
,您就可以了,或者使用
PreparedStatement
setString()
method institle.mu在microsoftI上执行查询时,SQL代码运行良好。我尝试了使用{}或“”的不同方法。但是,当我使用“”时,当它应该返回1时,它不返回任何行。如果这不起作用,我可能会使用prepared语句。通常情况下是这样的,请注意,userID是从表管理员获取的,而不是从请求参数获取的。但我还是会使用PS,因为其他原因。那么,当我使用准备好的语句时?代表一个开放变量,我以后必须按顺序设置它?调整代码并将所有语句更改为准备好的语句,但是结果集仍然没有返回行。请阅读我的注释,了解单独的语句以及我的另一个答案中缺少的r2.next()。通常情况下,这是正确的,请注意,该用户标识来自表管理员,而不是请求参数。但我还是会使用PS,因为其他原因。那么,当我使用准备好的语句时?表示一个打开的变量,我以后必须按顺序设置它?调整代码并将所有语句更改为准备好的语句,但是结果集仍然没有返回行。请阅读我关于单独语句的注释,并在我的另一个答案中缺少r2.next()。怪不得它当时不起作用!我忘了读声明lol。但除此之外,至少我学会了准备好的声明。我每天使用不同的语言,有时我会弄糊涂什么时候用“;”和什么时候不用“;”。您不关闭资源是什么意思?您没有关闭语句集和结果集。通常,您应该使用try-catch-finally构造,并将所有清理代码放在finally子句中,例如语句s。。。;试试{…;}catch(){…}最后{如果(s!=null){试试{s.close()}catch(){}}---在PreparedStatement、ResultSet和可能的连接对象上也是一样的。难怪它当时不起作用!我忘了读声明lol。但除此之外,至少我学会了准备好的声明。我每天使用不同的语言,有时我会弄糊涂什么时候用“;”和什么时候不用“;”。你不关闭资源中心是什么意思