SQL + Java [RESOLVIDO]

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…

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 já 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…

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.

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

[]'s.

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.

.

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.

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.

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.

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.

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.

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?

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.