Ayuda con ibatis

Mi pregunta seria la siguiente estoy haciendo un aplicación con java con ibatis el problema al insertar a la base de datos.
        INSERT INTO persona (codigo,ci,nombres,ap_paterno,ap_materno,telefono,celular,fa x,direccion,tipo,mail,fecha) VALUES(#codigo#,#ci#,#nombres#,#ap_paterno#,#ap_materno#,#te lefono#,#celular#,#fax#,#direccion#,#tipo#,#mail#,now());
        INSERT INTO proveedor (idProveedor,nit,descripcion) VALUES (#idProveedor:CHAR#,#nit:int#,#descripcion:TEXT#);
Esta es la inserción que estoy haciendo el primer insert funciona bien cuando lo borro la segunda inserción la del proveedor.
Cuando quiero insertar me sale este mensaje:
02-jul-2009 18:11:29 control.ibatis.SqlMapIbatisDao add
GRAVE: null
com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in control/ibatis/maps/Proveedor.xml.
--- The error occurred while applying a parameter map.
--- Check the InsertarProveedor-InlineParameterMap.
--- Check the statement (update failed).
--- Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; INSERT INTO proveedor (idProveedor, nit, descripcion) VALUES (54654799,4' at line 1
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; INSERT INTO proveedor (idProveedor, nit, descripcion) VALUES (54654799,4' at line 1
lo provee de varias formas pero siempre me aparece este caracter ' y no se que hacer
les agradesco de antemano

1 respuesta

Respuesta
1
Suponiendo que los dos insert estén definidos en el mismo xml ("Proveedor.xml"), que funcione el primer insert es buena señal porque eso significa que la petición llega correctamente al framework del ibatis y lo tienes bien configurado.
Ahora nos fijamos en el insert que falla:
INSERT INTO proveedor (idProveedor,nit,descripcion) VALUES (#idProveedor:CHAR#,#nit:int#,#descripcion:TEXT#);
.
Tienes definido tres parámetros, el primero es un CHAR, el segundo es un int y el tercero un TEXT
.
Si nos fijamos en esta línea: INSERT INTO proveedor (idProveedor, nit, descripcion) VALUES (54654799,4' at line 1
y el error se produce porque no se le está pasando correctamente los valores a los parámetros: o no está bien mapeado el dao o el parameterClass o lo que estés usando para pasarle los parámetros, o el insert en el fichero "control/ibatis/maps/Proveedor.xml" no está bien definido, o simplemente puede ser que al hacer la petición al insert no le está llegando bien algún parámetro porque se le esté enviando mal.
.
1º Comprueba que todo esté bien mapeado (fíjate en el primer insert que te funciona bien para cogerlo de ejemplo)
2º Si todo está bien mapeado, comprueba que la definición del insert en el xml. La sintaxis del tag <insert>, etc...
3º Tracea todos los parámetros antes de hacer la petición al ibatis y comprueba que todo esté correcto (no le envías null en ningún parámetro, el número de parámetros es tres, los tipos coinciden con los que tienes mapeado, etc, etc...)
.
Si después de comprobar todo esto si que produciéndose el error intenta tracear el error y los valores de los parámetros en los logs.
Estas en lo correcto si borro el segundo insert funciona bien inserta la persona
esta es lo nuevo que ise y me sale ese error
<insert id="InsertarProveedor" parameterClass="Proveedor">
        INSERT INTO persona VALUES(#codigo#,#ci#,#nombres#,#ap_paterno#,#ap_materno#,#telefono#,#celular#,#fax#,#direccion#,#tipo#,#mail#,now());
        INSERT INTO proveedor VALUES (#idProveedor:CHAR#,#nit:int#,#descripcion:TEXT#);
  </insert>
--- The error occurred in control/ibatis/maps/Proveedor.xml.  
--- The error occurred while applying a parameter map.  
--- Check the InsertarProveedor-InlineParameterMap.  
--- Check the statement (update failed).  
--- Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';         INSERT INTO proveedor VALUES (3214567,789654321,'Proveedor de ')' at line 1
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';         INSERT INTO proveedor VALUES (3214567,789654321,'Proveedor de ')' at line 1
como ves me sigue saliendo esa comilla simple
saludos
Muéstrame cómo haces la llamada a insertarProveedor. Por el primer error y por el segundo, me hace pensar que es muy posible que esté ahí el error.
Haz una prueba, cambia el campo text directamente por un literal:
INSERT INTO proveedor VALUES (#idProveedor:CHAR#,#nit:int#,'QQQ');
Si te sigue fallando, muéstrame el parameterClass Proveedor.
Este es el método donde hago la llamada
public int add(Object obj){
        try {
            if (existsObject(obj)) {
                return client.update("Modificar" + StringUtils.getObjectName(obj), obj);
            } else {//El objecto no existe portanto se realiza la inserción de datos
                try {
                    obj.getClass().getMethod("setCodigo", new Class[] {String.class}).invoke(obj,getId(obj));
                } catch (Exception ex) {
                    Logger.getLogger(SqlMapIbatisDao.class.getName()).log(Level.SEVERE, null, ex);
                }
                client.insert("Insertar" + StringUtils.getObjectName(obj), obj);
            }
        } catch (Exception ex) {
            Logger.getLogger(SqlMapIbatisDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return 0;
    }
y sobre la prueba si le cambio a literal me sigue saliendo al ultimo esa comilla simple
esta es la nueva modificacion que hise al insert
<insert id="InsertarProveedor" >
        NSERT INTO persona VALUES(#codigo#,#ci#,#nombres#,#ap_paterno#,#ap_materno#,#telefono#,#celular#,#fax#,#direccion#,#tipo#,#mail#,now());
        INSERT INTO proveedor VALUES (#idProveedor:INT#,#nit:INT#,#descripcion:VARCHAR#);
  </insert>
Agradezco su ayuda
De nada. También me sirve a mi para ir recordando cosas que tenía algo olvidadas.
.
Ok, acabo de ver lo de la comilla simple:
No es que ibatis esté intentando insertar la comilla simple en la base de datos, lo que sucede es que en la descripción de la excepción, te muestra la línea que falla entrecomillada. Si te fijas, después del near abre comilla simple, después te muestra la línea que falla tal y como está mandandola a la base de datos, y por último, cierra la comilla simple y te indica en número del línea (la 1 se corresponde con el tag <insert ...>
near ';         INSERT INTO proveedor VALUES (3214567,789654321,'Proveedor de ')' at line 1
Por este lado, caso cerrado al tema de la comilla.
.
Ahora vamos con el error del insert. He estado repasando una aplicación en la que también tuve que pelearme con ibatis hace un par de años y recordaba que también tuve un problema similar, y repasando la sintaxis del insert de ibatis creo saber cuál es el problema.
El problema que tienes es que estás haciendo 2 inserts en tablas diferentes dentro de un mismo método de ibatis.
Con ibatis, puedes hacer varios inserts dentro de un mismo método pero únicamente sobre en una misma tabla y usando la clausula <iterate> para hacer un bucle sobre uno o varios de los campos del registro a insertar
.
La solución a tu problema es separar los dos inserts en métodos distintos. Para comprobarlo, elimina el primer insert (el que no fallaba) y deja únicamente el segundo insert.
Si estoy en lo cierto y los parámetros que envías son correctos, el insert que falllaba debería funcionar.
.
A ver si hay suerte con esto.
<insert id="InsertarProveedor" >
        <!--INSERT INTO persona VALUES(#codigo#,#ci#,#nombres#,#ap_paterno#,#ap_materno#,#telefono#,#celular#,#fax#,#direccion#,#tipo#,#mail#,now());-->
        INSERT INTO proveedor VALUES (#idProveedor:INT#,#nit:INT#,#descripcion:VARCHAR#);
  </insert>
Hice la prueba y solo deje el segundo insert el de proveedor y realiza la inserción
entonces tendría que realizar dos métodos insert
uno con InsertarProveedor y otro con InsertarPersona
Efectivamente, tienes que separarlos en dos métodos distintos.
.
Otra solución sería definir un procedimiento almacenado en la base de datos que realice todos los inserts y/o updates que quieras, y el método en ibatis sólo tendría que llamar a ese procedimiento. Esto te ofrecería mayor potencia y flexibilidad. La clausula para llamar a procedimientos desde ibatis es
<procedure>
<procedure id="nombre" parameterMap="parameter_map">
{call nombre_procedimiento_almacenado (?, ?, ?, ?, ?, .....)}
</procedure>
.
Gracias.
CREATE FUNCTION insertProveedor(
        codigo varchar( 9 ) ,
        ci int,
        nombres varchar( 35 ) ,
        ap_paterno varchar( 35 ) ,
        ap_materno varchar( 35 ) ,
        telefono int ,
        celular int ,
        fax int ,
        direccion varchar(35) ,
        tipo char(1) ,
        mail varchar(35) ,
        nit INT ,
        descripcion varchar(200))
    RETURNS int
BEGIN
      INSERT INTO persona
            VALUES(
                código,
                ci,
                nombres,
                ap_paterno,
                ap_materno,
                Teléfono,
                Celular,
                Fax,
                Dirección,
                Tipo,
                mail,
                now()
            )
      INSERT INTO proveedor
               VALUES (
                    ci,
                    nit,
                    Descripción
                )
      return 0;
END
ESTA FUNCIÓN EN mysql no se puede correr o es que en mysql no se puede realizar dos inserciones al mismo tiempo.
O tomaría la otra opción de hacer dos insert en ibatis
Saludos
En mysql, en un procedimiento o en una función puedes realizar todo lo que quieras.
Falta el ";" después de los dos insert:
INSERT INTO persona
            VALUES(
                Código,
                Ci,
                Nombres,
                ap_paterno,
                ap_materno,
                Teléfono,
                Celular,
                Fax,
                Dirección,
                Tipo,
                Mail,
                Now()
            );
INSERT INTO proveedor
               VALUES (
                    Ci,
                    Nit,
                    Descripción
                );
Lo demás lo veo correcto. Antes de CREATE FUNCTION, añade la línea:
DROP FUNCTION IF EXISTS insertProveedor
Hola.
Hice muchas pruebas estos días el problema que tuve fue que el procedimiento almacenado no funciona te muestro el código.
DROP FUNCTION IF EXISTS insertProveedor;
CREATE FUNCTION insertProveedor(
        codigo varchar( 9 ) ,
        ci int,
        nombres varchar( 35 ) ,
        ap_paterno varchar( 35 ) ,
        ap_materno varchar( 35 ) ,
        telefono int ,
        celular int ,
        fax int ,
        direccion varchar(35) ,
        tipo char(1) ,
        mail varchar(35) ,
        nit INT ,
        descripcion varchar(200))
    RETURNS int
BEGIN
      INSERT INTO persona
            VALUES(
                código,
                ci,
                nombres,
                ap_paterno,
                ap_materno,
                Teléfono,
                Celular,
                Fax,
                Dirección,
                Tipo,
                mail,
                now()
            );
      INSERT INTO proveedor
               VALUES (
                    ci,
                    nit,
                    Descripción
                );
      return 0;
END
Lo veo y no se que esta mal ya le puse los puntos y comas
También ise otras pruebas insertar en otra base de datos
La que utilice fue PostgreSQL y ahí si funciona se puede insertar la persona y el proveedor a la vez:
Tal vez sea la version de mysql que estoy usando
estoy con el xampp-win32-1.6.6a-installer.exe
La versión del xampp que tienes no es muy antigua. No deberías tener muchos problemas, y más teniendo en cuenta que ha funcionado bien en PostgreSQL
En lugar de una función prueba a usar un procedimiento almacenado, o separa los dos inserts en dos métodos distintos de ibatis y el tema de unirlos en un procedimiento dejarlo para una posterior optimización de tu aplicación.
Acuérdate de puntuar y finalizar la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas