Maison  >  Article  >  base de données  >  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

王林
王林avant
2023-05-27 09:01:302018parcourir

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 ;

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

(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>

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

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>

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer