Nos meus métodos de Classe :Ex: Salvar(),Atualizar(),Deletar()…eu sempre declaro uma variavel local de PreparedStatement pra cada método, como vcs podem ver na função logo abaixo, e no bloco finally eu fecho ela com o método close()…Só que eu não sou obrigado a fechar o PreparedStatement , né !!! Como vcs fazem quando usam um preparedStatement ? Vcs fazem como eu faço ? Ou declara um PreparedStatement que vale pra classe toda ?
E o que acontece se eu não fechar o PreparedStatement ?
public void Metodo ( ){
PreparedStatement st = null;
try{
st = Conexao.getConexao().prepareStatement(
“Select …”
ResultSet resultset = st.executeQuery();
.............//comandos.................
.............//comandos.................
}
catch(SQLException e){
}
finally{
try{
if(st != null)
st.close();
}
catch(SQLException e){
}
}
return;
}
Uma outra dúvida que me aconteceu…estou fazendo o seguinte:
st = Conexao.getConexao().prepareStatement(
Select max(id) from CLIENTE) ;
ResultSet resultset = st.executeQuery();
if(resultset.next()){
primaryKey = resultset.getInt(1) + 1;
}
Quando a tabela CLIENTE tá vazia, a condição IF é executada...pq ? Como faço pra que ela não seja executada quando a tabela esta vazia?
Olha, eu te daria uma sugestão que simplesmente eliminaria a necessidade do if. Altere seu select para
Desta forma já virá do banco o valor do último incrementado em 1. O problema é que se não houver registros na tabela cliente isto resultaria em nulo, ele não te retornaria 1. Mas isso também é fácil de resolver, se você procurar por uma função no banco que substitua nulo por 0. Se fosse no Oracle, por exemplo, ficaria assim:
Sobre sua dúvida anterior, o jeito que você faz não tem problema. Eu por exemplo também declaro meus prepareStatement localmente também. Você deve sim sempre fechar o prepareStatement - e do jeito que você faz, usando finally pelo que entendo está correto também. O caso é que você está liberando um recurso no banco que não está mais usando.
Eu uso o MySQL…vc conhece essa função que substitua null por 0 no mysql ?..mas uma coisa não entendi…se a tabela tá vazia, pq ele entra no IF ??:
if(resultset.next())
O método next() não serve pra testar se a tabela está vazia. Em vez dele, use um destes: isAfterLast() ou isBeforeFirst(). Quanto à função do MySql para retornar 0, pelo que pesquisei seria
de acordo com a referência:
http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_nullif