字段可以转换为局部变量

时间:2018-06-19 05:18:01

标签: java

我有这个错误:字段可以转换为局部变量。 对于 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.");
        }


    }

}

1 个答案:

答案 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.");
    }
}

我还整理了一下你的代码,以便于阅读。您不需要围绕列名称进行反引号,因为它们不是保留关键字(也不应该是保留关键字)。

注意:我不确定您的用户名和密码列是否真的是数字。更有可能的是,我希望至少用户名是某种文本。但是,这会导致您在问题中报告的错误以外的错误。