【问题标题】:Cannot connect wit the database table无法连接数据库表
【发布时间】:2021-06-24 17:15:46
【问题描述】:

我编写了一个登录页面程序来读取用户名和密码,它将检查用户名和密码是否与表中可用的匹配。

如果匹配它在 .showMessageDialog() 方法的帮助下显示消息登录成功,否则它应该显示错误输入。 我还为数据库连接创建了一个单独的连接类。 然后我创建了一个包含用户名和密码列的表,并相应地插入了行。 所以从逻辑上讲,当我输入正确的值时,它应该说登录成功,但它总是说输入错误。

注意:我在 Eclipse Sdk 和 Oracle 10g 上使用 Java 版本 1.8 并使用 jar 文件 ojdbc14 也分别尝试了 ojdbc14_g。在我的项目文件夹内的文件夹中添加了 ojdbc,并通过将其与 ojdbc14 链接创建了一个参考库在我的项目文件夹内的文件夹中。

这是登录页面窗口的代码


import demo.ConnectionClass;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;


import javax.swing.*;

import oracle.jdbc.driver.OraclePreparedStatement;
import oracle.jdbc.driver.OracleResultSet;

public class LoginPage extends JFrame implements ActionListener
{
    
    
    private static final long serialVersionUID = 1L;
    
    
    JTextField t1;
    JPasswordField t2;
    JLabel l1,l2;
    JButton b;
    
    Connection conn= null;
    OraclePreparedStatement pst= null;
    OracleResultSet rs= null;
    
    LoginPage()
    {   
        
        l1=new JLabel("UserName :");
        l1.setBounds(50,50,150,20);
        add(l1);

        t1=new JTextField();
        t1.setBounds(180,50,100,20);
        add(t1);
        

        l2=new JLabel("Password :");
        l2.setBounds(50,80,150,20);
        add(l2);        

        t2=new JPasswordField();
        t2.setBounds(180,80,100,20);
        add(t2);

        b=new JButton("Login");
        b.setBounds(100,120,100,20);
        b.addActionListener(this);
        add(b);

        setBounds(400,200,300,250);
        setLayout(null);
        setVisible(true);
        
    }
    
    public void actionPerformed(ActionEvent ae) 
    {
            conn= ConnectionClass.dbconnect();
            try
            {
            
                String str = "select * from hmsProject where Username = ? and Password = ?";
                pst=(OraclePreparedStatement)conn.prepareStatement(str);
                pst.setString(1, t1.getText());
                pst.setString(2, t2.getPassword().toString());
                rs=(OracleResultSet) pst.executeQuery();
                
                if(rs.next())
                {
                    JOptionPane.showMessageDialog(null, "Login Succesfull");
                    this.setVisible(false);
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Wrong input");
                    this.setVisible(false);
                    
                }
                
                rs.close();
                pst.close();
                
            }
            
            catch(Exception e)
            {
                e.printStackTrace();
            }
            
        
        
    }
    
    public static void main(String args[])
    {
        new LoginPage();
    }

}

这是连接类代码

package demo;
import java.sql.*;

import javax.swing.JOptionPane;

public class ConnectionClass 
{
    
    

    public static Connection dbconnect()
    {
        try
        {       
            
            Class.forName("oracle.jdbc.OracleDriver");
            Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","hr");
            
            return conn;
            
        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, e);
            return null;
        }
    }

    
    public static void main(String[] args) 
    {
        

    }

}

【问题讨论】:

  • 你检查过是否连接数据库成功了吗?
  • 虽然可能与您的问题无关,但请使用较新版本的 Oracle JDBC 驱动程序。 ojdbc14 表示它适用于 Java 1.4,这意味着驱动程序非常旧。
  • @GeromeTahud 我们如何检查?
  • @MarkRotteveel 什么版本的驱动最适合Java 1.8
  • 什么版本的驱动...?:见Oracle JDBC FAQ

标签: java eclipse jdbc ojdbc


【解决方案1】:

我认为问题出在这里:

                pst.setString(2, t2.getPassword().toString());

t2JPasswordFieldt2.getPassword() 返回 char[]。但是,在 char 数组上调用 .toString() 不会将数组转换为您期望的字符串。相反,它会给你类似[C@48f954eb 的东西,因为Java 数组不会覆盖.toString(),这就是继承自Object.toString() 方法将返回的内容。

要将char[] 数组转换为字符串,请改写new String(yourCharArray)

尝试将上面的行替换为以下内容:

                pst.setString(2, new String(t2.getPassword()));

最后(我知道如果我不提,人们会接受我的),但我猜这只是为了培训/学习目的。这不是针对其他人将投入生产使用的真实系统,是吗?如果您只是为自己的学习目的构建登录系统,则以纯文本形式处理密码是可以的,但在实际系统中,密码将(或至少应该!)被散列和加盐,生成的散列将被存储并在数据库中进行比较,而不是用户的实际密码。

【讨论】:

  • 非常感谢卢克。我一直在努力解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2012-12-06
  • 2013-12-14
  • 2012-10-29
  • 2013-02-22
相关资源
最近更新 更多