Java não consegue se conectar ao mysql

Eu estou utilizando a ultima versão que foi lançada do MySQL e a ultima do eclipse que se tem disponibilidade atualmente, contudo quando eu utilizo em meu código como parâmetro pontos de interrogação para substituir eles dps com variaveis, aparece o seguinte erro: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘?,?,?)’ at line 1.
O connector do mysql está atualizado, o eclipse tbm, contudo esse erro persiste mesmo cmg mudando os paths do java, poderia ser algum erro do JRE System que está na versão 1.8 que é a padrão do eclipse ou é algum erro exterior ?

public class TestaInsereAluno {
public static void main(String[] args) {
String local = “jdbc:mysql://localhost/turmas”;
String login = “root”;
String senha = “root”;

	Connection bd = null;
	Scanner i = new Scanner(System.in);
	System.out.println("Inserção de Aluno:");
	System.out.println("\nDigite o nome:");
	String nomeDoAluno = i.nextLine();
	System.out.println("Digite a idade:");
	int idadeDoAluno = i.nextInt();
	i.nextLine();
	System.out.println("Digite a cidade:");
	String cidadeDoAluno = i.nextLine();


	try {
		Class.forName("com.mysql.cj.jdbc.Driver");
		System.out.println("Driver carregado com sucesso.");
		bd = (Connection) DriverManager.getConnection(local, login, senha);
		System.out.println("Conexão estabelecida com sucesso");
		//Inserindo um aluno
		String sql = "insert into aluno(nome,idade,cidade) values (?,?,?)";
		
		PreparedStatement comando = bd.prepareStatement(sql);
		comando.setString(1, nomeDoAluno);
		comando.setInt(2, idadeDoAluno);
		comando.setString(3, cidadeDoAluno);
		
		comando.execute(sql);
		System.out.println("Aluno inserido com sucesso");
		bd.close();
		System.out.println("Conexão encerrada com sucesso");
	}catch(ClassNotFoundException e) {
		System.out.println("DRIVER DO BANCO NÃO ENCONTRADO.");
	} catch(SQLException e) {
		System.out.println("ERRO CONECTANDO AO BANCO");
		e.getMessage();
		System.out.println(e);
	}
}

}

A table de aluno consiste em:

Columns:

|nome|varchar(45) PK|
|idade|int UN|
|cidade|varchar(45)|

O driver que estou usando para conectar ambos é o mysql-connector-j-8.0.32.jar
com.mysql.cj.jdbc.Driver

Caso o código não utilize os pontos de interrogação para a atribuição posterior das variáveis, ele funciona normalmente sem ocorrer esse erro, segue o código abaixo:
public class TelaInsereAluno2 {
public static void main(String[] args) {
String local = “jdbc:mysql://localhost/turmas”;
String login = “root”;
String senha = “root”;

	Connection bd = null;
	Scanner i = new Scanner(System.in);
	System.out.println("Inserção de Aluno:");
	System.out.println("\nDigite o nome:");
	String nomeDoAluno = i.nextLine();
	System.out.println("Digite a idade:");
	int idadeDoAluno = i.nextInt();
	i.nextLine();
	System.out.println("Digite a cidade:");
	String cidadeDoAluno = i.nextLine();


	try {
		Class.forName("com.mysql.cj.jdbc.Driver");
		System.out.println("Driver carregado com sucesso.");
		bd = (Connection) DriverManager.getConnection(local, login, senha);
		System.out.println("Conexão estabelecida com sucesso");
		//Inserindo um aluno
		String sql = "insert into aluno " + "(nome,idade,cidade) " + 
				" values (\"" 
				+ nomeDoAluno + "\","
				+ idadeDoAluno + ",\""
				+ cidadeDoAluno + "\")";
		
		
		
		Statement comando = bd.createStatement();
		comando.execute(sql);
		System.out.println("Aluno inserido com sucesso");
		bd.close();
		System.out.println("Conexão encerrada com sucesso");
	}catch(ClassNotFoundException e) {
		System.out.println("DRIVER DO BANCO NÃO ENCONTRADO.");
	} catch(SQLException e) {
		System.out.println("ERRO CONECTANDO AO BANCO");
		e.getMessage();
		System.out.println(e);
	}
}

}

A própria exceção está sugerindo a origem do problema, que seria um erro de sintaxe no SQL.

Como está o código que está lançando este erro?

Essa exceção ocorre quando eu executo inserts com o scanner e passo os valores para aonde fica os pontos de interrogação

Posta seu código, assim fica mais simples de ver como você fez e te ajudar com algo que possa estar errado!

Então posta esse seu código.

Como está o SQL de criação da tabela aluno? posta ele também!

Aqui não deves passar o sql como parâmetro, ele já foi passado para a PreparedStatement.

PreparedStatement comando = bd.prepareStatement(sql);
comando.setString(1, nomeDoAluno);
comando.setInt(2, idadeDoAluno);
comando.setString(3, cidadeDoAluno);
comando.execute();
1 curtida

Não faça isso. Concatenar valores diretamente na query deixa a aplicação vulnerável a ataques de SQL injection (para saber mais, leia aqui, aqui e aqui).

Enfim, a solução já foi apontada acima: ao usar PreparedStatement, você não precisa mais passar a query como parâmetro para o método execute. Outra vantagem do PreparedStatement é que ele previne os ataques de SQL injection.

1 curtida

Altera esta linha com o código abaixo e faz um teste:

comando.executeUpdate();
1 curtida

Mto obg, isso solucionou o problema.

Opa, valeu por explicar essa parte dos ataques sql injection e sobre o PreparedStatement, obg pela ajuda.