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?
Bom… aí você é o analista da aplicação… mas imagino duas opções:
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.
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.
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.
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?
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?
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.
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.
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);
}
}
}