При вызове хранимой процедуры в mybatis возникает ошибка - PullRequest
0 голосов
/ 09 мая 2019

Я разрабатывал с использованием spring-boot и mysql (8.0.15 для win64).Я написал и выполнил обработку для вызова хранимой процедуры mysql в mybatis (3.5.0), но number Параметр номер 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;
}


}

■ Dao

public interface testDao{

  public Result testSP(String id,String name);

}

■ xml (sql query)

<?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>
....

■ testcode

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

1 Ответ

0 голосов
/ 10 мая 2019

Предполагается, что эти значения 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"));
...