Tutorial Retirando Sql do seu código JAVA

20 respostas
rocha
public class QueryManager {

    protected Properties queries;

    // nao deveria estar hardcodado:
    protected static queryManager = new Querymanager("arquivoMysql.txt");

    private QueryManager(String arquivo) {
        queries = new Properties();
        // le as sqls e guarda!
        queries.load(new FileInputStream(arquivo));
    }

    ...

}
A LINHA
protected static queryManager = new Querymanager
está certa?

20 Respostas

Rafael_Steil

Esta sim. Voce pode definir valores iniciais para os membros da classes no ato da declaracao.

Rafael

danieldestro

Está errada. O correto seria:

protected static Querymanager queryManager = new Querymanager(“arquivoMysql.txt”);

rocha

mas queryManager é um menbro da classe?

Pois o erro q apresenta é q queryManager não está denfinida

Rafael_Steil

danieldestro:
Está errada. O correto seria:

protected static Querymanager queryManager = new Querymanager(“arquivoMysql.txt”);

Bom… eu considerei que ele apenas abreviou o codigo do exemplo :stuck_out_tongue:

Rafael

rocha

Blz valeu e desculpe pela inocencia…rsr

Rafael_Steil

OK, mas e ai? conseguiu resolver o problema / duvida?

Rafael

danieldestro

Rafael Steil:
Bom… eu considerei que ele apenas abreviou o codigo do exemplo :stuck_out_tongue:

Rafael

Ñháááaáaaaaaaa

rocha

PreparedStatement ps = manager.getPreparedStatement(conn, USUARIO_SELECT_BY_NAME); ps.setString(1, "Joaozinho"); // poderia ser setObject, recomendo! ResultSet rs = ps.executeQuery();

Pessoal não entendi o q é USUARIO_SELECT_BY_NAME neste exemplo…

danieldestro

É um atributo que contém a chave que identifica o SQL configurado no arquivo.

rocha

Legal se meu arquivo está configurado assim:

cliente.insert=INSERT INTO tblcliente (idcliente, idempresa, nome, cnpj)values (?, ?, ?, ?)
cliente.select*=SELECT tc.* FROM tblcliente tc where tc.idcliente = tc.idcliente order by nome
cliente.selectNome=SELECT tc.* FROM tblcliente tc where tc.idcliente = tc.idcliente AND nome LIKE ? order by nome
cliente.selectCnpj=SELECT tc.* FROM tblcliente tc where tc.idcliente = tc.idcliente AND cnpj LIKE ? order by nome

como eu faço para indentificar a 1º sql

assim cliente.insert

Rafael_Steil

Tenha sempre em mente que esse arquivo de queries vc vai carregar atraves da classe Properties (java.util.Properties). Ai, para pegar a query “cliente.insert”, simplesmente faca

String query = props.getProperty("cliente.insert");

onde “props” eh a instancia do java.util.Properties.

Rafael

rocha

Blz....

Agora é a última:

qdo tenho um arquivo assim:

cliente.selectNome=SELECT tc.* FROM tblcliente tc where tc.idcliente = tc.idcliente AND ? LIKE ? AND ? LIKE ? order by nome

dai faço isso:

String query = props.getProperty("cliente.selectNome");

PreparedStatement ps = ger.getPreparedStatement(conexao, query);
ps.setString(1, "nome");

Como faço para substituir os demais ? nesta mesma linha ps.setString(1, "nome"); é possível?

danieldestro

Os “?” só podem ser usados em lugares pare se atribuirem valores para uma cláusula de compração, por exemplo e não para o nome de tabelas ou colunas.

Rafael_Steil

Os numeros sao pela ordem. Portanto, se vc tem

INSERT INTO tabela (campo1, campo2, campo3) VALUES (?, ?, ?)

o p.setXxx(1, valor) vai substituir o primeiro ?, p.setXxx(2, outroValor) vai para o segundo ? e assim por diante.Porem, algumas consideracoes sobre o teu exemplo: o setString() coloca aspas automaticamente na hora de substituir o respectivo ? (e essa eh uma grande vantagem, ja que vc ganha em seguranca). Logo, isso significa que fazer

.... AND ? = ?

onde o primeiro no lugar do primeiro ? vc deseja que seja colocado o nome do campo nao vai funcionar da maneira esperada, ja que o resultado, apos a substituicao, sera algo como

... AND 'nomeDoCampo' = ?

veja que vai ficar com aspas. Nesses casos de queries montadas dinamicamente, vc vai ter que fazer concatenacao de Strings mesmo. O mesmo vale para o LIKE. Voce nao vai ter sucesso com a expressao

... AND campo LIKE %?%

pelo mesmo lance em relacao ao funcionamento do setString(). A solucao para isso eh passar os % pelo setString, como abaixo:

p.setString(1, "%" + variavelComOValor + "%");

isso vai dar conta do recado. Note que vc nao passa as aspas, e sim deixa que a o PreparedStatement faca isso apra voce.

Sobre montar a query dinamicamente quando vc nao sabe de antemao o nome do campo a ser usado, isso somente eh “valido” quando vc vai estar concatenando o nome do campo, e nao o valor, o qual deve ainda ser feito via PreparedStatement.
O teu exemplo

cliente.selectNome=SELECT tc.* FROM tblcliente tc where tc.idcliente = tc.idcliente AND ? LIKE ? AND ? LIKE ? order by nome

pode entao ser feito assim:

cliente.selectNome=SELECT tc.* FROM tblcliente tc where tc.idcliente = tc.idcliente AND #CAMPO# LIKE ? AND #OUTRO_CAMPO# LIKE ? order by nome

onde vc vai mudar, via codigo Java, as string #CAMPO# e #OUTRO_CAMPO# pelo nome do campo. Algo como

String query = props.getProperty("cliente.selectNome");
query = query.replaceAll("#CAMPO#", "nomeDoCampo");
query = query.replaceAll("#OUTRO_CAMPO#", "nomeDoOutroCampo");

PreparedStatement p = conn.prepareStatement(query);
p.setString(1, "%" + like1 + "%");
p.setString(2, "%" + like2 + "%");

ResultSet rs = p.executeQuery();

Rafael

rocha

Valeu Rafael e Daniel!!!

dahenz

Pessoal!!! Estou implementando esse mesmo código, mas estou tendo erro na linha 4:

public class QueryManager {

	protected Properties queries;
	protected static QueryManager queryManager = new QueryManager("arquivoMysql.txt");
	
	private QueryManager(String arquivo) throws FileNotFoundException, IOException{
		
		queries = new Properties();
		queries.load(new FileInputStream(arquivo));
		
	}
	
	public PreparedStatement getPreparedStatement(Connection con, String queryName) throws SQLException{
		
		String query = this.queries.getProperty(queryName);
		
		return (PreparedStatement) con.prepareStatement(query) ;
		
	}

Penso eu que não é permitido instanciar um objeto estático da minha própria classe, pois quando tiro static o erro some!!!

Alguém pode me dar uma luz?? :)

Obrigado

Rafael_Carneiro

Você pode fazer isso sim, qual a exceção que está lançando?

dahenz

Olá Rafael!!!

Ele fica com um erro no código, e quando eu pressiono ctrl+1 na linha para pegar uma sugestão do eclipse, ele não me passa sugestão alguma…

Falta alguma biblioteca ou algo parecido???

Obrigado

dahenz

Bah cara!!! manezisse minha… esquece :wink:

F_io_Henrique

Vai ficar acessando o hard disk toda vez que fizer uma query mesmo? E o cache?

Também não entendi a vantagem, pois sempre que você tiver que incluir um novo campo na query, você tera que implementar isso na classe também para fornecer o valor do parametro, compilar e fazer deploy.

IMHO ;(

Criado 11 de março de 2005
Ultima resposta 12 de fev. de 2009
Respostas 20
Participantes 6