首页 > 解决方案 > 如何使用三层架构和 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;
}

标签: javasqlnetbeans

解决方案


在您的 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()方法中进行了编码以显示您缺少的内容,这不是在数据库连接中编码的好习惯,它应该在一个单独的类中。


推荐阅读