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:
Crear error POJO con id como atributo
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);
Cambie keyProperty = "ID_ERROR" a keyProperty = "error.id"
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,
Al usar
useGeneratedKeys="true", keyProperty="id", keyColumn="id"
keyProperty
refiere al nombre de la variable POJO ykeyColumn
refiere al nombre de la columna generada en la base de datosUsando
<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"