stored-procedures - MyBatis 映射器调用具有多个 IN 参数的 PROC

标签 stored-procedures mybatis

我正在尝试设计一个小的 CRUD 工具,到目前为止每个方面(Rich Faces UI 和 Managed Beans,
验证、mySQL 数据库等)运行良好,但不是 myBatis 部分。

我对 myBatis 比较陌生,并且手头有用户指南和 API,但是有
仍然有一些东西对我来说不会组合在一起,其中一个是对程序的任何调用
涉及多个 IN 参数。下面是一个例子:

这来自数据库设置脚本:

create procedure MY_FOO_PROC (IN valA VARCHAR(15), IN valB CHAR(1))
    begin
        select blah from blah where blah = valA and blah = valB etc.;
    end 

这来自 MyMapper.java:
public interface MyMapper {
List<MyFooClass> getProgress (
        @Param("valA") String valueA, @Param("valB") String valueB);
}

这来自 MyMapper.xml:
<select id="getProgress" parameterType="map" 
    resultMap="MyFooMap" statementType="CALLABLE">
    { call MY_FOO_PROC (
        #{valA, mode=IN, jdbcType=VARCHAR}
        #{valB, mode=IN, jdbcType=CHAR}
    )}
</select>

最后这个来自我的 DAO 类(class):
public static List<MyFooClass>
        doGetProgress (String valueA, String valueB) {
    SqlSession session = MyBatisConnectionFactory.getInstance().getSqlSessionFactory().openSession();
    EsparMapper mapper = session.getMapper(MyMapper.class);
    List<MyFooClass> listFoo = mapper.getProgress(valueA, valueB);  // line which originates exception below
    session.close();
    return listFoo;
}

结果:
### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect number of arguments for PROCEDURE dbname.MY_FOO_PROC; expected 2, got 1
### The error may involve my.package.names.getProgress-Inline
### The error occurred while setting parameters

我会注意到我也尝试过:
  • 创建一个带有变量 valA 和 valB 以及 getter/setter 的 POJO
    每个,
  • 制作parameterType="PojoClass"在 XML 中,
  • 跳过 session.getMapper()并创建一个 PojoClass 的实例,
  • 并调用 session.selectList("getProgress", pojoInstance);

  • 具有几乎相同的结果(即参数数量错误)。

    对网络搜索的帮助很少,大多数告诉我做我认为我已经做过的事情。

    最佳答案

    我认为您在过程调用中缺少逗号。

    <select id="getProgress" parameterType="map" 
        resultMap="MyFooMap" statementType="CALLABLE">
        { call MY_FOO_PROC (
            #{valA, mode=IN, jdbcType=VARCHAR} , --<--- this
            #{valB, mode=IN, jdbcType=CHAR}
    )} 
    </select>
    

    关于stored-procedures - MyBatis 映射器调用具有多个 IN 参数的 PROC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626678/

    相关文章:

    c# - 如何使用 C# 和 SQL 将表值参数传递给用户定义的数据表

    sql-server - 'CREATE/ALTER PROCEDURE' 必须是查询批处理中的第一条语句

    java - Spring MyBatis关系映射问题

    java - 为什么当记录 > 约 600 条时查询性能急剧下降

    java - 如何使用 mybatis 映射表示链表的结果集?

    mysql - MySQL 存储函数中的十六进制数字文字

    python - 如何在 Python 中从 Azure Function 调用 Cosmos DB 存储过程?

    MySQL 存储过程,游标未打开 (1326)

    sql - MyBatis 重用查询来获取 count(*)

    mybatis foreach 但提交单独的插入