我有这个错误:字段可以转换为局部变量。 对于 preparedStatement
package game;
import java.sql.*;
public class db {
private Connection connection;
private PreparedStatement preparedStatement;
public db() throws SQLException,ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/riverraider";
String user = "root";
String pass = "146155";
connection = DriverManager.getConnection(url,user,pass);
}
public String select(String username, String password) throws Exception
{
preparedStatement = connection.prepareStatement("SELECT * FROM `user` WHERE `username`=? AND `password`=? ");
preparedStatement.setLong(1, Long.parseLong(username));
preparedStatement.setLong(1, Long.parseLong(password));
ResultSet result = preparedStatement.executeQuery();
while (result.next()!=false){
System.out.println("Username or password is incorrect.");
}
}
}
答案 0 :(得分:2)
最有可能的是,错误/警告只是源于您将变量preparedStatement
声明为类级别变量,而它只能是select()
方法的本地变量,具有相同的效果。尝试从类级别删除该声明,而是使用此版本的select()
:
public String select(String username, String password) throws Exception {
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setLong(1, Long.parseLong(username));
ps.setLong(1, Long.parseLong(password));
ResultSet result = ps.executeQuery();
while (result.next() != false) {
System.out.println("Username or password is incorrect.");
}
}
我还整理了一下你的代码,以便于阅读。您不需要围绕列名称进行反引号,因为它们不是保留关键字(也不应该是保留关键字)。
注意:我不确定您的用户名和密码列是否真的是数字。更有可能的是,我希望至少用户名是某种文本。但是,这会导致您在问题中报告的错误以外的错误。