Com relação a sua dúvida na utilização do PreparedStatement, vc pode substituir os ‘?’ pelos respectivos valores utilizando os métodos set’s do objeto PreparedStatement. Por exemplo: neste seu caso vc usaria o método setString(int indice, String str). Todo método setAlgumTipo, espera um índice, que representa a posição do parametro na query; lembrando que diferente dos arrays, os índice do PreparedStatement começa no ‘1’ e não no 0.
Ex:
// Query
String sql = "SELECT * FROM clientes WHERE nome = ? ";
// Aqui é preparada para receber os parâmetros.
PreparedStatement ps = conn.prepareStatement(sql);
// Aqui é setado o valor do parâmetro na query.
ps.setString(1, nome);
// Aqui obtém o retorno do banco.
ResultSet rs = ps.executeQuery();
Espero ter ajudado com a dúvida do PreparedStatement.