Foros del Web » Programación para mayores de 30 ;) » Java »

Consulta sobre sp... (CallableStatement)

Estas en el tema de Consulta sobre sp... (CallableStatement) en el foro de Java en Foros del Web. Buenass... estoy haciendo una aplicacion con java, y mysql con procedimientos almacenados... estoy usando en java los Callable Statement por ahora todo perfecto, pero queria ...
  #1 (permalink)  
Antiguo 21/01/2011, 18:19
 
Fecha de Ingreso: diciembre-2010
Mensajes: 31
Antigüedad: 13 años, 4 meses
Puntos: 0
Consulta sobre sp... (CallableStatement)

Buenass... estoy haciendo una aplicacion con java, y mysql con procedimientos almacenados...

estoy usando en java los Callable Statement por ahora todo perfecto, pero queria saber como puedo realizar una abstraccion mas al codigo q tengo, les comento...

tengo diferentes clases con metodos q llaman a una clase de base de datos donde tengo la coneccion y los execute... mi problema esta es q pase todo a procedimientos almacenados y los Callable Statement al setear los valores q voy a mandar al sp diferencian su tipo (entero, string, etc)

por ejemplo en este codigo...

Código PHP:
callStmt = (CallableStatementconexion.prepareCall (array[0]);
 for ( 
byte i=1< array.lengthi++){
 
callStmt.setString(, array[i]);
  } 
esta en la clase de base de datos...

Y en la clase q llama a esta tengo..

Código PHP:
String array[];
array = new 
String[3];
array[
0] = "{call  comprobarExistenciaUsuario(?, ?)}";
array[
1] = "[email protected]";
array[
2] = Enciptador.SHA1(pass); 
Entonces le paso el array, y lo recorro en la clase de bd... Nose si estara bien pero anda...esto lo hago para hacer un poco dinamico el callStmt, pero mi problema esta en como dije en cuando seteo los valores q se usa el .setString, entonces si tengo otro tipo de datos para setear no voy a poder...

si bien el array es de String estaba viendo para armar otro con arrayList y los datos q sean el objeto... esto q hice es para probar pero bueno me trabe ahi en los set

Q se podria hacer'??? yo para no escribir por cada sp de la base un metodo callstmp especifico..

espero q me haya explicado..

saludos!!!
  #2 (permalink)  
Antiguo 21/01/2011, 22:37
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Consulta sobre sp... (CallableStatement)

Hola,

Posiblemente,

Cada variable de Java tienen una clase asignada inclusive los primitivos (autooutboxing), lo que permite saber con exactitud el tipo de datos que contienen.

El enum classNames tendría que contener todos los tipos de clases que deseas usar y pasar a la base de datos, el método proxy se encargaría de regresar el enumerador del nombre de la clase. (Para no utilizar : if (algo == "Integer) else ... etc.) :

Código Java:
Ver original
  1. private enum classNames {
  2.         Integer, String, Object
  3.     }
  4.  
  5.     private classNames proxy(Object o) {
  6.         classNames name = classNames.Object;
  7.         try {
  8.             name = classNames.valueOf(o.getClass().getSimpleName());
  9.         } catch (IllegalArgumentException e) {
  10.         }
  11.         return name;
  12.     }

Con este método podrías hacer diferentes acciones dependiendo del tipo de datos que contiene el objecto "c" :

Código Java:
Ver original
  1. private void callCallableStatement(LinkedList list) throws SQLException {
  2.         // Connection conn = DriverManager.getConnection("");
  3.         // CallableStatement stmt = conn.prepareCall("");
  4.  
  5.         int i = 1;
  6.         for (Object c : list) {
  7.             switch (proxy(c)) {
  8.                 case Integer: // stmt.setInt(i++, (Integer)c); break;
  9.                 case String: // stmt.setString(i++, (String)c); break;
  10.                 default: // stmt.setObject(i++, c); break;
  11.                     System.out.println(proxy(c));
  12.                     System.out.println(c.getClass().getSimpleName());
  13.             }
  14.         }
  15.     }

Y podrías pasar la lista de valores ordenados en relación a la posición que tienen en el Statement, esto es solamente una idea básica que tendrías que mejorar para adecuarla a lo que necesitas,

Código Java:
Ver original
  1. public Main() throws SQLException {
  2.         LinkedList list = new LinkedList();
  3.         list.add(new Integer(100));
  4.         list.add(new String("Hello World!".getBytes()));
  5.         list.add(100L);
  6.         list.add(100);
  7.         list.add(new Byte("5"));
  8.         callCallableStatement(list);
  9.     }

Saludos,

Última edición por HackmanC; 21/01/2011 a las 22:46 Razón: whoops ... auto x out
  #3 (permalink)  
Antiguo 22/01/2011, 15:30
 
Fecha de Ingreso: diciembre-2010
Mensajes: 31
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Consulta sobre sp... (CallableStatement)

Hola... muchisimass gracias, la verdad muy bueno, lo estuve probando y adaptando y todo bien cuando por ejemplo uso String, pero despues me pasan dos cosas...

en primer lugar, al codigo

LinkedList list = new LinkedList();

me lo marca con amarillo y me dice:

Multiple markers at this line
- LinkedList is a raw type. References to generic type LinkedList<E> should be
parameterized
- LinkedList is a raw type. References to generic type LinkedList<E> should be
parameterized

y si me paro arriba me dice: add type arguments to linkeList

Igual si corro todo string anda...

ahora si pongo este codigo

Código PHP:
LinkedList list = new LinkedList();
list.
add ( new String "{call listarOperadores(?)}") );
list.
add ( new Integer (2) ); 
y lo corro

me dice: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

como q cuando recorre el for no me reconoce como Integer...

que podra ser??

saludos y muchas gracias por tu ayuda ya q esto es justo lo q estaba queriendo hacer...


EDITADO: Lo del error ya lo pude solucionar, se ve q fue un error mio.... Lo que me pone con lineas amarillas el warning, no.. Igualmente anda pero bueno me deja esa parte marcada y la unica forma de quitarla es poniendole argumento..

Última edición por sebas84; 22/01/2011 a las 16:19

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:40.