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 BIGSERIAL
id
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>
?
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é.
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.
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 .