Dúvidas em trechos de códigos

Bom dia.
Estou lendo a aspotila da Caelum e esotu com 2 dúvidas.

PreparedStatement stmt = connection .prepareStatement("select * from funcionarios where usuario=? and senha=?"); stmt.setString(1, funcionario.getUsuario()); stmt.setString(2, funcionario.getSenha()); ResultSet rs = stmt.executeQuery(); try { // se nao existir nenhum funcionario, da erro if (!rs.next()) { return false; } // false se existe mais de um funcionario com esse usuario e senha return !rs.next();

if (!new FuncionarioDAO().existeUnico(funcionario))

Porque se eu executar o código acima, sempre irá retornar false ?
Mesmo passando usuário e senha que está cadastrado no banco.

Porque se o codigo !rs.next() der true ele entra no if e retorna false.
Tira o if e manda retornar rs.next() que deve dar certo.
Falou!

De acordo com a lógica deste método o retorno será false sempre.

Se nao existir nenhum funcionario o retorno será false [linha 8]. Se houver um ou mais funcionarios o retorno será false tb [linha 12].

leosrbrasil, fiz o que você me sugeriu e continua dando false, tanto para usuários cadastrados no banco como para os que não possuem cadastro.

Em qual momento que dará true ?

qndo houver somente um único funcionário com o usuário e senha informados.

mais uma dúvida, ele vai comparar o usuario e a senha digitada com o que tem no banco?
Se existir, ele irá retornar false, e entrará no erro?
Se não existir no banco dará é entrar em ok ou dará erro também?
Não estou entendo as comparações que estão sendo feito.

mais uma dúvida, ele vai comparar o usuario e a senha digitada com o que tem no banco?
Se existir, ele irá retornar false, e entrará no erro?
Se não existir no banco dará é entrar em ok ou dará erro também?
Não estou entendo as comparações que estão sendo feito.

Ele compara o usuário e senha digitados com as informações do banco. Se não existir nenhum funcionário com o usuário e senha digitados, o método é finalizado e retorna false [linhas 8 a 10]. Se existir um único funcionário com o usuário e senha digitados, o último !rs.next [linha 12] retorna true. Caso existam outros funcionários com o usuário e senha digitados, o último !rs.next [linha 12] retorna false.

O problema que eu cadastrei 2 pessoas no bd, nomes, usuario e senhas diferentes, e mesmo assim quando entro com um desses nome ou com qualquer coisa, até mesmo usuario e senha em branco, ele entra no if e retorna false.
Não sei onde está o erro pra ele não entrar no if e retornar true.

Seu return deveria ser somente:

try { // se nao existir nenhum funcionario, da erro //se existir, retorna true. return rs.next(); }

O problema é que a cada vez que você chama o next(), ele avança para o próximo registro. Se vc tiver um login válido, vai retornar apenas um único registro. A primeira chamada ao next() dentro do if, retorna true e avança para após esse registro. Então, a segunda chamada, fora, retorna false.

Melhor que o método existeUnico, seria se esse método chamasse “Já existe”. O BD deve proteger naturalmente contra a inserção de dois registros idênticos.

Então ViniGodoy,
Se o usuário e a senha digitada existir no bd, ele retorna true e entra no sistema.
Se digitar um usuário que não esteja no bd, retorna false e redireciona pra página de login novamente.
Seria isso ?

ao invés de .next() usa .first(), que retorna true e move o cursor para o primeiro registro se houver um e false se o ResulSet estiver vazio.

[quote=santos.fernando]Então ViniGodoy,
Se o usuário e a senha digitada existir no bd, ele retorna true e entra no sistema.
Se digitar um usuário que não esteja no bd, retorna false e redireciona pra página de login novamente.
Seria isso ?[/quote]

Sim, é isso mesmo.

O first() só pode ser executado em resultsets do tipo “scrollable”. Por padrão, o Java usa resultsets do tipo “forward only” que, além de mais rápidos, estão disponíveis num número maior de bancos de dados. Para criar um resultset scrollable, é necessário passar parâmetros adicionais na hora de se criar um statement:

Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);