java - 如何使用三层架构和 SQL 服务器创建登录表单?
问题描述
我必须用 Java 做一个登录表单,使用三层架构和一个数据库,我使用的是 SQL Server。
在我的 DA 类中,我有以下代码:基本上我要做的是将 jText 用户和 jText 密码发送到 BL 类中的 setPassword 和 setUser。
u.setLogin(jtxtUsuario.getText());
u.setContrasenia(jtxtPassword.getText());
DA.DB.getConexion();
if (DA.DB.getStatus()) {
new jfrmInterno().setVisible(true);
}else {
JOptionPane.showMessageDialog(null, "El nombre de usuario ingresado no coincide con ninguna cuenta","",JOptionPane.ERROR_MESSAGE);
jtxtUsuario.setText("");
jtxtPassword.setText("");
}
在我的 BL 类中,我有以下代码: 在方法“validarUsuario”中,我发送用户并传递给 DA 类中的“setUsuario”方法。
public void setLogin(String login) {
if(login != null && login.length() > 3) {
_login = login;
}else {
_login = "Usuario Incorrecto";
}
}
public String getLogin() {
return _login;
}
public void setContrasenia(String contrasenia) {
if(contrasenia != null && contrasenia.length() > 6) {
_contrasenia = contrasenia;
}else {
_contrasenia = "Contraseña Incorrecta";
}
}
public String getContrasenia() {
return _contrasenia;
}
public void validarUsuario() {
admin.setUsuario(getLogin(), getContrasenia());
}
public Colegio() {
this("","");
}
public Colegio(String login, String contrasenia) {
setLogin(login);
setContrasenia(contrasenia);
}
}
我遇到的问题是在 DA 类中,我不知道如何使用 jText 用户和密码并根据我在 DA 类中的 DB 中的用户和密码来验证它。我在 DA 类中创建了一个名为“setUsuario”的方法,它从 jText 接收用户和密码,但之后我不知道我还能做什么,我的想法是如果用户和密码正确,它应该打开一个新的 Jframe .
public static Connection getConexion() {
status = false;
String url = "jdbc:sqlserver://localhost:1433;databaseName=Colegio";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch (ClassNotFoundException e) {
System.out.println("No se pudo establecer conexión");
}
try {
cn = DriverManager.getConnection(url);
PreparedStatement ps = cn.prepareStatement("SELECT * FROM [dbo].[Login] where NombreUsuario=? AND Contrasenia=?");
ps.setString(1, user);
ps.setString(2, pass);
ResultSet rs = ps.executeQuery();
status = true;
}catch (SQLException e) {
}
return cn;
}
public void setUsuario(String user, String pass) {
DB.user = user;
DB.pass = pass;
}
解决方案
在您的 DA 类中,您必须像这样检查数据库中是否存在记录,
public static boolean getConexion() { // change it to boolean because it returns boolean value
status = false;
String url = "jdbc:sqlserver://localhost:1433;databaseName=Colegio";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
System.out.println("No se pudo establecer conexión");
}
try {
cn = DriverManager.getConnection(url);
PreparedStatement ps = cn.prepareStatement("SELECT * FROM [dbo].[Login] where NombreUsuario=? AND Contrasenia=?");
ps.setString(1, user);
ps.setString(2, pass);
ResultSet rs = ps.executeQuery();
if (rs.next) {
status = true;
}
} catch (SQLException e) {
}
return status;
}
public void setUsuario(String user, String pass) {
DB.user = user;
DB.pass = pass;
}
在您看来,您可以将值传递给setUsuario()
方法,然后调用如果用户存在getConexion()
则返回的方法,true
如下所示,
DA.DB.setUsuario(jtxtUsuario.getText(), jtxtPassword.getText());
if (DA.DB.getConexion()) {
new jfrmInterno().setVisible(true);
} else {
JOptionPane.showMessageDialog(null, "El nombre de usuario ingresado no coincide con ninguna cuenta","",JOptionPane.ERROR_MESSAGE);
jtxtUsuario.setText("");
jtxtPassword.setText("");
}
而且我看不到该DA.DB.getStatus()
方法,因此我在该getConexion()
方法中进行了编码以显示您缺少的内容,这不是在数据库连接中编码的好习惯,它应该在一个单独的类中。
推荐阅读
- python - Python字典 - 在下一行中查找键
- javascript - 使用 CellMeasurer 反应虚拟化表未正确计算高度
- c++ - 如何创建用于 OpenSSL 的公钥/私钥对
- ldap - WSO2 身份服务器在管理控制台中看不到用户
- android - Firebase 插件错误混合版本可能导致运行时崩溃
- javascript - AngularJs - $http.get() 中的 Array.push() 会产生一个有缺陷的数组
- javascript - 如何重构三个异步加载和显示数据的组件合二为一?
- java - 我可以使用 Java 从另一个窗口读取文本吗?
- java - 有没有办法为 java Swing 应用程序设置默认鼠标光标图像?
- angular - 'new FormControl',对于反应形式是强制性的 - Angular