Dificuldade de inserir informações no banco

Boa tarde pessoal, antes de mais nada gostaria de dizer que não sei muito de Java e estou desenvolvendo um programa simples de cadastro de clientes para praticar. Utilizo um pouco de MVC e separo por pacotes, model, view e DAO.

O meu problema está na hora de inserir os dados no banco, a única coisa que está sendo enviada é o ID do cliente, já rodei o código todo aqui e não consegui enxergar o erro.

Aqui está a parte do DAO em que eu salvo o cliente no banco:
public void salvarCliente(Cliente cliente)
{
String sql = “INSERT INTO cliente (CLI_ID, CLI_NOME, CLI_CPF, CLI_NASC, CLI_ENDERECO, CLI_EMAIL, CLI_TEL, CLI_BAIRRO, CLI_CEP, CLI_ESTADO)”
+ “VALUES (?,?,?,?,?,?,?,?,?,?)”;

	Connection conn = null;
	PreparedStatement pstm = null;
	
	try 
	{
		//prepara a conexão com o BD
		conn = Conexao.getConexaoMySQL();
		
		//cria um PreparedStatment, classe usada para executar a query
		pstm = conn.prepareStatement(sql);
		
		//adciona o valor ao 1º parametro
		pstm.setInt(1,cliente.getCLI_ID());
		//adciona o valor ao 2º parametro
		pstm.setString(2, cliente.getCLI_NOME());
		//adciona o valor ao 3º parametro
		pstm.setString(3,cliente.getCLI_CPF());
		//adciona o valor ao 4º parametro
		pstm.setDate(4, cliente.getCLI_NASC());
		//adciona o valor ao 5º parametro
		pstm.setString(5,cliente.getCLI_ENDERECO());
		//adciona o valor ao 6º parametro
		pstm.setString(6,cliente.getCLI_EMAIL());
		//adciona o valor ao 7º parametro
		pstm.setString(7,cliente.getCLI_TEL());
		//adciona o valor ao 8º parametro
		pstm.setString(8,cliente.getCLI_BAIRRO());
		//adciona o valor ao 9º parametro
		pstm.setString(9,cliente.getCLI_CEP());
		//adciona o valor ao 10º parametro
		pstm.setString(10,cliente.getCLI_ESTADO());
		
		//executa a query
		pstm.execute();
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		try {
				if(pstm != null)
				{
					pstm.close();
				}
				
				if(conn != null)
				{
					conn.close();
				}
			}catch (Exception e){
				e.printStackTrace();
			}
	}	
}

Aqui está a parte do botão no JFrame que chama o metodo acima:
public void actionPerformed(ActionEvent e) {

			//capturando o ID
			String ID = txtID.getText();
			int id = Integer.parseInt(ID);
			cliente.setCLI_ID(id);
			
			//capturando o nome
			cliente.setCLI_NOME(txtNome.getText());
			
			
			//capturando o CPF/CNPJ
			cliente.setCLI_CPF(txtCPF.getText());
			
			//capturando o telefone
			cliente.setCLI_TEL(txtTel.getText());
			
			//capturando o email
			cliente.setCLI_EMAIL(txtEmail.getText());
			
			//capturando o endereço
			cliente.setCLI_ENDERECO(txtEndereco.getText());
			
			//capturando o bairro
			cliente.setCLI_BAIRRO(txtBairro.getText());
			
			//capturando o cep
			cliente.setCLI_CEP(txtCEP.getText());
			
			//capturando a escolha do combobox
			cliente.setCLI_ESTADO(String.valueOf(cbEstado.getSelectedItem()));
			
			//capturando a data de nascimento
			java.util.Date invoiceDate = null;
			try
			{
				invoiceDate = formatDate.parse(txtDataNasc.getText().trim());
			}catch(Exception e4)
			{
				e4.printStackTrace();
			}
			java.sql.Date sqlDate = new java.sql.Date(invoiceDate.getTime());
			cliente.setCLI_NASC(sqlDate);
			//fim da captura de data de nascimento
			
			if ((txtID.getText().isEmpty()) || (txtNome.getText().isEmpty()) || (txtCPF.getText().isEmpty()) || (txtTel.getText().isEmpty()) || (txtEmail.getText().isEmpty()) || (txtEndereco.getText().isEmpty()) || (txtBairro.getText().isEmpty()) || (txtCEP.getText().isEmpty()))
			{
				JOptionPane.showMessageDialog(null,"<html>Os campos com * <strong>não</strong> podem ficar vazios!</html>");
			}
			else
			{
				dao.salvarCliente(cliente);
				JOptionPane.showMessageDialog(null, "Cliente " + txtNome.getText() +" inserido com sucesso!" );
				limparCampos();
			}
					
					
		}

Peço desculpas caso a formatação não esteja (e sei que não esta :sweat_smile: ) do jeito certo, sou novo no forum também.

Caso esteja faltando alguma parte do código, eu posto também.

Obrigado desde já.

Boa tarde Jorge_Eduardo,

Tente lançar os valores dos campos no console pra ver se eles estão chegando no código interno, depois, veja se não está sendo lançada nenhuma Exception durante essa operação.

Poste aqui os erros aparentes no console, caso hajam.

Posta a classe onde vc cria a conexao e a Cliente

Vou tentar fazer do jeito que você falou, caso apareça algum erro posto aqui.

Classe Conexão:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Conexao {

public static String status = "Não conectou...";

public static java.sql.Connection getConexaoMySQL()
{
	Connection connection = null;
	
	try
	{
		//Carregando o JDBC Driver padrão
		String driverName = "com.mysql.jdbc.Driver";
		
		Class.forName(driverName);
		
		//configurando a conexão com o BD
		
		String serverName = "localhost:3306";  //caminho do servidor do BD
		String myDataBase = "banco_sistema"; 	//nome do seu banco de dados
		String url = "jdbc:mysql://" + serverName + "/" + myDataBase;
		String userName = "root"; //usuario do BD
		String password = "juninho12"; //senha do BD
		
		connection = DriverManager.getConnection(url, userName, password);
		
		//teste de conexão
		
		if (connection != null)
		{
			status = ("Conectado com Sucesso!");
		}
		
		else
		{
			status = ("Não foi possível realizar a conexão!");
		}
			
		return connection;
	} catch (ClassNotFoundException e) {  //Driver não encontrado

    	  System.out.println("O driver expecificado nao foi encontrado.");

          return null;

      } catch (SQLException e) {

//Não conseguindo se conectar ao banco

          System.out.println("Nao foi possivel conectar ao Banco de Dados.");

          return null;
      }
}	

}

E a classe cliente que você se refere é a do model?

e pq vc teria várias classes Cliente?

Classe Cliente:

public class Cliente {

private int CLI_ID;
private String CLI_NOME;
private String CLI_CPF;
private java.sql.Date CLI_NASC;
private String CLI_ENDERECO;
private String CLI_EMAIL;
private String CLI_TEL;
private String CLI_BAIRRO;
private String CLI_CEP;
private String CLI_ESTADO;

public int getCLI_ID() {
	return CLI_ID;
}
public void setCLI_ID(int CLI_ID) {
	CLI_ID = this.CLI_ID;
}

public String getCLI_NOME() {
	return CLI_NOME;
}
public void setCLI_NOME(String CLI_NOME) {
	CLI_NOME = this.CLI_NOME;
}

public String getCLI_CPF() {
	return CLI_CPF;
}
public void setCLI_CPF(String CLI_CPF) {
	CLI_CPF = this.CLI_CPF;
}

public java.sql.Date getCLI_NASC() {
	return CLI_NASC;
}
public void setCLI_NASC(java.sql.Date CLI_NASC) {
	CLI_NASC = this.CLI_NASC;
}

public String getCLI_ENDERECO() {
	return CLI_ENDERECO;
}
public void setCLI_ENDERECO(String CLI_ENDERECO) {
	CLI_ENDERECO = this.CLI_ENDERECO;
}

public String getCLI_EMAIL() {
	return CLI_EMAIL;
}
public void setCLI_EMAIL(String CLI_EMAIL) {
	CLI_EMAIL = this.CLI_EMAIL;
}

public String getCLI_TEL() {
	return CLI_TEL;
}
public void setCLI_TEL(String CLI_TEL) {
	CLI_TEL = this.CLI_TEL;
}

public String getCLI_BAIRRO() {
	return CLI_BAIRRO;
}
public void setCLI_BAIRRO(String CLI_BAIRRO) {
	CLI_BAIRRO = this.CLI_BAIRRO;
}

public String getCLI_CEP() {
	return CLI_CEP;
}
public void setCLI_CEP(String CLI_CEP) {
	CLI_CEP = this.CLI_CEP;
}

public String getCLI_ESTADO() {
	return CLI_ESTADO;
}
public void setCLI_ESTADO(String CLI_ESTADO) {
	CLI_ESTADO = this.CLI_ESTADO;
}

Olá @Jorge_Eduardo, após o trecho código pstm.execute();, você precisa fazer commit na sua Connection, conn.commit();.

Ele não tem autoCommit(false);
Por padrão é autoCommit true até pq ele disse que o id está inserindo, mas os outros dados não

Fiz do jeito que você disse, criei variáveis e lancei os valores pelo console. Fui verificar no banco e continua da mesma forma

Não aparece nenhum erro no console, so que quando verifico o banco pra ver se inseriu mesmo, só vai o ID.

E quando você pega os valores, antes de enviar para o DAO eles estão nulos ?

Não vai aparecer erro, muito menos printar no console resolveria seu problema, entenda que a sugestão foi pra vc ver OQUE vai printar no console, se printar os dados o problema é na inserção, se não printar, seu problema está em setar os dados da tela no objeto. Portanto verifique isso e responda com oq printou no console.

Hummmmm, perae…
troca a linha:
pstm.execute();
por:
pstm.executeUpdate();

Como eu faria essa verificação?

Troquei a linha que você falou, mas ficou do mesmo jeito. Vou fazer a verificação que você disse em relação a printar os dados.

Todos os dados foram printados na tela, então como você disse possivelmente é alguma coisa na hora de setar para o objeto.

Posta o código q vc fez pra printar

Você pode tentar adicionar o logger no final da sua URL:

?logger=com.mysql.jdbc.log.StandardLogger&profileSQL=true

Ai ele vai mostrar o que está fazendo quando tenta inserir e se dá algum problema durante.

public void actionPerformed(ActionEvent e) {

			//capturando o ID
			String ID = txtID.getText();
			int id = Integer.parseInt(ID);
			cliente.setCLI_ID(id);
			System.out.println(txtID.getText());
			
			//capturando o nome
			cliente.setCLI_NOME(txtNome.getText());
			System.out.println(txtNome.getText());
			
			//capturando o CPF/CNPJ
			cliente.setCLI_CPF(txtCPF.getText());
			System.out.println(txtCPF.getText());
			
			
			//capturando o telefone
			cliente.setCLI_TEL(txtTel.getText());
			System.out.println(txtTel.getText());
			
			
			//capturando o email
			cliente.setCLI_EMAIL(txtEmail.getText());
			System.out.println(txtEmail.getText());
			
			
			//capturando o endereço
			cliente.setCLI_ENDERECO(txtEndereco.getText());
			System.out.println(txtEndereco.getText());
			
			
			//capturando o bairro
			cliente.setCLI_BAIRRO(txtBairro.getText());
			System.out.println(txtBairro.getText());
			
		
			//capturando o cep
			cliente.setCLI_CEP(txtCEP.getText());
			System.out.println(txtCEP.getText());
			
			
			//capturando a escolha do combobox
			cliente.setCLI_ESTADO(String.valueOf(cbEstado.getSelectedItem()));
			System.out.println(cbEstado.getSelectedItem());
			
			
			//capturando a data de nascimento
			java.util.Date invoiceDate = null;
			try
			{
				invoiceDate = formatDate.parse(txtDataNasc.getText().trim());
			}catch(Exception e4)
			{
				e4.printStackTrace();
			}
			java.sql.Date sqlDate = new java.sql.Date(invoiceDate.getTime());
			cliente.setCLI_NASC(sqlDate);
			System.out.println(txtDataNasc.getText());
			//fim da captura de data de nascimento
			
			
			if ((txtID.getText().isEmpty()) || (txtNome.getText().isEmpty()) || (txtCPF.getText().isEmpty()) || (txtTel.getText().isEmpty()) || (txtEmail.getText().isEmpty()) || (txtEndereco.getText().isEmpty()) || (txtBairro.getText().isEmpty()) || (txtCEP.getText().isEmpty()))
			{
				JOptionPane.showMessageDialog(null,"<html>Os campos com * <strong>não</strong> podem ficar vazios!</html>");
			}
			else
			{
				dao.salvarCliente(cliente);
				JOptionPane.showMessageDialog(null, "Cliente " + txtNome.getText() +" inserido com sucesso!" );
				limparCampos();
			}
					
					
		}

Talvez eu não tenha entendido bem o que você me pediu para fazer, so fiz um teste de printar na tela os dados que passo como parâmetro no DAO, e eles devolvem os dados. Caso esteja fazendo errado, peço desculpa como disse sou muito juvenil ainda em Java :sweat_smile:

Onde precisamente eu insiro esse logger?