Maison > base de données > tutoriel mysql > Comment mybatis appelle-t-il la procédure stockée MySQL et obtient-il la valeur de retour

Comment mybatis appelle-t-il la procédure stockée MySQL et obtient-il la valeur de retour

王林
Libérer: 2023-05-27 09:01:30
avant
2074 Les gens l'ont consulté

mybatis appelle la procédure stockée mysql et obtient la valeur de retour

1 mysql crée la procédure stockée

#结束符号默认;, delimiter $$语句表示结束符号变更为$$
delimiter $$
CREATE PROCEDURE `demo`(IN inStr VARCHAR(100), out ourStr VARCHAR(4000))
BEGIN

SET ourStr = '01';
if (inStr == '02') then
    set ourStr = '02';
end if;

END$$
#结束符号修改
delimiter ;
Copier après la connexion

2 mybatis appelle

(1) méthode d'annotation

// key1和key2都是参数map中的key
// key1是需要传入存储过程的值
// key2是用于接收存储过程返回的值,跟获取自增主键类似
@Select("call demo('${key1}', #{key2, mode=OUT, jdbcType=VARCHAR})")
@Options(statementType = StatementType.CALLABLE)
String getDemoValue(Map<String, Object> map);
Copier après la connexion

(2) méthode xml

 <select id="getDemoValue" resultType="java.lang.String" parameterType="java.util.Map" statementType="CALLABLE">
     call demo(&#39;${key1}&#39;, #{key2, mode=OUT, jdbcType=VARCHAR})
 </select>
Copier après la connexion

mybatis appelle la procédure stockée. procédure et rencontre un retour Le piège de la valeur nulle

Mybatis renvoie une valeur nulle lors de l'appel d'une procédure stockée

Juste une simple procédure stockée

BEGIN
   #SELECT COUNT(*) scount FROM test_user t WHERE t.user_sex=sex;
   SELECT user_name userName FROM test_user t WHERE t.user_sex=sex;
END
Copier après la connexion
Copier après la connexion

Et puis dans le fichier de configuration Mybatis Mapper

 <!--存储过程  输入参数用Map -->
  <select id="queryCountBySexWithProcedure" statementType="CALLABLE" parameterType="java.util.Map" resultType="java.util.HashMap">
      {
           CALL queryCountBySexWithProcedure(
              #{sex,jdbcType=VARCHAR,mode=IN},
              #{userName,jdbcType=VARCHAR,mode=OUT}
           )
    }
  </select>
Copier après la connexion

alors la valeur userName est nulle. Pourquoi est-ce ? Le mappage est effectué dans le fichier mapper.xml et l'attribut user_name marqué en rouge ci-dessous dans la procédure stockée n'est pas automatiquement mappé à la valeur userName, donc l'appel de la valeur userName doit renvoyer null.

BEGIN
   #SELECT COUNT(*) scount FROM test_user t WHERE t.user_sex=sex;
   SELECT user_name userName FROM test_user t WHERE t.user_sex=sex;
END
Copier après la connexion
Copier après la connexion

Alors comment gérer ce problème ? C'est-à-dire ajouter le mot-clé INTO

BEGIN
    #SELECT COUNT(*) scount FROM test_user t WHERE t.user_sex=sex;
         SELECT user_name INTO userName FROM test_user t WHERE t.user_sex=sex;
END
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal