Se você viu um comando SQL, vai perceber que normalmente os comandos (SELECT, INSERT, UPDATE etc.) têm uma parte fixa e uma parte variável. Por exemplo,
SELECT * FROM alunos WHERE nome = ‘José’
ou
SELECT * FROM alunos WHERE nome = ‘Maria’
Você viu que só varia o nome ‘José’ ou ‘Maria’.
A maior parte dos bancos de dados SQL trabalha melhor se você, em vez de ficar montando sempre consultas SQL diferentes, você passar uma consulta FIXA e variar só os dados. A tal “consulta fixa” é o que deu motivação para o PreparedStatement. Por exemplo, eles sempre entendem algo parecido com isto aqui:
SELECT * FROM alunos WHERE nome = ?
onde ? é ‘José’ ou ‘Maria’ ou o que você precisar consultar.
Note que são os dados que variam, não o nome das colunas. Então isto aqui:
SELECT * FROM alunos WHERE ? = ‘Aristodemo’
e você quiser fazer ? = nome_professor, não funciona.
O ? sempre é usado para dados, não nome de colunas ou tabelas.