[RESOLVIDO] JDBC: Passar String em Query

Olá pessoal,
Preciso muito da ajuda de vocês!
Comecei a mecher recentemente com JDBC, e estou com um problema:
Preciso inserir uma String no banco de dados (mySql) e se fosse uma string que eu determinasse no código seria simples, seria apenas fazer:

st.executeUpdate(“INSERT into tabela VALUES (”+chave+","+"‘nome’"+")");

assim seria salvo a palavra ‘nome’ no bd.
Porém eu tenho uma varíavel que eu preciso salvar no bd como String. Na verdade é um objeto que eu uso o método toString() para pegar seu nome.
E não está dando pra fazer:

st.executeUpdate(“INSERT into tabela VALUES (”+chave+","+objeto.toString()+")");

até compila e roda, mas gera uma excecao SQL:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘joao’ in ‘field list’

“joao” seria o texto digitado que estou tentando salvar.

Alguma sugestão?
Obrigado

opa, boa noite.

bem, usar do jeito que você ta dizendo, é meio complicado, eu uso o PreparedStatement, que você so coloca uma interrogação no lugar onde
deveria se encaixar uma variavel ou pesquisa no banco de dados, e depois seta o valor nela.
vou colocar um código pra ver se você entende.

vamos super que eu quero inserir um cliente, e eu precise setar o Nome, e o endereço.

então você cria uma classe, Cliente, e coloca os Getters and Setters pra ele.

ae na classe onde vai manipular o BD você faz o seguinte:

public void adicionarCliente(Cliente cliente)
	{
		// COMANDO SQL QUE SERÁ EXECUTADO
		String comandoSQL = 
"INSERT INTO CLIENTE (NOME, ENDEREÇO, NUMERO, BAIRRO, CIDADE, UF, TELEFONE, CELULAR, EMAIL) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		try // executa os comandos com o banco de dados
		{
			
			// prepared statement para a inserção no banco
			
			PreparedStatement executarSQL = conexao.prepareStatement(comandoSQL); // insere o comando no statement, onde conexao é o seu Connection
			
			// seta os valores, inteiro do primeiro argumento, é o que deve entrar no lugar das interrogações do comando SQL, tem que ser na ordem exata.
			
			executarSQL.setString(1, cliente.getNome()); // coloca o nome no banco de dados
			
                        executarSQL.setString(2, cliente.getEndereco()); // coloca o endereço
                        executarSQL.setInt(3, cliente.getNumero()); // coloca o numero da residencia
                        executarSQL.setString(4, cliente.getBairro()); // coloca o bairro
                        executarSQL.setString(5, cliente.getCidade()); // coloca a cidade
                        executarSQL.setString(6, cliente.getUF()); // coloca o UF
                        
			executarSQL.setString(7, cliente.getTelefone()); // coloca o telefone
			executarSQL.setString(8, cliente.getCelular());  // coloca o celular
                        executarSQL.setString(9, cliente.getEmail()); // coloca o email
			
			// executa o statement
			executarSQL.execute();
			
			JOptionPane.showMessageDialog(null, "Dados Gravados Com Sucesso",
                                "Resultado", JOptionPane.INFORMATION_MESSAGE);
			
			executarSQL.close(); // fecha o statement do comando sql
			
			conexao.close(); // fecha a conexão com o banco de dados
			
			System.out.println("\nConexão Fechada!\n");
		}
		catch(SQLException e)
		{
			System.out.println("Cliente Não Adicionado!");
			
			throw new RuntimeException(e);
		}
}

se não entendeu, te mando uma apostila que explica melhor.
abraço

Vlw amigo, não apenas entendi como já está funcionando aqui rsrs
Mesmo assim gostaria desta apostila, como disse, estou iniciando em JDBC e comecei por essa interface Statement justamente por ser a que vi em praticamente todo tutorial de JDBC que achei na net.

Só me diga mais uma coisa, não são salvos no bd Strings como mais caracteres doq determinei na variável varchar no bd, teria uma sugestão simples para salvar no bd os primeiros caracteres que estariam no limite da variável determinada no bd, e apenas desconsiderar as demais?
por exemplo, se o campo nome do bd é varchar(10), e envio a string ‘joao da silva’, poder salvar ‘joao da si’.

Obrigado.

beem , um jeito certo eu não sei não. Mas tenho um palpite, so que pode sair meio errado, alguem que tenha mais experiência me corriga por favor caso esteja errado.
Bem, eu faria o seguinte, colocaria um JFormattedTextField e limitaria a quantidade de caracteres, no seu caso para 10, pra isso aplique um MaskFormatter.
ae você ativa a opção de quando sair do JFormattedTextField para commit, para não apagar o conteúdo quando o field perder o foco.

para usar essa opção que falei do commit você usa o seguinte comando:

se tiver usando console, ignore o comentario… rsrs

abraço

vlw brenowbc, mas é q na vdd essa string não é gerada pelo usuário, não tem como eu aplicar essa formatação na entrada do dado, é uma string gerada durante a execução do próprio programa, que dá pra presumir a média do tamanho, logo dá pra aplicar um tamanho médio à variavel varchar da db, mas pode ser que chegue uma string maior, logo teria q fazer isso acho que no momento da inserção no db, pensei que pudesse fazer isso com algum comando sql… é q n manjo mto de sql tb… só o básico rs

mas vlw, se você ou mais alguém tiver uma sugestão pra isso agradeço.

flw

Bom dia rafa_java em relação ao Statement e o PrepareStatement alem de ser mais simples trabalhar com o PrepareStatement pois não precisa ficar concatenando String com objetos é muito mais seguro pois os metodos setters e getters dele tratam um problema muito conhecido pelos crackers que é o SQL Injection que é uma das tecnicas mais usadas para invasão de sistemas web! então alem do PrepareStatement ser mais simples é mais eficiente e mais seguro, referente ao problema da String ae vai uma dica, quando você define um campo no BD como varchar sendo 255 caranteres e usar somente 10 os outros 245 caracteres não ficaram em branco, ou seja, seria por baixo dos panos como se você tivesse definido somente 10 caracteres para aquele campo, o que deixaria os campos restantes em branco seria se você tivesse definido no seu BD ao invéz de Varchar o Char imagine que você definisse um campo Char de 10 caracteres e tivesse usado somente 5 os outros 5 teriam sido gravados em branco, por tanto use sempre varchar e defina um tamanho sempre um pouco maior do que o necessario, pois caso necessitar o Varchar se adequa as suas necessidades, espero ter ajudado!
abraços!

agora caso você queria deixar essa String somente com 10 caracteres ae vai um exemplo:

ackage GUJ;

import javax.swing.JOptionPane;

public class LimitarString {

	public static void main (String args[]){
		LimitarString obj = new LimitarString();
		String stringAserTratada = "012345678910";
		String imprimir = obj.tratarString(stringAserTratada);
		JOptionPane.showMessageDialog(null, imprimir);
	}
	
	public String tratarString(String stringAserTratada){
		String tratada = stringAserTratada.substring(0,10);
		return tratada;
	}
}

A saída seria: 0123456789

espero ter ajudado!

Obrigado msm Rafael, eu pensei q se usasse um tamanho muito grande de varchar, justamente seria despedício de espaço, salvando caracteres em ‘branco’, mas ja q vc disse q isso n ocorre, então é só aumentar isso no bd e não haverá mais problemas rsrs
Agradeço pelo ajuda que recebi dos dois, muito obrigado msm.
Abraços.

É isso ae rafa_java o forum é pra isso mesmo, kkkkk um ajudando o outro, qualquer duvida é só postar, só um lembrete, por favor altere o tópico para [RESOLVIDO] abraços!!!