MyBatis, comment obtenir la clé générée automatiquement d'un insert? [MySql]
Comment puis-je obtenir la clé générée d'un insert avec MyBatis? J'ai lu beaucoup de pages sur cette question mais je suis toujours bloqué, quelqu'un pourrait-il m'aider, s'il vous plait? C'est mon code:
Le tableau:
ID_ERROR long primary key
DATE timestamp
TYPE varchar
MESSAGE varchar
SOURCE varchar
Le 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;
Le mappeur.java:
public void insertRecord(@Param("returnedId") Long returnedId, @Param("timestamp")Timestamp timestamp,@Param("type") String type,@Param("message") String message,@Param("source") String source);
Le mappeur.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-ce qui ne va pas? Comment puis-je obtenir la clé générée de cette insertion? Merci!
7 réponses
Si vous voulez obtenir le générés clé primaire, vous devez passer les arguments par Map
ou POJO Object
public void insertRecord(Map<String, Object> map);
Lorsque vous appelez la méthode de mappage, mettez des valeurs sur Mappage.
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");
Pour moi, cela fonctionne comme ceci (mybatis 3.x) .. L'id doit être défini comme incrément automatique dans la table 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"
et useGeneratedKeys="true"
Mon interface est:
public int createEmpty(@Param("project") Project project, @Param("title") String title,
@Param("description") String description);
Enfin pour obtenir la valeur (qui sera automatiquement affectée à la propriété ID du pojo), j'utilise:
projectRepository.createEmpty(p, "one", "two");
System.err.print(p.getProjectId() + "\n");
Vous pouvez y parvenir de deux façons,
-
En utilisant
useGeneratedKeys="true", keyProperty="id", keyColumn="id"
keyProperty
fait référence au nom de la variable POJO etkeyColumn
fait référence au nom de la colonne générée dans la base de données En utilisant
<selectKey/>
à l'intérieur d'insérer la balise
Solution Facile:
Utiliser KeyProperty
attribut objectName.AutoincrementId
Comme ci-dessous...
useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"
Si vous jetez un oeil à la documentation MyBatis, useGeneratedKeys et keyProperty est ce dont vous avez besoin au moins pour obtenir des données d'incrément automatique (pour une base de données, vous devrez ajouter keyColumn).
Comme vous pouvez le voir, useGeneratedKeys dépend si / Comment est implémentée la méthode getGeneretadKeys du JDBC de la base de données.
Par exemple, avec mysql ou H2, getGeneretadKeys ne supporte qu'une seule colonne. La dernière clé générée sera celle retour par getGeneretadKeys.
En conclusion, dans votre cas, vous devez ajouter uniquement useGeneratedKeys et keyProperty (avec ID_ERROR auto_increment):
Mappeur.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 vous rencontrez toujours un problème pour récupérer les clés générées, vérifiez également la documentation de JDBC de mysql (l'ancienne version peut ne pas implémenter getGeneretadKeys).
Sous le Xml du mappeur, utilisez la requête:
<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>
Côté Java
@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;
}
, Veuillez suivre les étapes ci-dessous:
-
Créer une erreur POJO avec id comme attribut
Remplacer returnId d'erreur comme ci-dessous,
Public void insertRecord(@Param("erreur") Erreur de erreur, @Param("horodatage")horodatage horodatage, @ Param("type") chaîne type, @ Param("message") chaîne message, @ Param ("source") chaîne source);
-
Changer keyProperty= "ID_ERROR"en keyProperty= "error.id"
-
Supprimer
<selectKey resultType="long" order="AFTER" keyProperty="returnedId"> SELECT LAST_INSERT_ID() as returnedId </selectKey>
, Vous obtiendrez inséré id
dans error.id