SQL + Java [RESOLVIDO]

32 respostas
ricardocomp

Olá pessoal,
Boa noite a todos. :smiley:
alguém poderia me dizer
como eu faço para pegar o
idUsuario que é uma chave
estrangeira da tabela usuario_sistema?

String sql = "INSERT INTO tecnico(idUsuario, nome, telefone, celular, email)"
                    + "VALUES(?,?,?,?,?)";

 ps = conn.prepareStatement(sql);
            //ps.???
            ps.setString(2, tecnico.getNome());
            ps.setString(3, tecnico.getTelefone());
            ps.setString(4, tecnico.getCelular());
            ps.setString(5, tecnico.getEmail());
            ps.executeUpdate();

[]'s.

32 Respostas

ctdaa

Se o código está na outra tabela (tabela usuario_sistema) voce tem que fazer um select antes do insert para obter o campo…

ricardocomp

Jóia ctdaa?
é justamente isso que eu estou precisando
fazer, mas eu sei um pouco de SQL e não
estou sabendo fazer essa consulta será
que vc ctdaa ou alguém poderia me dar
uma ajuda? :wink:

[]'s.

ricardocomp

Eu estou tentando fazer algo deste tipo:

SELECT idUsuario FROM usuario_sistema WHERE nome="Jean Carlos";

Mas o problema é que o nome é da tabela tecnico e não da tabela usuario_sistema.

[]'s.

ctdaa

É um protocolo de boas práticas do fórum ensinar a pescar ao invés de dar o peixe… por isso vou dar umas dicas sem escrever o comando pronto… OK?
assim: do mesmo jeito que você preparou o insert:

# String sql = "INSERT INTO tecnico(idUsuario, nome, telefone, celular, email)"  
#                     + "VALUES(?,?,?,?,?)";  
#   
# ps = conn.prepareStatement(sql);
Na String sql você vai colocar o comando select, mais ou menos assim:

select codigo from usuario_sistema where id=?

o critério de pesquisa você deve saber  coloquei um exemplo.

depois vai usar o mesmo ps = conn.prepareStatement(sql);

e o ps.setString(1, valor_pesquisa);

depois o ps.execute vai te retornar um resultset de onde voce pega o resultado da pesquisa… o codigo que voce precisa.
É fácil… voce deve encontrar vários exemplos por ai.
(Nao sei se estou respondendo muito básico para a sua pergunta… mas como a pergunta foi básica também…)
OK?

ctdaa

Agora está me confundindo.
Você que inserir um técnico novo, certo? o id do técnico esta na tabela do usuario_sistema, já existe lá ou voce vai criar também o registro na tabela usuario_sistema?

Guinter

OPa!! cara vc deve fazer um join com a tabela tecnico pra referenciar o nome que esta da tabela tecnico

edmarr

Primeiramente , procure uma IDE para o Banco de Dados que vc utilize e execulte os codigos la primeiramente ,
o sql para pegar o nome tem q ser por Like pq vc nao tem previsao tipo assim .

Mas deste jeito vc nao tem precisao , tem que pegar algo que seja unico

select id_usuario from usuario_sistema 
where upper(nome) like "JOAO JOSE%"

Um exemplo de unico eh vc pegar uma chave unica uma PrimaryKey , Uniquekey e talz …
Bom Estudo

thiago_spdvr

deve ser tomados alguns cuidados com a forma como vai ser feita esta pesquisa, pois o resultado da consulta pode te retornar mais de um valor, no caso da falta de precisão citada acima pelo edmarr.

ricardocomp

olá pessoal seguindo o conselho de todos
vc’s eu consegui chegar até aqui:

String id = "SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;";
            
            String sql = "INSERT INTO tecnico(idUsuario, nome, telefone, celular, email)"
                    + "VALUES(?,?,?,?,?)";

            ps = conn.prepareStatement(sql);
            
            ps.setString(1, tecnico.getNome());
            
            int idUsuario = Integer.parseInt(id);
            ps.setInt(2, idUsuario);
            ps.setString(3, tecnico.getNome());
            ps.setString(4, tecnico.getTelefone());
            ps.setString(5, tecnico.getCelular());
            ps.setString(6, tecnico.getEmail());
            ps.executeUpdate();

Só que agora está aparecendo a seguinte
mensagem:

01/10/2009 13:23:01 teste.TesteGeral main
SEVERE: null
exception.LAFQADaoException: Erro ao inserir dadosjava.lang.NumberFormatException: For input string: "SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;"
        at dao.TecnicoDao.salvarTecnico(TecnicoDao.java:59)
        at teste.TesteGeral.main(TesteGeral.java:46)

Será que alguém poderia me dar uma ajuda?
O que eu fiz de errado?

[]'s.

ricardocomp

Na consulta eu preciso passar um nome de um técnico
e retornar o idUsuario daquele Técnico.

[]'s.

P

Não sei como seria em java, mas farei tipo delphi e ai vc refaz pra java:

“SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=:pnome”;
se fosse delphi, eu pegaria esse parametro(pnome) e carregaria com o valor que um certa variável estaria entrando. Logo, você pode substituir o parametro pnome pela variável. Em java, não sei como funciona, pois estou aprendendo também, mas o conceito vale pra qualquer linguagem, pois isso é SQL ANSI puro.

edmarr

Cara vc tem q fazer o seguinteeeeeeeee primierooooooo

Primeiramente , procure uma IDE para o Banco de Dados que vc utilize e execulte os codigos la primeiramente .

APos ito eh simples eh so passar para o Codigo .

lina
ricardocomp:
olá pessoal seguindo o conselho de todos vc's eu consegui chegar até aqui:
String id = "SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;";
            
            String sql = "INSERT INTO tecnico(idUsuario, nome, telefone, celular, email)"
                    + "VALUES(?,?,?,?,?)";

            ps = conn.prepareStatement(sql);
            
            ps.setString(1, tecnico.getNome());
            
            int idUsuario = Integer.parseInt(id);
            ps.setInt(2, idUsuario);
            ps.setString(3, tecnico.getNome());
            ps.setString(4, tecnico.getTelefone());
            ps.setString(5, tecnico.getCelular());
            ps.setString(6, tecnico.getEmail());
            ps.executeUpdate();

Só que agora está aparecendo a seguinte
mensagem:

01/10/2009 13:23:01 teste.TesteGeral main
SEVERE: null
exception.LAFQADaoException: Erro ao inserir dadosjava.lang.NumberFormatException: For input string: "SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;"
        at dao.TecnicoDao.salvarTecnico(TecnicoDao.java:59)
        at teste.TesteGeral.main(TesteGeral.java:46)

Será que alguém poderia me dar uma ajuda?
O que eu fiz de errado?

[]'s.

Oi,

Claro... olha o que você está fazendo:

String id = "SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;";

int idUsuario = Integer.parseInt(id);

Ou seja, tentando "transformar" uma String não numérica em um numero inteiro. ?!?!

Tchauzin!

ctdaa

ctdaa:
Agora está me confundindo.
Você quer inserir um técnico novo, certo? o id do técnico esta na tabela do usuario_sistema, já existe lá ou voce vai criar também o registro na tabela usuario_sistema?

Repito esta pergunta… pois como eh que voce vai inserir um técnico “novo” e quer pegar o nome dele de outra tabela com um código que nem foi criado ainda???
O seu problema é mais conceitual do que programação…
Coloque as definições de catalogo das tabelas tecnico e usuario_sistema para gente analisar… seria um bom começo pro pessoal dar a dica correta!

ricardocomp

Jóia Pessoal?
o que eu estou querendo fazer é uma consulta onde eu passo o nome do Técnico
e a consulta me retorne o id_Usuario da Tabela Usuario correspondente aquele Técnico

Será que alguém poderia me dar uma ajuda?
[]'s.

thiago_spdvr

Segue um exemplo de metodo de busca que utilizo:

Retorna um objeto do tipo cliente.

public static Cliente GetCliente(int cod_cli){
    try{
        Connection con = Conexao.Conectar();

        String sql = " Select * FROM tb_cliente Where id_cliente = '" + cod_cli + "'";
        System.out.println(sql);

        Statement stmt = con.createStatement(); 
        ResultSet rs = stmt.executeQuery(sql);
        Cliente cli = new Cliente();
        System.out.println(rs);

        while(rs.next()){
            cli.SetIdent(rs.getInt("id_cliente"));
        }
        return cli;
    }     
    catch(Exception Err){
        System.out.Println(err.getMessage);
        return null;
    }
}
ricardocomp

Jóia Thiago?
Eu estou tentando fazer aqui mas não estou conseguindo
será que tem como vc ou alguém me dar uma ajuda aqui?
Eu construir o trecho de código assim:

String sql1 = "SELECT DISTINCT usuario_sistema.idUsuario " +
                          "FROM usuario_sistema INNER JOIN tecnico " +
                          "WHERE nome = '" + tecnico.getNome() + "'";
            
            ps = conn.prepareStatement(sql1);
            ps.setInt(1, tecnico.getIdUsuario());
            
            String sql2 = "INSERT INTO tecnico(idUsuario, nome, telefone, " +
                    "celular, email)"
                    + "VALUES(?,?,?,?,?)";

            ps = conn.prepareStatement(sql2);
            
            ps.setString(2, tecnico.getNome());
            ps.setString(3, tecnico.getTelefone());
            ps.setString(4, tecnico.getCelular());
            ps.setString(5, tecnico.getEmail());
            ps.executeUpdate();

Mas está aparecendo a seguinte mensagem:

SEVERE: null
exception.LAFQADaoException: Erro ao inserir dadosjava.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
        at dao.TecnicoDao.salvarTecnico(TecnicoDao.java:62)
        at teste.TesteGeral.main(TesteGeral.java:47)

[]'s.

B

Você não pode rodar duas SQLs ao mesmo tempo com a mesma conexão.

Para inserts, updates e deletes(modificações na base em geral) você:

  1. Cria o statement a partir da conexão, passando um SQL
  2. Seta as variáveis
  3. Executa o statement
  4. Fecha o statement

Para selects, você:

  1. Cria o statement a partir da conexão, passando um SQL
  2. Seta as variáveis
  3. Executa o statement, trazendo os resultados num result set
  4. Itera pelo result set, pegando os registros retornados
  5. Fecha o result set
  6. Fecha o statement

Lembrando, um de cada vez.

M

Você quer pegar o usuário do sistema correspondente àquele técnico específico (passa o nome do técnico e pega as informções do usuário correspondente)? Se for, tente fazer o seguinte:

String sql = "SELECT u.* FROM usuario_sistema AS u, tecnico AS t WHERE t.nome = ? AND u.id = t.id_usuario";
ps = conn.prepareStatement(sql);
ps.setString(1, tecnico.getNome());
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    System.out.println("id: " + rs.getString("id"));
    System.out.println("login: " + rs.getString("login"));
    System.out.println("senha: " + rs.getString("senha"));
    System.out.println("tipo_usuario: " + rs.getString("tipo_usuario"));
}
ctdaa

Bom… o exception que voce está tomando é porque voce nao tem “?” no sql que voce está preparando… voce já colocou direto o nome do técnico. Então voce não precisa desta linha:

ps.setInt(1, tecnico.getIdUsuario());  
...

Agora ainda acho que você está confuso no objetivo de pegar um registro do usuario_tabela pesquisando pelo nome do tecnico que nao existe ainda… Porque voce não tenta usar uma ferramenta de query, o próprio netbeans ou eclipse tem, para executar seus comandos e testar se o que você quer fazer vai dar certo…

ctdaa
Olhando o seu diagrama de Modelo Entidade Relacionamento eu diria que:

As chaves primárias (usuario.id e tecnico.id) devem ser geradas de tres formas:

1 - numeração automática (definido no catalogo do banco);

2 - usando um numerador próprio da aplicação (controla as chaves  utilizadas);

3 - usando a própria pk (select ( max(id) + 1) from tabela) e assinala a nova chave;

A primeira opção é mais tranquila pois o banco se responsabiliza pela geração das chaves.

Agora seu problema: a criação do técnico associado ao usuário:
Qual informação sobre o usuario voce tem? eu acho que seria o “login”. Então voce faz o select na tabela_usuario assim:

sql="select id from tabela_usuario where login=?";
    ps = conn.prepareStatement(sql);  
    ps.setString(1, usuario.getLogin());
    ResultSet rs = ps.executeQuery(); 
....

Agora voce já tem o id da tabela_usuario para preencher o “NOVO” registro que voce vai criar para o técnico.
No Insert voce coloca este “id” no campo “id_usuario” da tabela tecnico…

ricardocomp

Olá pessoal,
Bruno o seu passo-a-passo eu vou até anotar aqui,
Marco eu não entendi direitor o porque desse u.* na consulta
e também não sei para que serve direito o AS de uma consulta.
ctdaa eu estou usando a ferramenta do MySQL Query Browser
para testar as minhas consultas, e as minhas chaves primárias
são todas auto_increment.

Seguindo o conselho de todo mundo eu cheguei até aqui:

public void salvarTecnico(Tecnico tecnico) throws LAFQADaoException {
...
String sql1 = "SELECT idUsuario FROM usuario_sistema WHERE login=?;";

            ps = conection.prepareStatement(sql1);
            //Como e aonde criar a instância usuario para conseguir pegar o login???
            ps.setString(1, usuario.getLogin());
            rs = ps.executeQuery();
            String idUsuario = rs.getString("idUsuario");
            Integer.parseInt(idUsuario);

            String sql2 = "INSERT INTO tecnico(idUsuario, nome, " +
                         "telefone, celular, email)"
                       + "VALUES(?,?,?,?,?)";

            /* Cria o Statement a partir da conexão (conn) 
             * passando a consulta sql como parâmetro.
             */
            ps = conn.prepareStatement(sql2);

            /* Seta as variáveis */
            ps.setInt(1, idUsuario);
            ps.setString(2, tecnico.getNome());
            ps.setString(3, tecnico.getTelefone());
            ps.setString(4, tecnico.getCelular());
            ps.setString(5, tecnico.getEmail());

            /* Executa o Statement */
            ps.executeUpdate();
...
}

O problema agora é que eu passo um Técnico
para o método e não sei aonde e nem como criar a instância de Usuario?

Será que alguém poderia me dar uma ajuda?

[]'s.

ricardocomp

Eu tenho que pegar a instância de um usuario relacionada com aquele tecnico,
será que alguém poderia me dar uma ajuda?

[]'s.

ctdaa

Bom… aí você é o analista da aplicação… mas imagino duas opções:

  1. o próprio usuário esta se cadastrando como técnico, então voce deve ter uma página de login para o usuário se autenticar… pega o código do login a já preenche este informação na classe tecnico antes de enviá-la para a classe DAO.
  2. um administrador está cadastrando técnicos, então você deve apresentar na tela de cadastro uma selection list de usuários para o administrador escolher, mesma coisa, pega o login e coloca na classe tecnico.

Boa Sorte.

pablouu

.

ricardocomp

Jóia ctdaa?
No meu caso eu só tenho duas entidades,
onde um técnico é um administrador(com todas as permissões) e
um produtor é um usuário comum do sistema.

[]'s.

ctdaa

Excelente. O técnico está preenchendo seu próprio cadastro. Ao entrar no sistema ele fez login? Digitou usuário e senha, etc… então guarda este login para inserir na classe do técnico. Aliás o “produtor” também vai se cadastrar? o procedimento será o mesmo.

ricardocomp

Jóia ctdaa?
quem cadastra o produtor é o técnico mas o produtor e o técnico
tem que fazer o login no sistema. Mas agora eu ainda não entendi
aonde e como criar a instância do usuario ainda?
Será que tem como você ou alguém me dar uma ajuda?

[]'s.

ricardocomp

Jóia Pessoal,
eu estive pensando aqui,
e cheguei a uma conclusão
acho que eu vou fazer o seguinte:

public void salvarTecnico(Tecnico tecnico, UsuarioSistema usuario) throws LAFQADaoException {
...
String sql1 = "SELECT idUsuario FROM usuario_sistema WHERE idUsuario=?;";

            ps = conection.prepareStatement(sql1);
            ps.setInt(1, usuario.getIdUsuario());
            rs = ps.executeQuery();
            int idUsuario  = rs.getInt("idUsuario");

            String sql2 = "INSERT INTO tecnico(idUsuario, nome, " +
                         "telefone, celular, email)"
                       + "VALUES(?,?,?,?,?)";

            /* Cria o Statement a partir da conexão (conn) 
             * passando a consulta sql como parâmetro.
             */
            ps = conn.prepareStatement(sql2);

            /* Seta as variáveis */
            ps.setInt(1, idUsuario);
            ps.setString(2, tecnico.getNome());
            ps.setString(3, tecnico.getTelefone());
            ps.setString(4, tecnico.getCelular());
            ps.setString(5, tecnico.getEmail());

            /* Executa o Statement */
            ps.executeUpdate();
...
}

Mas agora está aparecendo um NullPointer:

SEVERE: null
exception.LAFQADaoException: Erro ao inserir dados
java.lang.NullPointerException
        at dao.TecnicoDao.salvarTecnico(TecnicoDao.java:69)
        at teste.TesteGeral.main(TesteGeral.java:56)

O que eu devo fazer?
Será que alguém poderia me dar uma ajuda?

[]'s.

ctdaa

Pelo jeito você nao instanciou o usuario ainda… por isso do nullPointer.
Uma pergunta: em que momento voce fez o insert do usuário? Está em outra classe DAO?

No diagrama MER que vc mostrou o relacionamento é 1:1 entre usuário e técnico.
Sendo assim, quando voce insere um registro de tecnico, tem que inserir o usuario também.
Como se fossem uma coisa só. Uma unidade de informação.
Entao nesta sua classe DAO deveria ter dois insert ao invés de um select e um insert.
A classe usuário pode fazer parte dos atributos da classe técnico.
Semelhante para o produtor.

B

Uma pergunta antes:

Por que você está fazendo um select de idUsuario sendo que você já tem o id contigo?

e

at dao.TecnicoDao.salvarTecnico(TecnicoDao.java:69)

Qual é a linha 69 do arquivo TecnicoDao.java?

ricardocomp

Olá Pessoal,
Graças a Deus e a ajuda de todos vc’s, eu consegui
resolver o meu problema, MUITO OBRIGADO MESMO A TODOS QUE ME AJUDARAM. :smiley:
Se algum dia alguém estiver com a mesma dúvida vou postar o meu código aqui:

public void salvarTecnico(Tecnico tecnico, UsuarioSistema usuario) throws LAFQADaoException {

        PreparedStatement ps = null;        
        ResultSet rs = null;

        if (tecnico == null)
            throw new LAFQADaoException("O valor passado não pode ser lido");

        try {           
            /*SQL 1*/
            String sql1 = "INSERT INTO usuario_sistema(login, password_2, tipo_usuario)"
                    + "VALUES(?,?,?)";

            /* Cria o Prepared Statement a partir da conexão, passando um SQL */
            ps = conection1.prepareStatement(sql1);
            
            /* Seta as variáveis  */
            ps.setString(1, usuario.getLogin());
            ps.setString(2, usuario.getPassword());
            ps.setString(3, usuario.getTipoUsuario().toString());
            
            /* Executa o statement */
            ps.executeUpdate();
            
            /* Cria um Statement */
            stmt = (Statement) conection1.createStatement();
            int idUsuario = -1;
            rs = stmt.executeQuery("SELECT LAST_INSERT_ID() FROM usuario_sistema");

            if (rs.next()) {
                idUsuario = rs.getInt(1);
            }
            else {
                throw new LAFQADaoException("Erro ao pegar a chave primaria");
            }           
            
            /*SQL 2*/
            String sql2 = "INSERT INTO tecnico(idUsuario, nome, " +
                         "telefone, celular, email)"
                       + "VALUES(?,?,?,?,?)";

            /* Cria o Statement a partir da conexão (conn) 
             * passando a consulta sql como parâmetro.
             */
            ps = conection2.prepareStatement(sql2);

            /* Seta as variáveis */
            ps.setInt(1, idUsuario);
            ps.setString(2, tecnico.getNome());
            ps.setString(3, tecnico.getTelefone());
            ps.setString(4, tecnico.getCelular());
            ps.setString(5, tecnico.getEmail());

            /* Executa o Statement */
            ps.executeUpdate();
            rs.close();
            
            /* Fecha o statement */
            stmt.close();
        }
        catch (Exception sqle) {
            throw new LAFQADaoException("Erro ao inserir dados\n" + sqle);
        }
        finally {
            try {
                /* Fecha as Conexões e os PreparedStatement */
                ConnectionFactory.closeconnection(conection1, ps);
                ConnectionFactory.closeconnection(conection2, ps);
            }
            catch (SQLException ex) {
                Logger.getLogger(TecnicoDao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Grande Abraço a todos.

Criado 30 de setembro de 2009
Ultima resposta 3 de out. de 2009
Respostas 32
Participantes 10