如何使用 Java 在 MySQL 表中仅搜索一条特定记录

Posted

技术标签:

【中文标题】如何使用 Java 在 MySQL 表中仅搜索一条特定记录【英文标题】:How to search for only one particular record in MySQL table using Java 【发布时间】:2019-03-16 06:16:06 【问题描述】:

我正在制作一个应用程序,我正在尝试使用存储在 mysql 服务器中的数据登录用户。 我遇到的问题是,当我尝试使用正确的用户名和密码登录时,我的代码实际上是在检查“adminData”表中的每条记录,并向我显示每条记录的相应结果! 我也附上我的代码,请看一下! 所以我想问我怎么只能搜索一个特定的记录,它只会让我恢复那个特定的记录! 请帮帮我.. :)

btnSubmit.addActionListener(new ActionListener()

    public void actionPerformed(ActionEvent e)
    
        String query = "SELECT username, password FROM adminData";
        String username = null;
        String password = null;
        ;
        try
        
            rs = st.executeQuery(query);
            String fieldWarning = "*all field are mandatory!";

            String enteredUsername = usernameField.getText();
            @SuppressWarnings("deprecation") String enteredPassword = passwordField.getText();

            usernameField.setCursor(null);
            fieldLabel.setText("");

            int userLen = enteredUsername.length();
            int passLen = enteredPassword.length();

            if (userLen != 0 && passLen != 0)
            
                if (userLen <= 32 && passLen <= 32)
                
                    while (rs.next())
                    
                        username = rs.getString("username");
                        password = rs.getString("password");
                        if (enteredUsername.equals(username))
                        
                            if (enteredPassword.contentEquals(password))
                            
                                AdminDashboard frame = new AdminDashboard();
                                frame.setVisible(true);
                                frame.dispose();
                            
                            else
                            
                                JOptionPane.showMessageDialog(null, "Password Missmatch");
                            

                        
                        else
                        
                            JOptionPane.showMessageDialog(null, "Invalid User");
                            passwordField.setText("");
                            usernameField.setText("");
                            usernameField.setCursor(null);

                        
                    
                
                else
                
                    JOptionPane.showMessageDialog(null,
                        "Please enter a valid username or password! \n(Note: Only 32 char MAX)");
                    passwordField.setText("");
                    usernameField.setText("");
                
            
            else
            
                fieldLabel.setText(fieldWarning);
                usernameField.setCursor(null);
            
        
        catch (SQLException e1)
        
            JOptionPane.showMessageDialog(null, "Database Error: " + e1);
        
    
);

【问题讨论】:

你的表中的主键是什么? 主要是“id”,它是自动递增的,我已经使“用户名”属性唯一 String query = "SELECT username, password FROM adminData WHERE id = '" + id +"'"; 用户名= rs.getString("用户名");密码= rs.getString("密码");将这些字段从 while 循环中取出。 问题太多,无法给出答案。对于初学者,请不要将用户密码以明文形式存储在数据库表中。 【参考方案1】:

这是因为您的查询会返回整个表格。如果您有用户名,您可以简单地调整查询以仅返回包含该特定用户详细信息的行,而不是所有用户。 因此,只需在查询之前分配输入的用户名,并将用户名条件添加到您的 sql 查询中。

btnSubmit.addActionListener(new ActionListener()
    
public void actionPerformed(ActionEvent e)

    String enteredUsername = usernameField.getText();
    String query = "SELECT username, password FROM adminData WHERE username='"+enteredUsername+"'";
    String username = null;
    String password = null;
    ;
    try
    
        rs = st.executeQuery(query);
        String fieldWarning = "*all field are mandatory!";

        @SuppressWarnings("deprecation") String enteredPassword = passwordField.getText();

        usernameField.setCursor(null);
        fieldLabel.setText("");

        int userLen = enteredUsername.length();
        int passLen = enteredPassword.length();

        if (userLen != 0 && passLen != 0)
        
            if (userLen <= 32 && passLen <= 32)
            
                while (rs.next())
                
                    username = rs.getString("username");
                    password = rs.getString("password");
                    if (enteredUsername.equals(username))
                    
                        if (enteredPassword.contentEquals(password))
                        
                            AdminDashboard frame = new AdminDashboard();
                            frame.setVisible(true);
                            frame.dispose();
                        
                        else
                        
                            JOptionPane.showMessageDialog(null, "Password Missmatch");
                        

                    
                    else
                    
                        JOptionPane.showMessageDialog(null, "Invalid User");
                        passwordField.setText("");
                        usernameField.setText("");
                        usernameField.setCursor(null);

                    
                
            
            else
            
                JOptionPane.showMessageDialog(null,
                    "Please enter a valid username or password! \n(Note: Only 32 char MAX)");
                passwordField.setText("");
                usernameField.setText("");
            
        
        else
        
            fieldLabel.setText(fieldWarning);
            usernameField.setCursor(null);
        
    
    catch (SQLException e1)
    
        JOptionPane.showMessageDialog(null, "Database Error: " + e1);
    

    );

现在,只要您的用户名是唯一的,它就会始终返回一条记录。

【讨论】:

不要这样做:String query = "SELECT username, password FROM adminData WHERE username='"+enteredUsername+"'"; 此代码受 SQL 注入影响,请改用带参数的PreparedStatement 你有什么建议? String query = "SELECT username, password FROM adminData WHERE username=?"; ... connection.prepareStatement(query).setString(1, 输入用户名).execute() @a.yekimov 使用准备好的语句是正确的方法,但 JDBC API 不允许以这种方式链接方法。 别忘了关闭结果集:)

以上是关于如何使用 Java 在 MySQL 表中仅搜索一条特定记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 的 DATETIME 字段中仅选择日期?

如何从mysql数据库表中仅获取php数组的匹配项[重复]

如何从多次包含此值的表中仅获取 1 个结果?

MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果

如何在结果表中仅显示选定的记录

在MySQL中仅选择偶数/奇数行[重复]