Estender CallableStatement

Olá,

Pessoal, eu queria colocar o seguinte código abaixo como uma extensão das implementacões da interface CallableStatement. Não acho que dê para fazer isso em Java, mas sei que é algo simples de se fazer em Ruby.

[code]
private void setParameter(String parameterName, Object value) {
if ((parameterName == null) || (parameterName.length() < 1))
return;

    if (value instanceof Integer) {
        if (value == null) {
            statement.setNull(parameterName, java.sql.Types.INTEGER);
        } else {
            statement.setInt(parameterName, (Integer)value);
        }
    } else if (value instanceof String) {
        if (value == null) {
            statement.setNull(parameterName, java.sql.Types.VARCHAR);
        } else {
            statement.setString(parameterName, value);
        }
    } else if (value instanceof Double) {
        if (value == null) {
            statement.setNull(parameterName, java.sql.Types.DECIMAL);
        } else {
            statement.setDouble(parameterName, value);
        }            
    }...

}[/code]

A idéia inicial era estender CallableStatement da seguinte maneira:

package reportgen;

import java.sql.CallableStatement;

/**
 *
 * @author jfbaro
 */
public interface NullAwareCallableStatement extends CallableStatement {
    public void setParameter(String parameterName, Object value);
}

Isso permitiria que eu tivesse um código mais limpo, algo como:

statement.setParameter("name", strName);
statement.setParameter("age", iAgeInYears);
statement.setParameter("salary", dSalaryInDollars);

O problema é descobrir onde eu colocaria a implementação de setParameter, já que não consigo estender as classes que são retornadas quando eu uso:

            NullAwareCallableStatement statement = null;
            ResultSet rs = null;

            statement = (NullAwareCallableStatement)conn.prepareCall("{ call spb_RelVsfDLog(?, ?, ?, ?, ?, ?, ?, ?) }");

Alguma dica?

Obrigado

Cria uma classe que recebe como parametro um objeto CallableStatement. Ai você cria todos os metodos da interface nessa classe chamando internamente esse objeto.

Ai sua chamada fica assim.

  SuaClasse statement = new SuaClasse(conn.prepareCall("{ call spb_RelVsfDLog(?, ?, ?, ?, ?, ?, ?, ?) }"));  

E o resto fica tudo igual.

Pode ser um trabalho chato no inicio, mas você faz somente uma vez e depois nunca mais.

Poxa,

Vendo agora seu exemplo fica até óbvio! :slight_smile:

Fiz o Wrapper e até agora parece me atender perfeitamente.

Muito obrigado