web-dev-qa-db-fra.com

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 plaît? Voici mon code:

La table:

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 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-ce qui ne va pas? Comment puis-je obtenir la clé générée de cet insert? Merci!

30
user2572526

Pour moi ça marche comme ça (mybatis 3.x) .. L'id doit être réglé incrémentation 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 assignée à la propriété id du pojo) j'utilise:

projectRepository.createEmpty(p, "one", "two");
System.err.print(p.getProjectId() + "\n");
48
T M

Vous pouvez y parvenir de deux manières,

  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 de la balise d'insertion

13
bharanitharan

Solution simple:

Utilisez l'attribut KeyProperty comme objectName.AutoincrementId Comme ci-dessous ...

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

5
Md. Naushad Alam

Si vous jetez un oeil à documentation MyBatis , utilisezGeneratedKeys et keyProperty est ce dont vous avez besoin au moins pour obtenir des données d'incrémentation automatique (pour certaines bases 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 prend en charge qu'une seule colonne. La dernière clé générée sera celle renvoyée par getGeneretadKeys.

En conclusion, dans votre cas, vous devez ajouter uniquement useGeneratedKeys et keyProperty (avec 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 vous rencontrez toujours des problèmes pour récupérer les clés générées, consultez également la documentation du JDBC de mysql (l'ancienne version peut ne pas implémenter getGeneretadKeys).

3
Audrey Carval

Dans le fichier xml Mettez ci-dessous 5 lignes:

<insert id="createPet" parameterType="Java.util.Map"
    useGeneratedKeys="true" keyProperty="id">
    INSERT INTO Pet (NAME, OWNER, SPECIES, SEX, BIRTH)
    VALUES (#{name}, #{owner}, #{species}, #{sex}, #{birth})
</insert>

Créez cette méthode dans Java classe principale et appelez-la dans la méthode principale:

public int createPet(PetDVO petDVO) throws Exception {
    HashMap<String, Object> inputMap = new HashMap<String, Object>();
    inputMap.put("name", petDVO.getName());
    inputMap.put("owner", petDVO.getOwner());
    inputMap.put("species", petDVO.getSpecies());
    inputMap.put("sex", petDVO.getSex());
    inputMap.put("birth", petDVO.getBirth());

    /**
     * Get the sql session and commit the data
     */
    SqlSession sqlSession = getSqlSession();
    sqlSession.insert("createPet", inputMap);
    sqlSession.commit();

    BigInteger newID = (BigInteger)inputMap.get("id");
    return newID.intValue();
}

Mais vous devez créer vous-même la classe PetDVO. C'est ça.

2
Park JongBum

Sous le Mapper Xml, 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
Shubham Verma