簡體   English   中英

SQL查詢從數據庫的兩個表進行INNER JOIN

[英]SQL query to do INNER JOIN from two tables of a data base

我有兩個表:

  1. usuario(英語用戶):nombre,apellido,usuario,consensena,id_perfil
  2. perfil(英語配置文件):id_perfil,nombre

我在使用Java和MySQL的程序上進行了登錄,我想知道用戶輸入的用戶名和密碼是否正確,才能將其發送到另一個Jframe。

我對SQL查詢了解不多,但是,我在這里已盡力(我將用戶名和密碼直接傳遞給該函數):

public boolean login(String usuario, String contrasena) {
        Dato_login d_lgn = new Dato_login();
        boolean resultado = false;

        sSQL = "SELECT u.nombre, u.apellido, u.usuario, u.contrasena, u.id_perfil, p.nombre AS perfil_nombre FROM "
                + "usuario U INNER JOIN perfil P u.id_perfil = p.id "
                + "WHERE u.usuario='" + usuario + "' AND u.contrasena='" + contrasena + "'";

        // Java 7 try-with-resources
        try (PreparedStatement pstm = con.prepareStatement(sSQL);
             ResultSet rs = pstm.executeQuery(sSQL)) {

            while (rs.next()) {
                if (d_lgn.getContrasena().equals(contrasena)) {
                    resultado = true;
                } else {
                    resultado = false;
                }

                d_lgn.setPerfil(rs.getString("perfil_nombre"));
                d_lgn.setUsuario(rs.getString("usuario"));
                d_lgn.setNombre(rs.getString("nombre"));
                d_lgn.setApellido(rs.getString("apellido"));
                d_lgn.setContrasena(rs.getString("contrasena"));
            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "SQLException:\n" + e, "Error: login(String usuario, String contrasena)", JOptionPane.ERROR_MESSAGE);
            }

        return resultado;
    }

無法正常工作,它一直告訴我沒有任何用戶可以登錄。我需要更改什么?

我也想接收配置文件的名稱,而不是用戶的ID,我嘗試了INNER JOIN,但是我還不知道它如何正常工作。

表:

在此處輸入圖片說明

收到錯誤:

SQL語法錯誤

在這一部分:

sSQL = "SELECT u.nombre, u.apellido, u.usuario, u.contrasena, u.id_perfil FROM usuario U INNER JOIN perfil P ON p.nombre=u.nombre WHERE u.usuario='"
                + usuario + "' AND u.contrasena='" + contrasena + "'";

我看不到在哪里定義變量contrasenausario 應該是...AND u.usario='" + username + "' AND u.contrasena='" + password + "'";代替嗎(暫且暴露了SQL注入漏洞)。似乎懷疑您正在nombre上連接usarioperfil表。是不是用戶名與個人資料名相同?如果不更好地了解您的域和數據模型,我不能說真的。

如果您還想檢索配置文件名稱,則查詢可能是這樣的:

SELECT u.nombre, u.apellido, u.usuario, u.contrasena, p.nombre as perfil_nombre
  FROM usario u
  JOIN perfil p ON u.id_perfil = p.id_perfil
 WHERE u.usuario = ? and u.contrasena = ?

注意,我將在id列而不是nombre上加入usarioperfil 我認為您希望usario.perfil_idperfil.id_perfil列匹配。

代替con.createStatement()使用con.createPreparedStatement() 有關更多信息,請參見使用預准備語句

最后,要從ResultSet訪問perfil.nombre ,請執行以下操作: rs.getString("perfil_nombre");

另外,我返回的是perfil.nombre而不是usario.nombre因為您提到想要配置文件名稱而不是用戶名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM