Java JDBC语法错误
我有这个方法来加载对象,但是当我运行sql代码时,它给了我一个语法错误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
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。但除此之外,至少我学会了准备好的声明。我每天使用不同的语言,有时我会弄糊涂什么时候用“;”和什么时候不用“;”。你不关闭资源中心是什么意思