我遇到了SQL问题。这是我的代码,我不知道为什么,也不知道修复它。我使用Java EE和Eclipse来做到这一点。
public void userLogin(String username,String password) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtilsWithProperties.getConnection();
String sql = "select * from users where username = ? and password = ?;";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery(sql);
if(rs.next()) {
System.out.println("SUCESS");
} else {
System.out.println("FAIL");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
JDBCUtilsWithProperties.release(rs, ps, conn);
}
}
}
public class JDBCUtilsWithProperties {
private static String driverClass;
private static String url;
private static String username;
private static String password;
private JDBCUtilsWithProperties(){}
static {
try {
readConfig();
Class.forName(driverClass);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void readConfig() {
Properties pp = new Properties();
try {
pp.load(new FileInputStream("src//config.properties"));
driverClass = pp.getProperty("driverClass");
url = pp.getProperty("url");
username = pp.getProperty("username");
password = pp.getProperty("password");
} catch (Exception e) {
// TODO: handle exception
}
}
public static Connection getConnection() {
try {
return DriverManager.getConnection(url,username,password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static Statement createStatement() {
Connection conn = getConnection();
Statement stat = null;
try {
stat = conn.createStatement();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stat;
}
public static void release(ResultSet rs,Statement stat,Connection conn){
if(rs != null) {
try {
rs.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
rs = null;
}
if(stat != null) {
try {
stat.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
stat = null;
}
if(conn != null) {
try {
conn.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
conn = null;
}
}
public static void release(Statement stat,Connection conn) {
if(stat != null){
try {
stat.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stat = null;
}
if(conn != null) {
try {
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}
}
运行时会显示通知:
"您的SQL语法出错了;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 靠近'?和密码=?'在第1行"
答案 0 :(得分:6)
如果使用预准备语句,则执行函数没有SQL查询作为参数:
String sql = "select * from users where username = ? and password = ?;";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery();
^^
另请参阅Statement
班级的documentation
布尔执行(String sql) 抛出SQLException
执行给定的SQL语句,该语句可能返回多个结果。 在某些(不常见的)情况下,可能会返回单个SQL语句 多个结果集和/或更新计数。通常你可以忽略 除非你是(1)执行你知道的存储过程 返回多个结果或(2)您正在动态执行 未知的SQL字符串。 execute方法执行SQL语句和 表示第一个结果的形式。然后,您必须使用这些方法 getResultSet或getUpdateCount来检索结果,和 getMoreResults移动到任何后续结果。
注意:无法在PreparedStatement上调用此方法 的CallableStatement。