update stored resultmap parameter example java mysql insert mybatis

java - stored - parameters mybatis



MyBatis, ¿cómo obtener la clave generada automáticamente de un inserto? (7)

Bajo el Mapper Xml, use la consulta:

<insert id="saveDemo" parameterType="com.abc.demo" useGeneratedKeys="true" keyProperty="demoId" keyColumn="DEMOID"> INSERT INTO TBL_DEMO (DEMONAME,DEMODESCRIPTION) VALUE (#{demoName},#{demoDescription}) <selectKey keyProperty="demoId" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID(); </selectKey> </insert>

Java Side

@Override public boolean saveDemo(Demo demo) { boolean status = false; SqlSession session = this.sqlSessionFactory.openSession(); try { DemoMapper mapper = session.getMapper(DemoMapper.class); mapper.saveDemo(demo); session.commit(); status = true; } catch(PersistenceException e) { System.out.println(e); } finally { session.close(); } return status; }

¿Cómo puedo obtener la clave generada de un inserto con MyBatis? Leí muchas páginas sobre esta pregunta pero todavía estoy bloqueado, ¿podría alguien ayudarme, por favor? Este es mi código:

La mesa:

ID_ERROR long primary key DATE timestamp TYPE varchar MESSAGE varchar SOURCE varchar

El dao

Long returnedId = 0L; MyMapper myMapper = this.sqlSession.getMapper(MyMapper.class); myMapper.insertRecord(returnedId, Utils.now(), t.getClass().getName(), t.getMessage(), c.getName()); return returnedId;

El mapper.java:

public void insertRecord(@Param("returnedId") Long returnedId, @Param("timestamp")Timestamp timestamp,@Param("type") String type,@Param("message") String message,@Param("source") String source);

El mapper.xml

<insert id="insertRecord" parameterType="map" useGeneratedKeys="true" keyProperty="ID_ERROR"> INSERT INTO errors ( DATE, TYPE, MESSAGE, SOURCE ) VALUES ( #{timestamp}, #{type}, #{message}, #{source} ) <selectKey resultType="long" order="AFTER" keyProperty="returnedId"> SELECT LAST_INSERT_ID() as returnedId </selectKey> </insert>

¿Qué está mal? ¿Cómo puedo obtener la clave generada de este inserto? ¡Gracias!


Para mí, funciona de esta manera (mybatis 3.x). El ID debe configurarse como incremento automático en la tabla mysql.

<insert id="createEmpty" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID"> INSERT INTO PROJECT (TITLE,DESCRIPTION) VALUES (#{title},#{description}) </insert>

NOTE keyProperty="project.projectId" y useGeneratedKeys="true"

mi interfaz es:

public int createEmpty(@Param("project") Project project, @Param("title") String title, @Param("description") String description);

Finalmente, para obtener el valor (que se asignará automáticamente a la propiedad de identificación de pojo), uso:

projectRepository.createEmpty(p, "one", "two"); System.err.print(p.getProjectId() + "/n");


Por favor siga los siguientes pasos:

  1. Crear error POJO con id como atributo

  2. Reemplace returnId a error como abajo,

public void insertRecord (@Param ("error") Error, @Param ("timestamp") Timestamp timestamp, @ Param ("type") Tipo de cadena, @ Param ("message") Mensaje de cadena, @ Param ("source" ) Fuente de cadena);

  1. Cambie keyProperty = "ID_ERROR" a keyProperty = "error.id"

  2. retirar

    <selectKey resultType="long" order="AFTER" keyProperty="returnedId"> SELECT LAST_INSERT_ID() as returnedId </selectKey>

Obtendrá id insertada en error.id


Puedes lograr esto de dos maneras,

  1. Al usar useGeneratedKeys="true", keyProperty="id", keyColumn="id"

    keyProperty refiere al nombre de la variable POJO y keyColumn refiere al nombre de la columna generada en la base de datos

  2. Usando <selectKey/> dentro de la etiqueta insert


Si desea obtener la clave principal generada, debe pasar los argumentos por Map u POJO Object

public void insertRecord(Map<String, Object> map);

Cuando llame al método de mapeo, ponga valores a mapear.

Map<String, Object> map = new HashMap<String, Object>(); map.put("returnedId", 0); map.put("message", message); // other paramters mapper.insertRecord(map); return map.get("returnedId");


Si echa un vistazo a la documentación de MyBatis , useGeneratedKeys y keyProperty es lo que necesita al menos para obtener datos de incremento automático (para algunas bases de datos, deberá agregar keyColumn ).

Como puede ver, useGeneratedKeys depende de si / how está implementado el método getGeneretadKeys del JDBC de dataBase.

Por ejemplo, con mysql o H2, getGeneretadKeys solo admite una columna. La última clave generada será la que devuelva getGeneretadKeys.

En conclusión, en su caso, debe agregar solo useGeneratedKeys y keyProperty (con ID_ERROR auto_increment):

Mapper.xml

<resultMap type=''pathToJavaClass/Error'' id=''error''> <id property=''id'' column=''ID_ERROR'' /> <result property=''timestamp'' column=''DATE'' /> <result property=''type'' column=''TYPE''/> <result property=''message'' column=''MESSAGE''/> <result property=''source'' column=''SOURCE''/> </resultMap> <insert id="insertRecord" parameterType="error" useGeneratedKeys="true" keyProperty="id"> INSERT INTO errors ( DATE, TYPE, MESSAGE, SOURCE ) VALUES ( #{timestamp}, #{type}, #{message}, #{source} ) </insert>

Interface.java

public void insertRecord(@Param("error") Error error);

Si aún tiene algún problema para recuperar las claves generadas, consulte también la documentación de JDBC de mysql (la versión anterior puede no implementar getGeneretadKeys).


Solución fácil:

Use el atributo KeyProperty como objectName.AutoincrementId como a continuación ...

useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"