how can I get the generated key of an insert with MyBatis? I read many pages about this question but I'm still blocked, could anyone help me, please? This is my code:
The table:
ID_ERROR long primary key
DATE timestamp
TYPE varchar
MESSAGE varchar
SOURCE varchar
The 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;
The 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);
The 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>
What is wrong? How can I get the generated key of this insert? Thanks!
If you take a look at MyBatis documentation, useGeneratedKeys and keyProperty is what you need at least to get auto increment data (for some database, you will need to add keyColumn).
As you can see, useGeneratedKeys depends on if/how is implemented the getGeneretadKeys method of the dataBase's JDBC.
For exemple, with mysql or H2, getGeneretadKeys support only one column. The last generated key will be the one return by getGeneretadKeys.
In conclusion, in your case you need to add only useGeneratedKeys and keyProperty (with ID_ERROR auto_increment):
Mapper.xml
Interface.java
If you still get some issue to retrieve generated Keys, check also the documentation of mysql's JDBC (older version may not implement getGeneretadKeys).
Under the Mapper Xml, use the query :
Java Side
You can achieve this by two ways,
By using
useGeneratedKeys="true", keyProperty="id", keyColumn="id"
keyProperty
refers to the POJO variable name andkeyColumn
refers to generated column name in databaseBy using
<selectKey/>
inside insert tagFor me it is working like this (mybatis 3.x) .. The id must be set auto increment in mysql table
NOTE
keyProperty="project.projectId"
anduseGeneratedKeys="true"
my interface is:
finally to get the value (that will be automatically assigned to the pojo's id property) i use:
In the xml file Put below 5 lines:
Create this method in Java main class and call it in the main method:
But you should create PetDVO class yourself. That is it.
Please follow below steps:
Create Error POJO with id as attribute
Replace returnId to error as below,
Change keyProperty="ID_ERROR" to keyProperty="error.id"
Remove
You will get inserted
id
inerror.id