Classe para gerenciar conexão

4 respostas
vitu

Sempre perco muito tempo com acesso a dados do banco, então estou tentando criar uma singleton que possa me poupar algum trabalho. Só que estou com alguns probleminhas no prepareStatement. Se alguém puder me dar um help nesse metodo, agradeço.

// conn e um objeto Connection

	public ResultSet execute(String query, Object... param) {
		try {
			PreparedStatement prepStmt = this.conn.prepareStatement(query);
			for (int x = 0; x < param.length; x++) {
				prepStmt.setObject(x + 1, param[x]);
			}
			return prepStmt.executeQuery();
		} catch (SQLException e) {
			return null;
		}
	}

        //Nas classes que preciso ter persistidas uso algo como:
        private static Cliente get(ResultSet result) {
		Cliente cliente = null;
		try {
			if (result.next()) {
				cliente = new Cliente();
				cliente.setId(result.getLong("id"));
				cliente.setNome(result.getString("nome"));
				cliente.setCpf(result.getLong("cpf"));	
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return cliente;
	}
	
	public static Cliente get(long id) {
		ResultSet result = DataConnection.getInstance()
			.execute("select c.* from c.cliente where c.id = ?", id);
		return get(result);
	}

Sem parâmetros funciona depurei o código mas não sei onde esta o erro.

Futuramente também quero colocar as consultas em um arquivo separado, alguem tem uma boa dica de uma maneira segura de se fazer o mesmo.

4 Respostas

T

A idéia de usar setObject parece boa, mas na prática é melhor ver se seu driver JDBC suporta corretamente setObject.
Em vez disso é melhor usar algo mais nojento, que é checar o tipo de cada Object (instanceof), e chamar o setInt/setString/set… adequado para o tipo do objeto. Não se esqueça que, devido ao autoboxing, quando você passa um “long”, o objeto recebido será um java.lang.Long, e assim por diante.

vitu

Estou testando no postgre utilizando o drive 8.2-506 jdbc4? o mesmo não suporta o setObject?

algo como:

if (param[x] instanceof String)
	     prepStmt.setString(x + 1, param[x].toString());
	else if (param[x] instanceof Long)
	     prepStmt.setLong(x + 1, (Long) param[x]);
        // else ifs para integer blobs etc..
T

Não é que setObject não seja suportado pelo driver JDBC do PostgreSQL. É que não dá para confiar cegamente que ele esteja implementado corretamente em qualquer driver de qualquer banco de dados. E às vezes é interessante ter um comportamento diferente do padrão.

vitu

Agora esta ok obrigado pelas dicas thingol.

Criado 2 de outubro de 2007
Ultima resposta 2 de out. de 2007
Respostas 4
Participantes 2