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!

28
demandé sur user2572526 2013-08-29 13:46:17

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");
-3
répondu Larry.Z 2013-08-30 01:18:35

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");
42
répondu T M 2016-03-07 08:19:55

Vous pouvez y parvenir de deux façons,

  1. En utilisant useGeneratedKeys="true", keyProperty="id", keyColumn="id"

    keyProperty fait référence au nom de la variable POJO et keyColumn fait référence au nom de la colonne générée dans la base de données

  2. En utilisant <selectKey/> à l'intérieur d'insérer la balise

11
répondu bharanitharan 2017-01-16 11:09:42

Solution Facile:

Utiliser KeyProperty attribut objectName.AutoincrementId Comme ci-dessous...

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

4
répondu Md. Naushad Alam 2015-11-02 07:36:21

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).

1
répondu Audrey Carval 2018-05-11 12:35:03

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;
}
0
répondu Shubham Verma 2016-05-13 02:43:05

, Veuillez suivre les étapes ci-dessous:

  1. Créer une erreur POJO avec id comme attribut

  2. 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);

  1. Changer keyProperty= "ID_ERROR"en keyProperty= "error.id"

  2. Supprimer

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

, Vous obtiendrez inséré id dans error.id

-1
répondu shola 2015-11-02 07:22:51