Java JDBC:我需要您对使用SQL和JDBC登录代码的意见

Java JDBC:我需要您对使用SQL和JDBC登录代码的意见,java,sql,jdbc,resultset,Java,Sql,Jdbc,Resultset,这是我正在创建的一段代码,帮助用户登录到我的应用程序中,方法login获取两个参数username和password 我希望通过向用户发送的错误消息指定我,因此: 如果表中不存在电子邮件,则显示“电子邮件未注册” 如果电子邮件存在且密码不正确,则显示“密码不正确” 我的代码有效吗?我需要你的意见。我需要改进/改变什么 方法是这样的 private String command; private ResultSet resultSet; private PreparedStatement

这是我正在创建的一段代码,帮助用户登录到我的应用程序中,方法login获取两个参数username和password

我希望通过向用户发送的错误消息指定我,因此:

  • 如果表中不存在电子邮件,则显示“电子邮件未注册”
  • 如果电子邮件存在且密码不正确,则显示“密码不正确”
  • 我的代码有效吗?我需要你的意见。我需要改进/改变什么

    方法是这样的

        private String command;
    
    private ResultSet resultSet;
    private PreparedStatement statement;
    private Connection connection;
    
    String jdbcUrl = "jdbc:mysql://localhost:3306/registered";
    String jdbcUser = "...";
    String jdbcPassword = "...";
    
    public boolean login(String eml, String pwd) {
    
        try {
    
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(jdbcUrl, jdbcUser,
                    jdbcPassword);
    
            command = "SELECT Email FROM users WHERE Email LIKE '" + eml + "';";
            statement = connection.prepareStatement(command);
            resultSet = statement.executeQuery();
    
            if (!resultSet.isBeforeFirst()) {
                System.out.println("Email (" + eml + ") is not registered ! ");
    
                // show error message
            } else {
                command = "SELECT Email,Password FROM users WHERE Email LIKE '"
                        + eml + "' AND Password LIKE '" + pwd + "';";
                statement = connection.prepareStatement(command);
                resultSet = statement.executeQuery();
    
                if (!resultSet.isBeforeFirst()) {
                    System.out.println("Password for Email (" + eml
                            + ") is incorrect ! ");
    
                    // show error message
                }
                else {
                    System.out.println("Logged in!");
                }
    
            }
    
        } catch (SQLException e) {
            System.out.println("SQLException: " + e.getMessage());
            System.out.println("Vendor error: " + e.getErrorCode());
    
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    
        return false;
    }
    
    我的代码有效吗

    不,它不是。此方法性能中的主要问题是您在此处手动打开连接:

    Class.forName("com.mysql.jdbc.Driver");
    connection = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
    
    这是一个瓶颈,因为您将打开并关闭与数据库的物理连接,这是一个高成本的操作。应将其替换为,并从中检索连接。实现数据库连接池的一些选项:

    更多信息:

    我需要改进/改变什么

    除了获取连接的方式外,当前代码还容易出现以下错误,因为您连接字符串以生成SQL语句:

    command = "SELECT Email FROM users WHERE Email LIKE '" + eml + "';";
    
    相应地使用
    PreparedStatement
    ,并设置参数:

    command = "SELECT Email FROM users WHERE Email = ?";
    statement = connection.prepareStatement(command);
    statement.setString(1, eml);
    resultSet = statement.executeQuery();
    


    这不是你的代码的问题,而是你的设计的问题。用户的密码应仅在数据库上加密和验证。看起来您将密码存储为纯文本,这是一个用于学习目的的有效选项,但不用于实际应用程序。

    要给出值,您可能应该使用setString()。。。这更合适。请记住您的用户密码。
    EMAIL-LIKE?
    PASSWORD-LIKE?
    在登录时使用LIKE真的很好吗?我可以想象一些新的正则表达式注入类。@ElliottFrisch一个像样的JDBC驱动程序将转义任何无效字符,并在
    中使用的参数后面加引号,比如
    操作符。