mybatis调用存储过程出错

An error occurs when calling stored procedure in mybatis

我使用 spring-boot 和 mysql(win64 为 8.0.15)进行开发。 我在 mybatis(3.5.0) 中编写并执行了调用 mysql 存储过程的处理,但是 「参数编号 3 不是 OUT 参数;嵌套的异常是 java.sql.SQLException” 被显示并且它不能正常工作。 程序的写法或者mybatis的使用有什么问题请告诉我

■存储过程(mysql)

CREATE PROCEDURE testSP(IN id TEXT,IN name TEXT,OUT out0 INTEGER,OUT out1 INTEGER)
BEGIN
 SET out0 = 0;
 SET out1 = 0;
END;

■Result.java

public class Result{

private int out0;
private int out1;

public int getOut0(){
  return out0;
}

public void setOut0(int out0){
  this.out0 = out0;
}

public int getOut1(){
  return out1;
}

public void setOut1(int out1){
  this.out1 = out1;
}


}

■道

public interface testDao{

  public Result testSP(String id,String name);

}

■xml(sql查询)

<?xml version>.....
<select id ="testSP" resultType="Result" statementType="CALLABLE">

{call testSP(
  #{id,mode=IN,jdbcType=VARCHAR},
  #{name,mode=IN,jdbcType=VARCHAR},
  #{out0,mode=OUT,jdbcType=INTEGER},
  #{out1,mode=OUT,jdbcType=INTEGER}
 )
}
</select>
....

■测试代码

testDao testdao = new testDao();
System.out.println(testdao.testSP("testid","testname").getOut0());
System.out.println(testdao.testSP("testid","testname").getOut1());

这些 OUT 值应该设置为参数对象。有关详细信息,请参阅 doc

因此,您需要将 POJO 或 Map 传递给映射器方法。

void testSP(Param param);
// or
void testSP(Map<String, Object> param);

如果使用 POJO,它必须具有所有 IN 和 OUT 参数。

public class Param {
  private String id;
  private String name;
  private int out0;
  private int out1;
  ...

基本上,你在调用方法之前设置 IN 参数,MyBatis 会设置 OUT 参数。

// POJO
Param param = new Param();
param.setId("testid");
param.setName("testname");
mapper.testSP(param);
assertEquals(1, param.getOut0());
assertEquals(2, param.getOut1());
// Map
Map<String, Object> param = new HashMap<>();
param.put("id", "testid");
param.put("name", "testname");
mapper.testSP(param);
assertEquals(1, param.get("out0"));
assertEquals(2, param.get("out1"));