如何从MyBatis Java调用存储过程?

4

我遇到了以下错误:

org.mybatis.spring.MyBatisSystemException: 嵌套异常是 org.apache.ibatis.exceptions.PersistenceException:

以及

java.lang.IllegalArgumentException: 映射语句集合不包含值 .."

在使用Java从Mybatis调用存储过程时。

我正在使用PostgreSQL作为数据库和Spring MVC框架。为此,调用存储过程的DAO类为:

Orders orders=new Orders();

程序会自动设置变量orders中的值。

Integer insert= getSqlSession().insert("records",orders);**

我的Mybatis文件看起来像这样:

<insert id="records" parameterType="Orders" statementType="CALLABLE">
 {call fn_records_tbl(#{rId,javaType=Integer,jdbcType=INTEGER,mode=IN},#{state,javaType=String,jdbcType=CHAR,mode=IN},#{uId,javaType=Integer,jdbcType=INTEGER,mode=IN},#{status,javaType=String,jdbcType=CHAR,mode=IN})}
</insert>

我的存储过程语法是:

CREATE OR REPLACE FUNCTION fn_records_tbl(rId integer, state character,uId integer, status character)

RETURNS void AS

$BODY$
DECLARE

    -- my code
BEGIN

    -- my code
END

$BODY$

LANGUAGE plpgsql VOLATILE
COST 100;

ALTER FUNCTION fn_records_tbl(integer, character, integer, character)
OWNER TO mydba;

我的实体类用于传递参数:

 public class Orders implements Serializable {

  private static final long serialVersionUID = 267216928694677437L;
  private Integer uId;
  private Integer rId;
  private String status;
  private String state;

     // here are my setter and getter
 }

你能否在这里添加你的映射器代码并提供完整的错误信息? - Seeta Somagani
2个回答

1

我的存储过程调用语法在MyBatis和存储过程中都是正确的。

由于我使用的是Spring框架,所以由于一些传递依赖关系,我的Java代码中无法从MyBatis调用存储过程。

因此,我检查了我的pom.xml文件以查找传递依赖关系,然后我排除了所有这些依赖关系,为MyBatis使用了最新版本的spring框架。

现在它正常工作。


你能具体说明一下吗?我在使用MyBatis 3和Oracle 11g时遇到了相同的问题。 - greyfox

0
尝试将您的配置从insert更改为select
<select id="records" parameterType="Orders" statementType="CALLABLE">
 {call fn_records_tbl(#{rId,javaType=Integer,jdbcType=INTEGER,mode=IN},#{state,javaType=String,jdbcType=CHAR,mode=IN},#{uId,javaType=Integer,jdbcType=INTEGER,mode=IN},#{status,javaType=String,jdbcType=CHAR,mode=IN})}
</select>

1
这不是问题,我通过更改MyBatis jar的版本来解决它。我得到了最新版本的jar。 - Ruju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接