无法连接数据库 table
Cannot connect wit the database table
我写了一个登录页面程序来读取用户名和密码,它将检查用户名和密码是否与 Table 中可用的匹配。
如果它匹配它显示消息 Login successful with help of .showMessageDialog() method,否则它应该显示 Wrong input。
我还为数据库连接创建了一个单独的 Connection Class。
然后我创建了一个 table,其中包含用于用户名和密码的列,并相应地插入了行。
所以从逻辑上讲,当我输入正确的值时,它应该说登录成功,但它总是说输入错误。
注意:我在 Eclipse Sdk 和 Oracle 10g 上使用 Java 版本 1.8 作为数据库,并使用 jar 文件 ojdbc14 也尝试 ojdbc14_g separately.Added 我项目中文件夹中的 ojdbc文件夹并通过将其与我的项目文件夹内的文件夹中的 ojdbc14 链接来创建参考库。
这是登录页面的代码window
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();
}
}
这是连接 class 代码
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)
{
}
}
我估计问题出在这里:
pst.setString(2, t2.getPassword().toString());
t2
是 JPasswordField
,t2.getPassword()
return 是 char[]
。但是,在 char
数组上调用 .toString()
不会将数组转换为您期望的字符串。相反,它会给你类似 [C@48f954eb
的东西,因为 Java 数组不会覆盖 .toString()
,这就是从 Object
继承的 .toString()
方法的作用return.
要将 char[]
数组转换为字符串,请改写 new String(yourCharArray)
。
尝试用以下内容替换上面的行:
pst.setString(2, new String(t2.getPassword()));
最后(我知道如果我不提它,人们会注意到我),但我猜这只是为了 training/learning 目的。这不是一个将被其他人投入生产使用的真实系统,是吗?如果您只是为了自己的学习目的构建一个登录系统,那么以纯文本形式处理密码是可以的,但在实际系统中,密码将(或至少应该!)被散列和加盐,生成的散列将是存储的内容在数据库中进行比较,不是用户的实际密码。
我写了一个登录页面程序来读取用户名和密码,它将检查用户名和密码是否与 Table 中可用的匹配。
如果它匹配它显示消息 Login successful with help of .showMessageDialog() method,否则它应该显示 Wrong input。 我还为数据库连接创建了一个单独的 Connection Class。 然后我创建了一个 table,其中包含用于用户名和密码的列,并相应地插入了行。 所以从逻辑上讲,当我输入正确的值时,它应该说登录成功,但它总是说输入错误。
注意:我在 Eclipse Sdk 和 Oracle 10g 上使用 Java 版本 1.8 作为数据库,并使用 jar 文件 ojdbc14 也尝试 ojdbc14_g separately.Added 我项目中文件夹中的 ojdbc文件夹并通过将其与我的项目文件夹内的文件夹中的 ojdbc14 链接来创建参考库。
这是登录页面的代码window
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();
}
}
这是连接 class 代码
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)
{
}
}
我估计问题出在这里:
pst.setString(2, t2.getPassword().toString());
t2
是 JPasswordField
,t2.getPassword()
return 是 char[]
。但是,在 char
数组上调用 .toString()
不会将数组转换为您期望的字符串。相反,它会给你类似 [C@48f954eb
的东西,因为 Java 数组不会覆盖 .toString()
,这就是从 Object
继承的 .toString()
方法的作用return.
要将 char[]
数组转换为字符串,请改写 new String(yourCharArray)
。
尝试用以下内容替换上面的行:
pst.setString(2, new String(t2.getPassword()));
最后(我知道如果我不提它,人们会注意到我),但我猜这只是为了 training/learning 目的。这不是一个将被其他人投入生产使用的真实系统,是吗?如果您只是为了自己的学习目的构建一个登录系统,那么以纯文本形式处理密码是可以的,但在实际系统中,密码将(或至少应该!)被散列和加盐,生成的散列将是存储的内容在数据库中进行比较,不是用户的实际密码。