正如JB Nizet所解释的那样,在你的代码中有一些改变。尝试下面的代码(它为我工作)。
public class LoginLogic {
LoginUI lu;
public LoginLogic() {
lu = new LoginUI();
}
public LoginLogic(ResultSet rs) {
lu = new LoginUI();
process(rs);
}
private void process(ResultSet rs) {
try {
if (rs.next()) {
lu.loginSuccess();
} else {
lu.loginFailed();
}
} catch (SQLException e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
/*/ Here you shld get your result rs first
con is your Connection object
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT yourColumn FROM yourTable");
//*/
new LoginLogic(rs);
}
}
EDITED
根据我们的意见,问题是,你正在创建你的一个新的对象:
private void getConn(String uname, String pwd) {
...
// 4. Process the result set
new LoginLogic(rs);
...
}
这意味着你是不是调用合适的对象你的if()语句。你的新对象是用参数化构造函数构造的,它不初始化lu或更新它。
EDITED2
我认为你必须改变一点点你的设计。我认为以下内容适用于您,但您必须处理例外情况。
public class LoginLogic {
LoginUI lu;
public LoginLogic() {
lu = new LoginUI();
}
public void process() {
try {
if (lu.getRs().next()) {
lu.loginSuccess();
} else {
lu.loginFailed();
}
} catch (SQLException e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
LoginLogic loginLogic = new LoginLogic();
loginLogic.process();
}
}
的loginUI将变更为:
public class LoginUI {
...
ResultSet rs;
public ResultSet getRs() {
return rs;
}
...
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String uname = tfUname.getText().trim();
String pwd = tfPwd.getText().trim();
LoginDbConn loginDbConn = new LoginDbConn(uname, pwd);// startDB after user presses
rs = loginDbConn.getConn();
} catch (Exception ex) {
// TODO: handle exception
}
}
});
....
}
而且LoginDbConn这样:
public class LoginDbConn {
String uname;
String pwd;
ResultSet rs;
/*
* public LoginDbConn() { // TODO Auto-generated constructor stub }
*/
public LoginDbConn(String uname, String pwd) {
this.uname = uname;
this.pwd = pwd;
}
public ResultSet getConn() {
try {
// 0. Register the JDBC drivers
String driverClass = "oracle.jdbc.driver.OracleDriver";
Class.forName(driverClass);
// or DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
// 1. Get a connection to the Database
String dbUrl = "jdbc:oracle:thin:@localhost:1521:xe";
String dbuname = "scott";
String dbpwd = "tiger";
Connection conn = DriverManager.getConnection(dbUrl, dbuname, dbpwd);
// 2. Create a statement
// String sql = "SELECT * FROM users WHERE name = '"+uname+"' and
// password = '"+pwd+"'";
// Statement st = conn.createStatement();
String sql = "select * from users where name = ? and password = ?";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, uname);
pst.setString(2, pwd);
// 3. Execute SQL query
rs = pst.executeQuery();
// 5. Close Connection
// conn.close();
return rs;
} catch (SQLException | ClassNotFoundException e) {
// THIS EXCEPTION MUST ABSOLUTELY BE HANDLED
}
return rs;
}
}
希望这将有助于(如果有的话,请投票给答案)。
你的方式看起来好像没什么问题。你尝试使用调试器吗?你也应该为TODO做些什么,也许有'SQLException',你不会看到它,因为TODO –
你有两个构造函数,但你只调用第一个(没有参数)。你如何调用'LoginLogic(ResultSet rs)'? –
我已经通过现在链接到整个代码更新了问题,应该消除关于调用的混淆。 –