【问题标题】:mybatis return primitive type for procedure callmybatis 为过程调用返回原始类型
【发布时间】:2026-01-25 22:15:02
【问题描述】:

我想在调用 oracle 过程后返回原始类型, 这是我的mybatis界面:

public interface ProcedureMapper {
    int getProcedureResult();
}

我想执行一个过程或函数然后返回状态,我尝试了下面的配置:

<select id="getProcedureResult" statementType="CALLABLE" resultType="int">
        BEGIN   
           EXECUTE IMMEDIATE 'CREATE TABLE temp_tt (id NUMBER(12) )';
           #{status,mode=OUT,jdbcType=INTEGER} := 0;
        EXCEPTION
           WHEN OTHERS THEN 
           #{status,mode=OUT,jdbcType=INTEGER} := -1;
        END;
</select>

不起作用,会抛出异常:

Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property 'status' of 'class java.lang.Class' with value 'null' Cause: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'status' in 'class java.lang.Class'

我知道我可以将 resultType 设置为带有“status”属性的 Java Bean,但我只想返回原始类型而不是 Java Bean,有什么想法吗?

【问题讨论】:

  • 也许这会起作用:*.com/questions/14903159/…
  • 这里似乎有讨论mybatis-user.963551.n3.nabble.com/… - 但结果并不令人鼓舞。
  • 从网址找不到解决办法
  • 正如我所说,这只是一个讨论,结果似乎是,如果您的过程调用实际上没有返回某些内容而只写入 OUT 参数,则这是不可能的。

标签: java mybatis


【解决方案1】:

把你的程序写成这样的字符串 -

public String proc = "BEGIN\n"
+"\tEXECUTE IMMEDIATE 'CREATE TABLE temp_tt (id NUMBER(12) )';\n"
+"\tstatus := 0;\n"
+"\tEXCEPTION\n"
+"\t\tWHEN OTHERS THEN\n" 
+"\tstatus := 0;\n"
+"\tEND;\n"

并在您的 java 代码中执行以下语句,您在 mybatis 中调用该 procuder 的位置

session.getConnection().prepareCall(String.format(proc)).execute();

另一种解决方案是:

另一种解决方案是在数据库中创建您的过程并保存。 并从 mybatis 调用它

<update id="getProcedureResult" statementType="CALLABLE">
    {call some_procedure(
     #{status, javaType=java.lang.Integer, jdbcType=INTEGER, mode=OUT})
    }
</update>

【讨论】:

  • @fudy 是什么原因?这应该有效。但从参考 [链接] 它的好链接:*.com/questions/9548089/…
  • 是的,我知道它可以工作,但是代码风格不好,考虑到灵活性和可维护性,我更喜欢在XML配置文件中配置SQL,这就是我选择Mybatis而不是原始JDBC的原因.