Melhor forma de buscar um usuário no banco

Bom galera… andei tentando buscar algo pelo forum para responder minha pergunta e nao encontrei…

O esquema eh o seguinte… Eu tenho um banco de dados chamado Login.mdb onde ficarão todos os usuários e senhas para entrar no programa. Lá existem três tabelas separando os grupos para entrar com seus respectivos privilégios no programa: Servidor, Professor e Aluno…

No meu código eu faço o seguinte: quando o usuário clica no botão conectar (após digitar o usuário e a senha na tela de login) ele executa o seguinte código:

if (txtNome.getText().length() == 0 || pwdSenha.getPassword().length == 0) { JOptionPane.showMessageDialog(null,"Informe o usuário e a senha.","Atenção!",JOptionPane.ERROR_MESSAGE); } else { String grupo = ""; if (blServ.isSelected()) grupo = "Servidor"; else if (blProf.isSelected()) grupo = "Professor"; else if (blAluno.isSelected()) grupo = "Aluno"; Usuario user = new Usuario(txtNome.getText(),new String(pwdSenha.getPassword()), grupo); if (user.verificaUser(nome, senha, grupo)) { new Principal().setVisible(true); } else JOptionPane.showMessageDialog(null, "Usuário ou senha incorretos! Por favor informe novamente", "Não logou!", JOptionPane.ERROR_MESSAGE); }

ou seja ele cria uma nova instância da classe Usuario:

public Usuario(String tnome, String tsenha, String tgrupo) { nome = tnome; senha = tsenha; grupo = tgrupo; }

e testa pelo metodo verificaUser(…) da classe Usuario se o usuário pode entrar no programa.

A minha dúvida é como eu posso fazer este método… comecei fazendo assim:

public boolean verificaUser() throws SQLException, IOException{ System.out.println("Carregando o Driver JDBC/ODBC..."); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); System.out.println("Conectando-se ao banco de dados CAEP..."); con = DriverManager.getConnection("jdbc:odbc:caep","regina","caep"); Statement stmt = con.createStatement(); String sql = "SELECT * FROM " + grupo + " WHERE " + nome; ResultSet rs = stmt.executeQuery(sql); [b]...[/b] [b]...[/b] } catch (Exception e) { e.printStackTrace(); } DatabaseMetaData dmd = con.getMetaData(); System.out.println("Conectado a: "+ dmd.getURL()); System.out.println("Driver: "+ dmd.getDriverName()); System.out.println("Versão: "+ dmd.getDriverVersion()); [b]...[/b] [b]...[/b] }

E a minha intenção é procurar pelo nome e depois verificar se a senha bate com a que o usuário digitou…

Como posso fazer isso? e o comando SQL está correto?

desde já agradeço! vlw!

olha acho q seu select ta errado…

“select * from " + grupo+ " where nome=” + nome;

Duas dicas pra evitar problemas de segurança:

1- Ao invés de usar o nome da tabela direto no grupo, faça correlações. Exemplo:

String tabelaGrupo;
if( “Professor”.equals(grupo) ) tabelaGrupo = “tb_professor”;
else if( “Aluno”.equals(grupo) ) tabelaGrupo = “tb_aluno”;
else if( “SeiLaMaisOque”.equals(grupo) ) tabelaGrupo = “tb_seilamaisoque”;
else throw new Exception(“Grupo não existente”);

String sql = "select * from " + tabelaGrupo;

2- Use PreparedStatement na hora de fazer a query, isso evita que uma pessoa coloque código SQL no campo usuario e burle seu sistema. Isso é chamado de SQL Injection.

Ao invés de fazer String sql = "select * from " + grupo + " where usuario = " + usuario;

Faça: "select * from " + grupo + " where usuario = ? ";

E depois sete o usuário com o PreparedStatement

mas vem k… eh que eu tow aprendendo banco de dados por agora, mas como que faz pra pegar os resultados e achar o correto?

public boolean verificaUser() throws SQLException, IOException{ System.out.println("Carregando o Driver JDBC/ODBC..."); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); System.out.println("Conectando-se ao banco de dados CAEP..."); con = DriverManager.getConnection("jdbc:odbc:caep","regina","lcaep"); DatabaseMetaData dmd = con.getMetaData(); System.out.println("Conectado a: "+ dmd.getURL()); System.out.println("Driver: "+ dmd.getDriverName()); System.out.println("Versão: "+ dmd.getDriverVersion()); String sql = "SELECT * FROM " + tabGrupo + " WHERE Nome = ?"; PreparedStatement stmt = con.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); //O que eu faço a partir daqui para testar se o usuário está //habilitado a entrar no programa? } catch (Exception e) { e.printStackTrace(); } }

tem que usar o método next() da classe ResultSet? como que eu faço para achar o resultado e comparar com o nome que o usuário passou?

Primeiro:

O nome de usuário tem que ser único concorda?

Sendo assim, c o usuário entra no o login dele, primeiro vc tem que verificar se no banco existe um usuário com aquele nome de usuário

[code]
PreparedStarement stmt = con.prepareStatement(
"SELECT * FROM usuario WHERE nome = ? " );

stmt.setString( 1, usuario.getNome() );

ResultSet rs = stmt.executeQuery();

if ( rs.next() ) {
// encontrou o usuário
// verifica se a senha bate
if ( rs.getString( “colunaDaSenha” ).equals( usuario.getSenha() ) ) {
return true; // ok, usuário pode logar
}
return false; // senha não bate…
} else {
return false; // usuário não encontrado
}[/code]

Vc pode retornar uma constante numérica ou uma enumeração para saber o “estado” do login, ao invés de retornar um boolean que só possui dois estados.

Falow!