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

标签 java sql jdbc resultset

这是我创建的代码,帮助用户登录我的应用程序,方法登录获取两个参数用户名和密码。

我想向用户指定我的错误消息,所以:

  1. 如果表格中不存在该电子邮件,则会显示“电子邮件未注册”
  2. 如果电子邮件存在且密码不正确,则会显示“密码错误”

我的代码高效吗?我需要你的意见。我需要改进\改变什么?

方法如下

    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;
}

最佳答案

Is my code efficient?

不,不是。该方法性能的主要问题是您在这里手动打开连接:

Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);

这是一个瓶颈,因为您将打开到数据库的物理连接并关闭它,这是一个高成本的操作。这应该替换为 database connection pool并从那里检索连接。实现数据库连接池的一些选项:

更多信息:

What do I need to improve\change?

除了获取连接的方式之外,当前代码很容易出现 SQL Injection因为您连接字符串来生成 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();
<小时/>

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

关于java - JDBC:我需要您对使用 SQL 和 JDBC 登录代码的意见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24338203/

相关文章:

java - Android:如何在android中下载文件?

java - 开发 JDBC 驱动程序

java.lang.IllegalArgumentException : Illegal character in query at index 59 异常

java - 如何在eclipse中更改@author标签配置,使其采用我指定的名称?

php - 从 SQL 查询中选择要加入的表名

sql - 复合外键 - 在 Oracle 中可能吗?

mysql - 从到达和离开日期选择未预订的房间

java - 以编程方式启动 H2 数据库

java - 如何检查连接是否已使用 isValid(0) 打开

java - 如何通过 Java (JMagick) 在 ImageMagick 中使用大量参数?