web-dev-qa-db-fra.com

Renvoi de valeurs depuis MyBatis <insertion> méthodes mappées

J'ai un projet Java qui utilise MyBatis pour accéder à une base de données PostgreSQL. PostgreSQL permet de retourner les champs d'une ligne nouvellement créée après une instruction INSERT, et je veux l'utiliser pour renvoyer la BIGSERIALid générée automatiquement des enregistrements nouvellement créés. Donc, je change la commande insert dans la fonction XML pour utiliser la fonction PostgreSQL, ajoute un attribut resultType="long" à la balise <insert> et, dans l'interface Java du mappeur, je règle la méthode d'insertion pour renvoyer long au lieu de void.

Lorsque j'essaie d'exécuter ceci, je reçois un org.xml.sax.SAXParseException disant que Attribute "resultType" must be declared for element type "insert".

Maintenant, lorsque je change la balise <insert> en <select>, tout fonctionne bien, mais cela ne me dérange pas que j'utilise la balise <select> pour exécuter une instruction INSERT.

Existe-t-il un moyen de faire en sorte que les méthodes mappées sur les balises <insert> renvoient des résultats, ou MyBatis n'est-il pas conçu pour cela et que je devrais simplement les conserver sous forme de balises <select>?

12
Idan Arye

Le type de retour de la méthode d'insertion mappée peut être void ou int (auquel cas, il retournera le nombre de lignes insérées). Vous pouvez utiliser le mécanisme suivant pour renvoyer l'id généré:

<insert id="insert" parameterClass="MyParameter">
  <selectKey order="AFTER" keyProperty="id" resultType="long">
    SELECT currval('my_seq')
  </selectKey>
  INSERT INTO mytable(col1, col2) VALUES (#{val1}, #{val2})
</isnert>

Cela définira la colonne id générée sur la propriété id de votre classe de paramètres. Après cela, l'objet que vous avez passé en tant que paramètre aura généré id défini dans sa propriété.

18
partlov

Vous pouvez utiliser comme suit. En xml

 <insert id="insertNewUser" parameterType="User">
            <selectKey keyProperty="userId" resultType="Integer" order="BEFORE">
                select NEXTVAL('base.user_id_seq')
            </selectKey>
            INSERT INTO base.user(
                user_id, user_name)
            VALUES (#{userId}, #{userName});
    </insert>

En classe Java à partir de laquelle vous avez appelé la méthode à insérer, vous pouvez obtenir la valeur en appelant user.getUserId().

Fondamentalement, la prochaine valeur est stockée dans la variable de l'objet. Here userId inside User.

4
Bhabani

Vous pouvez également utiliser les clés générées:

  <insert id="create" parameterType="Skupina" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        INSERT INTO ODBOR 
            (NAZEV, POPIS, ZKRATKA, WEBROLE, JEODBOR, AKTIVNI)
        VALUES 
            (#{nazev}, #{popis}, #{webrole}, #{webrole}, false, #{aktivni})
  </insert>

Après insertion, le paramètre a la propriété id défini sur la valeur de la colonne id .

1
agad