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"));
我使用 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"));