PreparedStatement

15 respostas
maikonaraujo

Alguem sabe como utilizar PreparedStatement para querys que utilizam “in”?
Tipo:

SELECT * FROM FUNCIONARIO WHERE ID IN (?,?,?,?)

isto funciona bem??

15 Respostas

raphaelpaiva

já tentou fazer:

ps.setInt(1,80);

ps.setInt(2,100);

ps.setInt(3,110);

ps.setInt(4,255);

abração

Rafael_Steil

Funciona, claro.

Rafael

maikonaraujo

Agora surgiu outra duvida
e se for apenas uma interrogação e o usuário passar um arrayList

ArrayList ids = new ArrayList()
ids.add("func1");
ids.add("func2");

Funcionarios getFuncionarios(ArrayList array) {
   String sql = "select * from funcionario where id in (?) ";
   prepared = conn.prepareStatement(sql);
   prepared.setObject(array);
}

Gostaria de montar algo deste tipo…
alguem tem alguma idéia??
Abraço

Rafael_Steil

Monte a query dinamicamente:

StringBuffer sql = new StringBuffer("select * from funcionario where id in (");

int size = ids.size();

for (int i = 0; i < size - 1; i++) {
    sql.append("?,");
}

sql.append("?)");

PreparedStatement p = conn.prepareStatement(sql.toString());

for (Iterator iter = ids.iterator(); iter.hasNext(); ) {
    // Pega os dados do ArrayList e chame p.setXxx()
}

Rafael

maikonaraujo

hehehe eu queria não ter que montar a query dinamicamente…
Mas pelo visto vou ter q fazer.
Valeu pessoal!

pcalcado

Só uma possível melhoria:

StringBuffer sql = new StringBuffer("select * from funcionario where id in (");



for (Iterator it = ids.iterator();it.hasNext();) {
    sql.append("?");
    if(it.hasNext())sql.append(", ");
}

PreparedStatement p = conn.prepareStatement(sql.toString());

for (Iterator iter = ids.iterator(); iter.hasNext(); ) {
    // Pega os dados do ArrayList e chame p.setXxx()
}
Ironlynx

E ainda dah para melhorar mais(usando o Tiger-J2SE 5.0):

StringBuilder sql = new StringBuilder("select * from funcionario where id in (");

ArrayList<Integer> ids = new ArrayList<Integer>();  
     for (Integer i : ids) 
      sql.append("?");
         { blablabla... }

:slight_smile:

Sami_Koivu
pcalcado:
Só uma possível melhoria:
StringBuffer sql = new StringBuffer("select * from funcionario where id in (");



for (Iterator it = ids.iterator();it.hasNext();) {
    sql.append("?");
    if(it.hasNext())sql.append(", ");
}

PreparedStatement p = conn.prepareStatement(sql.toString());

for (Iterator iter = ids.iterator(); iter.hasNext(); ) {
    // Pega os dados do ArrayList e chame p.setXxx()
}

...e fica melhor ainda se você adicione duas linhas de código :mrgreen:

StringBuffer sql = new StringBuffer("select * from funcionario where id in (");



for (Iterator it = ids.iterator();it.hasNext();) {
    sql.append("?");
    it.next();
    if(it.hasNext())sql.append(", ");
}

sql.append(")");

PreparedStatement p = conn.prepareStatement(sql.toString());

for (Iterator iter = ids.iterator(); iter.hasNext(); ) {
    // Pega os dados do ArrayList e chame p.setXxx()
}

Pois a falta do it.next() resulta em OutOfMemoryError e a falta de adicionar o ")" ao fim do query resultaria em SQLException.

-Sami

pcalcado

Malditos sejam todos os loops infinitos! (pelo menos os meus :mrgreen: )

maikonaraujo

Valeu galera eu tava pensando em colocar as colunas tbm dinamicamente, mas achei que ia ficar muito complicado e dificil de manutenir o código com dois loops uma para as colunas e outro para os atributos.

Valeu pessoal!

E

“manutenir”!!!

aaaaaaaaaaaaaaaaaaaargh :wink:

Prefiro “manter” :stuck_out_tongue:

maikonaraujo

escordeiro:
“manutenir”!!!

aaaaaaaaaaaaaaaaaaaargh :wink:

Prefiro “manter” :stuck_out_tongue:

Que seja!! :smiley:

Sami_Koivu

Eu prefiro não manter/manutenir :wink: só ficar criando um monte de código impossível de manter/manutenir.

pcalcado

Me chamem de burro.

Estou atrás de um bug de OutOfMemory aqui e, oh! O que eu acho?

Tinha que ter uma ferramenta tipo o lint (ou jlint, ou PMD) que consultasse o GUJ para criticar seu código :smiley:

Sami_Koivu

hahaha :smiley: boa ideia, Phillip.

-Sami

Criado 15 de abril de 2005
Ultima resposta 17 de abr. de 2005
Respostas 15
Participantes 7