gpt4 book ai didi

java - 从数据库的两个表执行 INNER JOIN 的 SQL 查询

转载 作者:行者123 更新时间:2023-11-30 22:08:19 24 4
gpt4 key购买 nike

我有两个表:

  1. usuario(英文用户名):nombre、apellido、usuario、contrasena、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,但我还不明白它是如何正确工作的。

表:

enter image description here

收到错误:

Error in SQL Syntax

最佳答案

这部分:

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 注入(inject)漏洞)。此外,您似乎怀疑您正在 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 列上加入 usarioperfil 而不是 nombre。我认为您希望 usario.perfil_idperfil.id_perfil 列匹配。

使用 con.createPreparedStatement() 代替 con.createStatement()。参见 Using Prepared Statements有关这方面的更多信息。

最后,要从 ResultSet 访问 perfil.nombre,请执行以下操作:rs.getString("perfil_nombre");

此外,我返回 perfil.nombre 而不是 usario.nombre 因为你提到你想要配置文件名称而不是用户名。

关于java - 从数据库的两个表执行 INNER JOIN 的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com