Prepared statement com "like ?%"

Pessoal à um tempo atrás estava escrevendo um código em java que necessitaria uma pesquisa com “like ‘algum texto’%”

O sendo que o prepared statement utiliza “?” para encontrar os campos a serem setados, tentei fazer algo assim:

"select ... like ?%;"

porém isso não funcionou, fiz uma gambis, concatenando a variavel que era passada por parâmetro à “%”, funcionou, mas isso da brecha para SQL injection.

Como eu faço uma consulta com “%” sem esse problema?

Obrigado pela ajuda!

O jeito certo é concatenar % a variavel com o valor de pesquisa mesmo.
Algo como:

  String sql = "SELECT * FROM tabela WHERE campo LIKE ? "
  //outras coisas
  ps.setString(1, '%' + minhaVariavel + '%');

Isso não abre brecha pra sql injection, pois a concatenação é com um valor constante e ele sempre será entendido como um valor pela query.

1 curtida

e aí, beleza?

tenta assim:

public ResultSet getResultSet(String nome) throws SQLException {

		String sql = "select * from empresa where nome like '%" + nome
				+ "%'order by prioridade";

		PreparedStatement stmt = this.connection.prepareStatement(sql);

		ResultSet rs = stmt.executeQuery();

		return rs;
	}

parece que você está iniciando, talvez possa se inteirar mais de algum framework, quem sabe seja uma boa idéia, se quiser fazer, por exemplo em hibernate com auxílio de Criteria, pode ficar assim:
e você nem precisa se preocupar em tratar PreparedStatement.

[code] @SuppressWarnings(“unchecked”)
public List<Empresa> buscarPorNome(String nome) {

	Criteria query = this.session.createCriteria(Empresa.class).add(
			Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
	return query.list();

}[/code]