Duvidas para utilizar o método "UPDATE"

15 respostas
arthurgon

Olá gente;

Estou com dificuldade para criar uma método UPDATE no JDBC. O problema é que é chave composta. Eu consegui
criar as tabelas no MySQL utilizando chave composta...mas como fazer no JDBC? São 3 "IDs" que passo como parâmetro?

O método ficou assim:

public void altera(FuncionarioVO funcionarioVO) throws SQLException {
		PreparedStatement stmt = connection
				.prepareStatement("update LIS_FUN_RPT  set CD_EMPGCB=?, CD_FIL=?,"
						+ "CD_LFRPT_RLG=?,CD_EMPGCB_FUN=?,CD_FUN=?,CD_JORRPT=?,"
						+ "CD_MSGRPT=?, ST_LFRPT=?, CD_LFRPT_VIA_CCH, ST_LFRPT_ICL "
						+ "where CD_EMPGCB=? and CD_FIL=? and CD_LFRPT_RLG=? and CD_EMPGCB_FUN=? and CD_FUN=?");

		stmt.setInt(1, funcionarioVO.getEmpresa());
		stmt.setInt(2, funcionarioVO.getFilial());
		stmt.setInt(3, funcionarioVO.getNumeroRelogio());
		stmt.setInt(4, funcionarioVO.getCodigoEmpresaFunc());
		stmt.setInt(5, funcionarioVO.getMatricula());
		stmt.setInt(6, funcionarioVO.getCodigoJornada());
		stmt.setInt(7, funcionarioVO.getCodigoMensagem());
		stmt.setString(8, funcionarioVO.getSituacaoRegistro());
		stmt.setInt(9, funcionarioVO.getViaCracha());
		stmt.setString(10, funcionarioVO.getSituacaoAutenticaRegistro());

Sendo que os cinco primeiros campos são as chaves primarias...
Como faço pra testar? Só sei trabalhar com um único ID.

Obrigado se alguem souber.

Abraço.

15 Respostas

TeiTei

Usa Hibernate.

arthurgon

Gente…bem que eu queria…mas o padrão aqui é JDBC.

fiaux

Passa todos os ids que identificam univocamente o registro. Já que a chave é composta.

arthurgon

Essa é a minha classe FuncionarioVO:

public class FuncionarioVO implements Serializable {

	private static final long serialVersionUID = -5705561977604685667L;

	//private Long id;

	private int empresa = 0;
	private int filial = 0;
	private int numeroRelogio = 0;
	private int codigoEmpresaFunc = 0;
	private int matricula = 0;
	private int codigoJornada = 0;
	private int codigoMensagem = 0;
	private String situacaoRegistro;
	private int viaCracha = 0;
	private String situacaoAutenticaRegistro;

	
	private transient JornadaVO jornadaVO = null;
	private transient MensagemVO mensagemVO = null;

	
	public int getCodigoJornada() {
		if (jornadaVO == null) {
			return codigoJornada;
		} else {
			return jornadaVO.getCodigo();
		}
	}

	public void setCodigoJornada(int codigoJornada) {
		if (jornadaVO == null) {
			this.codigoJornada = codigoJornada;
		} else {
			throw new RuntimeException("Objeto Jornada existente");
		}
	}

	public int getCodigoMensagem() {
		if (mensagemVO == null) {
			return codigoMensagem;
		} else {
			return mensagemVO.getCodigo();
		}
	}

	public void setCodigoMensagem(int codigoMensagem) {
		if (mensagemVO == null) {
			this.codigoMensagem = codigoMensagem;
		} else {
			throw new RuntimeException("Objeto Mensagem existente");
		}
	}

	public int getEmpresa() {
		return empresa;
	}
Zeed01

Boa tarde Colegas !

Os colegas me desculpem… mas sempre vejo este tipo de sugestão use isso, use aquilo…
Acho pouco válido, pois não sabemos qual o problema do outro colega, se ele tem um sistema pronto com jdbc vai mudar tudo agora pra hibernate ?

Ou mesmo que seja só uma duvida dele, só porque temos hibernate ninguem mais precisa saber jdbc ?

Bom, como disse, não me levem a mal.

Voltando a dúvida, o que esta acontecendo ? Da erro ? Que erro ?

Você verificou se existe alguma tabela filha desta que você esta querendo atualizar que possua registros onde a FK é esta que você esta tentando alterar ?

[]s

TeiTei

Não precisa saber so hibernate tem que saber jdbc tbm, mas p que reenventar a roda? Perder tempo fazendo algo que ja existe? no caso dele e diferente mas mesmo assim eu acho que talvez ate valeria a pena migrar.

Zeed01

Boa noite Colegas !

Não é questão de reinventar a roda…
Alias nesse caso acho que hibernate foi a reinvençao da roda, ja que ele veio depois de Jdbc.

No caso dele ele disse que o padrão da empresa é Jdbc, logo migrar não é uma opção.

Tenho aqui um caso de uma tabela com 500.000.000 de registros e para fazer uma pesquisa especifica preciso utilizar hints do Oracle, senão não tem como obter o retorno sem dar full scan na tabela, como faço isso com hibernate ? Veja bem… não estou dizendo que não da para fazer.

[]s

arthurgon

Olá gente...

Continuo com o mesmo problema!!
Por favor...um Help. É o seguinte...tenho quatro tabelas que eu mesmo tive de criar. Só que elas possuem chave composta, e nada de um único "id".
Nunca trabalhei com chave composta em JDBC, e daí a minha dúvida. O INSERT e o SELECT...beleza..sem problemas...mas quando o assunto é UPDATE OU DELETE...ou até mesmo um JOIN...onde preciso colocar um ID no WHERE...ferra tudo. A tabela que te coloco como exemplo tem 5 chaves primarias. Tenho que colocar WHERE nas 5??
Como ficaria o método?

Essa é a tabela:

CD_EMPGCB: SMALLINT(FK)
CD_FIL: SMALLINT(FK)
CD_LFRPT_RLG: SMALLINT
CD_EMPGCB_FUN: SMALLINT(FK)
CD_FUN: INTEGER(FK)

(Chaves Primarias)
-----------------------------------------
CD_JORRPT: SMALLINT(FK)
CD_MSGRPT: SMALLINT(FK)
ST_LFRPT: CHAR(1)
CD_LFRPT_VIA_CHH: SMALLINT
ST_LFRPT_ICL: CHAR(1)

O método que criei para UPDATE é esse:

public void altera(FuncionarioVO funcionarioVO) throws SQLException {
        PreparedStatement stmt = connection
                .prepareStatement("update LIS_FUN_RPT  set CD_EMPGCB=?, CD_FIL=?,"
                        + "CD_LFRPT_RLG=?,CD_EMPGCB_FUN=?,CD_FUN=?,CD_JORRPT=?,"
                        + "CD_MSGRPT=?, ST_LFRPT=?, CD_LFRPT_VIA_CCH, ST_LFRPT_ICL "
                      
                         + "where "DAÍ PRA FRENTE NÃO SEI DE MAIS NADA..."

       

        stmt.setInt(1, funcionarioVO.getEmpresa());
        stmt.setInt(2, funcionarioVO.getFilial());
        stmt.setInt(3, funcionarioVO.getNumeroRelogio());
        stmt.setInt(4, funcionarioVO.getCodigoEmpresaFunc());
        stmt.setInt(5, funcionarioVO.getMatricula());
        stmt.setInt(6, funcionarioVO.getCodigoJornada());
        stmt.setInt(7, funcionarioVO.getCodigoMensagem());
        stmt.setString(8, funcionarioVO.getSituacaoRegistro());
        stmt.setInt(9, funcionarioVO.getViaCracha());
        stmt.setString(10, funcionarioVO.getSituacaoAutenticaRegistro());

      

        stmt.execute();
        stmt.close();
    }

Aproveitando...como fica o método "main" pra mim testar?
Agradeço se alguem souber...

Valeu galera.

Zeed01

Bom dia Colegas !

Se a sua intenção e atualizar uma unica linha da LIS_FUN_RPT e o que identifica uma linha como única é esta sua chave composta de 5 campos, então você tem sim que colocar todos os 5 campos no where :

public void altera(FuncionarioVO funcionarioVO) throws SQLException {   
        PreparedStatement stmt = connection   
                .prepareStatement("update LIS_FUN_RPT  set CD_EMPGCB=?, CD_FIL=?,"   
                        + "CD_LFRPT_RLG=?,CD_EMPGCB_FUN=?,CD_FUN=?,CD_JORRPT=?,"   
                        + "CD_MSGRPT=?, ST_LFRPT=?, CD_LFRPT_VIA_CCH, ST_LFRPT_ICL "                            
                         + "where CD_EMPGCB=? and CD_FIL=? and CD_LFRPT_RLG=? and CD_EMPGCB_FUN=? and CD_FUN=?"
  
        stmt.setInt(1, funcionarioVO.getEmpresa());   
        stmt.setInt(2, funcionarioVO.getFilial());   
        stmt.setInt(3, funcionarioVO.getNumeroRelogio());   
        stmt.setInt(4, funcionarioVO.getCodigoEmpresaFunc());   
        stmt.setInt(5, funcionarioVO.getMatricula());   
        stmt.setInt(6, funcionarioVO.getCodigoJornada());   
        stmt.setInt(7, funcionarioVO.getCodigoMensagem());   
        stmt.setString(8, funcionarioVO.getSituacaoRegistro());   
        stmt.setInt(9, funcionarioVO.getViaCracha());   
        stmt.setString(10, funcionarioVO.getSituacaoAutenticaRegistro());   
  
         
  
        stmt.execute();   
        stmt.close();   
    }

Como disse antes, qual erro esta dando ?

Pela sua ultima mensagem:

CD_EMPGCB: SMALLINT(FK)   
CD_FIL: SMALLINT(FK)   
CD_LFRPT_RLG: SMALLINT   
CD_EMPGCB_FUN: SMALLINT(FK)   
CD_FUN: INTEGER(FK)

Me eu entendi que os campos marcados como FK são ForeingKeys estou certo ?
Se sim você não vai conseguir dar um update na tabela filha de modo que ela fique sem um registro correspondente na tabela pai… mas ai é uma regra do banco relacional e não de java.
Alias, qual banco você esta usando mesmo ?
Veja isso.

Um abraço.

arthurgon

Olá meu amigo...realmente vc tem razão...são todas FKs...não sei pq na modelagem não há PKs. Daí minha dificuldade.
Então...o erro que dá é esse logo abaixo:

Exception in thread "main" java.sql.SQLException: No value specified for parameter 11
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1718)
	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1666)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:798)
	at dao.FuncionarioDAO.altera(FuncionarioDAO.java:107)
	at teste.TestaUpdate.main(TestaUpdate.java:27)
E o método "main" estou chamando dessa forma:
public static void main(String[] args) throws SQLException {
		 
		FuncionarioVO funcionarioVO = new FuncionarioVO();
		 
		funcionarioVO.setEmpresa(26);
		funcionarioVO.setFilial(27);
		funcionarioVO.setNumeroRelogio(28);
		funcionarioVO.setEmpresaFuncionario(29);
		funcionarioVO.setMatricula(30);
		funcionarioVO.setCodigoJornada(31);
		funcionarioVO.setCodigoMensagem(32);
		funcionarioVO.setStatus("D");
		funcionarioVO.setViaCracha(33);
		funcionarioVO.setTipoAutorizacao("E");
		
		
		FuncionarioDAO dao=new FuncionarioDAO();
		
		dao.altera(funcionarioVO);
		System.out.println("ALTERADO COM SUCESSO!!");
	
	 
	}

Como a modelagem já veio dessa forma e ainda por cima com chave composta...fiquei perdido. Tem como utilizar "UPDATE" e "DELETE" nessa situação com essa modelagem?

Valeu amigo.

Zeed01

Bom dia Colegas !

Bom aparentemente agora ficou mais claro !
Conte quantos pontos de interrogação “?” tem na sua expressão SQL e quantos stmt.setXXXXX você esta dando…
Se for ao mesmo update da sua primeira mensagem eu contei 13 parametros no SQL (?) e somente 10 set´s.
Alem você não esta atribuindo nada aos campos CD_LFRPT_VIA_CCH e ST_LFRPT_ICL, acho que isto também vai dar erro.

[]s

P.S. - Apenas lembrando que se os campos que estão como FK fizerem referencia a um registro na tabela pai e com a alteração eles não tiverem outro registro para “adotá-los”, o Banco de Dados também não vai deixar que o update seja concluído.

arthurgon

Olá...realmente faltou preencher dois parâmetros...mas estou analisando e ainda não encontro outro erro. Mas a mensagem continua vindo.

Ficou assim o método:

public void altera(FuncionarioVO funcionarioVO) throws SQLException {     
		           PreparedStatement stmt = connection     
		                   .prepareStatement("update LIS_FUN_RPT  set CD_EMPGCB=?, CD_FIL=?,"     
		                          + "CD_LFRPT_RLG=?,CD_EMPGCB_FUN=?,CD_FUN=?,CD_JORRPT=?,"     
		                            + "CD_MSGRPT=?, ST_LFRPT=?, CD_LFRPT_VIA_CCH=?, ST_LFRPT_ICL=? "                              
		                            + "where CD_EMPGCB=? and CD_FIL=? and CD_LFRPT_RLG=? and CD_EMPGCB_FUN=? and CD_FUN=?");  
		        
									   stmt.setInt(1, funcionarioVO.getEmpresa());     
									   stmt.setInt(2, funcionarioVO.getFilial());     
									   stmt.setInt(3, funcionarioVO.getNumeroRelogio());     
									   stmt.setInt(4, funcionarioVO.getEmpresaFuncionario());     
									   stmt.setInt(5, funcionarioVO.getMatricula());     
									   stmt.setInt(6, funcionarioVO.getCodigoJornada());     
									   stmt.setInt(7, funcionarioVO.getCodigoMensagem());     
									   stmt.setString(8, funcionarioVO.getStatus());     
									   stmt.setInt(9, funcionarioVO.getViaCracha());     
									   stmt.setString(10, funcionarioVO.getTipoAutorizacao());     
  
		       
		           stmt.execute();     
		           stmt.close();     
		       }

O "main" ficou desse jeito:

public static void main(String[] args) throws SQLException {
		 
		FuncionarioVO funcionarioVO = new FuncionarioVO();
		 
		funcionarioVO.setEmpresa(26);
		funcionarioVO.setFilial(27);
		funcionarioVO.setNumeroRelogio(28);
		funcionarioVO.setEmpresaFuncionario(29);
		funcionarioVO.setMatricula(30);
		funcionarioVO.setCodigoJornada(31);
		funcionarioVO.setCodigoMensagem(32);
		funcionarioVO.setStatus("D");
		funcionarioVO.setViaCracha(33);
		funcionarioVO.setTipoAutorizacao("E");
		
		
		FuncionarioDAO dao=new FuncionarioDAO();
		
		dao.altera(funcionarioVO);
		System.out.println("ALTERADO COM SUCESSO!!");
	
	 
	}

E o erro é esse:

Exception in thread "main" java.sql.SQLException: No value specified for parameter 11
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1718)
	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1666)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:798)
	at dao.FuncionarioDAO.altera(FuncionarioDAO.java:107)
	at teste.TestaUpdate.main(TestaUpdate.java:27)

Pode ser o problema da FK??

Não entendo...consigo inserir, consultar...mas não posso alterar ou deletar...

Valeu amigão.

Zeed01

Como te disse… se este é o update que você esta dando:

"update LIS_FUN_RPT  set CD_EMPGCB=?, CD_FIL=?,"       
                              + "CD_LFRPT_RLG=?,CD_EMPGCB_FUN=?,CD_FUN=?,CD_JORRPT=?,"       
                                + "CD_MSGRPT=?, ST_LFRPT=?, CD_LFRPT_VIA_CCH=?, ST_LFRPT_ICL=? "                                 
                                + "where CD_EMPGCB=? and CD_FIL=? and CD_LFRPT_RLG=? and CD_EMPGCB_FUN=? and CD_FUN=?")

e estes são os parametros que esta passando:

stmt.setInt(1, funcionarioVO.getEmpresa());       
                                   stmt.setInt(2, funcionarioVO.getFilial());       
                                   stmt.setInt(3, funcionarioVO.getNumeroRelogio());       
                                   stmt.setInt(4, funcionarioVO.getEmpresaFuncionario());       
                                   stmt.setInt(5, funcionarioVO.getMatricula());       
                                   stmt.setInt(6, funcionarioVO.getCodigoJornada());       
                                   stmt.setInt(7, funcionarioVO.getCodigoMensagem());       
                                   stmt.setString(8, funcionarioVO.getStatus());       
                                   stmt.setInt(9, funcionarioVO.getViaCracha());       
                                   stmt.setString(10, funcionarioVO.getTipoAutorizacao());

Estão faltando todos os parametros do seu Where !
Ou seja o 11, 12, 13, 14 e 15.

Tente assim:

public void altera(FuncionarioVO funcionarioVO) throws SQLException {       
               PreparedStatement stmt = connection       
                       .prepareStatement("update LIS_FUN_RPT  set CD_EMPGCB=?, CD_FIL=?,"       
                              + "CD_LFRPT_RLG=?,CD_EMPGCB_FUN=?,CD_FUN=?,CD_JORRPT=?,"       
                                + "CD_MSGRPT=?, ST_LFRPT=?, CD_LFRPT_VIA_CCH=?, ST_LFRPT_ICL=? "                                 
                                + "where CD_EMPGCB=? and CD_FIL=? and CD_LFRPT_RLG=? and CD_EMPGCB_FUN=? and CD_FUN=?");     
               
                                   stmt.setInt(1, funcionarioVO.getEmpresa());       
                                   stmt.setInt(2, funcionarioVO.getFilial());       
                                   stmt.setInt(3, funcionarioVO.getNumeroRelogio());       
                                   stmt.setInt(4, funcionarioVO.getEmpresaFuncionario());       
                                   stmt.setInt(5, funcionarioVO.getMatricula());       
                                   stmt.setInt(6, funcionarioVO.getCodigoJornada());       
                                   stmt.setInt(7, funcionarioVO.getCodigoMensagem());       
                                   stmt.setString(8, funcionarioVO.getStatus());       
                                   stmt.setInt(9, funcionarioVO.getViaCracha());       
                                   stmt.setString(10, funcionarioVO.getTipoAutorizacao());  
stmt.setInt(11, funcionarioVO.getEmpresa()); 
stmt.setInt(12, funcionarioVO.getFilial());       
stmt.setInt(13, funcionarioVO.getNumeroRelogio());       
stmt.setInt(14, funcionarioVO.getEmpresaFuncionario());       
stmt.setInt(15, funcionarioVO.getMatricula());     

               stmt.execute();       
               stmt.close();       
           }

Acho que deverá funcionar, desde que não tenha conflito referente as FK´s, mas dai o erro deve mudar.

Um abraço.

Kamikaze


TeiTei
Post 27/05/2008 14:53:10 Assunto: Re:Duvidas para utilizar o método “UPDATE”…
Usa Hibernate.

Complementando o que o TeiTei disse segue alguns links.

http://www.hibernate.org/

e em PDF
http://intranet1.kotasoft.com/documentos/Hibernate/Hibernate%20in%20Action.pdf

boa leitura!

att

Kamikaze

Como esta a classe FuncionarioVO!

Cole ela aki

Criado 27 de maio de 2008
Ultima resposta 27 de mai. de 2008
Respostas 15
Participantes 5