在mybatis中调用存储过程时发生错误

时间:2019-05-09 14:34:56

标签: spring-boot 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());

1 个答案:

答案 0 :(得分:0)

应该将这些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"));