Erro SQL usando o PreparedStatement

Olá a todos.
Estou com um problema no PreparedStatement que não consigo resolver.
Tenho esta classe em java, RecuperarDadosBD, e ela esta me trazendo um erro no SQL, mas não sei o por que desse erro.
Tentei várias coisas.
Se eu deixo sem ‘?’ ele funciona normalmente.
Segue abaixo os codes da classe e do main.

Classe RecuperarDadosBD

public class RecuperarDadosBD {
	
	public static Integer recuperaID(String id, String banco){
		Connection conexao = new ConnectionFactory().getConnection();
		
		String sql = "SELECT max(?) MAX FROM ?" ;
		
		try{
			PreparedStatement stmt = conexao.prepareStatement(sql);
			stmt.setString(1, id);
			stmt.setString(2, banco);
			
			ResultSet rs = stmt.executeQuery();
			rs.first();
			return rs.getInt("MAX") + 1;
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}	
}

Main

public static void main(String[] args) {
		String id = "id_recurso";
		String banco = "recursos";
		
		
		Recurso recurso = new Recurso();
		
		
		recurso.setCodigoRecurso(RecuperarDadosBD.recuperaID(id, banco));
		
		System.out.println(recurso.getCodigoRecurso());
	}

Desde já agradeço aos que responderem o tópico.
Obrigado.

[quote=edu_fernandes]Olá a todos.
Estou com um problema no PreparedStatement que não consigo resolver.
Tenho esta classe em java, RecuperarDadosBD, e ela esta me trazendo um erro no SQL, mas não sei o por que desse erro.
Tentei várias coisas.
Se eu deixo sem ‘?’ ele funciona normalmente.
Segue abaixo os codes da classe e do main.

Classe RecuperarDadosBD

public class RecuperarDadosBD {
	
	public static Integer recuperaID(String id, String banco){
		Connection conexao = new ConnectionFactory().getConnection();
		
		String sql = "SELECT max(?) MAX FROM ?" ;
		
		try{
			PreparedStatement stmt = conexao.prepareStatement(sql);
			stmt.setString(1, id);
			stmt.setString(2, banco);
			
			ResultSet rs = stmt.executeQuery();
			rs.first();
			return rs.getInt("MAX") + 1;
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}	
}

Main

public static void main(String[] args) {
		String id = "id_recurso";
		String banco = "recursos";
		
		
		Recurso recurso = new Recurso();
		
		
		recurso.setCodigoRecurso(RecuperarDadosBD.recuperaID(id, banco));
		
		System.out.println(recurso.getCodigoRecurso());
	}

Desde já agradeço aos que responderem o tópico.
Obrigado.[/quote]

Não é porque vc ta passando o ID como String não ???

stmt.setString(1, id);  

Mas não teria como eu passar de outra forma.
Pq o sql completo seria assim.

SELECT max(id_recurso) MAX FROM recursos

Entendeu?
Se eu faço isso ele não dá erro. Mas ao usar ‘?’ ele gera uma Exception.

Obrigado pela resposta.

posta aí o erro gerado,

mas eu acredito que o preparedstatement esteja traduzindo para

max(‘id_recurso’), visto o uso de setString

Erro.

Exception in thread "main" java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 ''recursos'' at line 1
	at br.com.fatec.finantec.jdbc.RecuperarDadosBD.recuperaID(RecuperarDadosBD.java:25)
	at TestaRecurso.main(TestaRecurso.java:15)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 ''recursos'' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
	at com.mysql.jdbc.Util.getInstance(Util.java:384)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2696)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2105)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2264)
	at br.com.fatec.finantec.jdbc.RecuperarDadosBD.recuperaID(RecuperarDadosBD.java:20)
	... 1 more

Penso que não podes usar ? no nome da tabela

Em verdade te digo que com o prepared statement você não consegue passar o nome da tabela como parâmetro não. Se tiveres que executar teu select em várias tabelas e fazer esta troca dinamicamente, terás de buscar outra forma. Se a lista de tabelas for previamente conhecida e fixa, você deverás deixar preparada um comando sql para cada e selecionar qual executar dependendo da tabela desejada - esta é só uma de algumas abordagens…

Humm…
Entendii
Entao não tenho essa possibilidade com o Prepared.
Obrigado pela ajuda.
Abraços.

Não seria:

String sql = “SELECT max(?) as MAX FROM ?” ;

ao inves de

String sql = “SELECT max(?) MAX FROM ?” ;

O Ademilton tem razão.
Eu tentei aqui de todas as formas e não tem como.
Pelo seguinte.

Executei o seguinte SQL no banco

SELECT max(id_recursos) MAX FROM ‘recursos’
E ele não funciona. Não posso ter ‘’(aspas simples) na declaração do banco.
Pelo que entendi do Prepared ele executa a query da seguinte forma.

SELECT max(?) MAX FROM ? = SELECT max(‘id_recurso’) MAX FROM ‘recursos’.

Por isso dá o erro.

De qualquer forma obrigado.
E respondendo sua pergunta não precisa do AS.
Se quiser testar verá que é a mesma coisa.
Abraço e obrigado pela resposta.