简体   繁体   English

从java调用oracle存储过程时在mybatis映射器中映射多个输出参数

[英]Mapping multiple out params in mybatis mapper when calling an oracle stored procedure from java

The problem is this, i want to call a stored procedure from java, using mybatis / ibatis, this procedure has multiple OUT params,7 precisely, 2 of them are Numbers, the other 5 Varchars, plus one IN Number param问题是这样的,我想从java调用一个存储过程,使用mybatis/ibatis,这个过程有多个OUT参数,7确切地说,其中2个是数字,其他5个Varchars,加上一个IN数字参数

There is a huge limitation within the context, which is having no Models, just maps and lists, though we can make an exception when calling procedures if necessary.上下文中有一个巨大的限制,它没有模型,只有映射和列表,但如果需要,我们可以在调用过程时例外。 Also, the solution has to be done in java, no xml is being used.此外,解决方案必须在java中完成,没有使用xml。

I've got a springboot app, there is a rest service, which calls a service bean, which invokes the Mapper Interface that defines the call to the procedure i'm trying to execute.我有一个 springboot 应用程序,有一个休息服务,它调用一个服务 bean,它调用 Mapper 接口,该接口定义了对我试图执行的过程的调用。

So far i've tried within the mapper interface mapping the result to Object, List, Maps, using @Result trying to map to a specific result class field by field, but everything failed miserabl... mybatis seems to execute the procedure without errors but nothing is returned unfortunately.到目前为止,我已经尝试在映射器接口中将结果映射到 Object、List、Maps,使用 @Result 尝试逐个字段映射到特定的结果类,但一切都失败了……mybatis 似乎没有错误地执行该过程但不幸的是什么都没有返回。

I'm posting my latest state which consisted in trying to map the result to a custom class, it seems to execute the procedure, but null is returned我正在发布我的最新状态,其中包括尝试将结果映射到自定义类,它似乎执行了该过程,但返回了 null

//custom class
public class ProcClass {
    Integer p_tipo_cliente;
    Integer p_codigo_cliente;
    String p_nombre_cliente;
    String p_cuit_cliente;
    String p_cuit_rp;
    String p_razon_social_rp;
    String p_domicilio;

// plus constructor, getters and setters
}

//Service method 
public ProcClass callProcedure(String param){
        return asociadoMapper.callProcedure(
                Integer.getInteger(param),0,0,
                "",",","","","");
    }


//Mapper interface

@Repository
public interface AsociadoMapper extends Mapper {


    @Select(value = AsociadoQueries.getDocumentoAsociadoCall)
    @Options(statementType = StatementType.CALLABLE)
    @Results(value = {
            @org.apache.ibatis.annotations.Result
                    (property = "p_tipo_cliente", column = "p_tipo_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_codigo_cliente", column = "p_codigo_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_nombre_cliente", column = "p_nombre_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_cuit_cliente", column = "p_cuit_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_cuit_rp", column = "p_cuit_rp"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_razon_social_rp", column = "p_razon_social_rp"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_domicilio", column = "p_domicilio"),
    })
    ProcClass callProcedure(Integer p_id_grupo_familiar,
                            Integer p_tipo_cliente,
                            Integer p_codigo_cliente,
                            String p_nombre_cliente,
                            String p_cuit_cliente,
                            String p_cuit_rp,
                            String p_razon_social_rp,
                            String p_domicilio
                                     );

//Util class

public class AsociadoQueries {


    public static final String getDocumentoAsociadoCall = "{ CALL consultas_generales.get_detalle_cliente_gf(" +
            "#{p_id_grupo_familiar, mode=IN, jdbcType=INTEGER}," +
            "#{p_tipo_cliente, mode=OUT, jdbcType=INTEGER,},"+
            "#{p_codigo_cliente,  jdbcType=INTEGER},"+
            "#{p_nombre_cliente,  jdbcType=VARCHAR},"+
            "#{p_cuit_cliente,  jdbcType=VARCHAR},"+
            "#{p_cuit_rp,  jdbcType=VARCHAR},"+
            "#{p_razon_social_rp,  jdbcType=VARCHAR},"+
            "#{p_domicilio, jdbcType=VARCHAR}"+
            ")}";


// Pom related dependencies

<!-- MySQL -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.mybatis.dynamic-sql/mybatis-dynamic-sql -->
        <dependency>
            <groupId>org.mybatis.dynamic-sql</groupId>
            <artifactId>mybatis-dynamic-sql</artifactId>
            <version>1.1.0</version>
        </dependency>

The result expected is simple, either returning a list, map or a custom class containing the OUT params values returned by the procedure, right now, all i've got was null or an empty list...预期的结果很简单,要么返回一个列表、映射或一个包含程序返回的 OUT 参数值的自定义类,现在,我所得到的只是 null 或一个空列表......

Oh well, i just managed to figure it out, i guess i have to answer myself in case it helps someone else..., turns out i finally managed to get the out params by sending only 1 map as parameter, and setting the IN values before within the service method... also, the mapper is returning void now, which means that mybatis is adding dynamically all the additional out params into the map.哦,好吧,我只是设法弄明白了,我想我必须回答自己,以防它对其他人有帮助...,结果我终于设法通过仅发送 1 张地图作为参数并设置 IN 来获取输出参数在服务方法中之前的值...此外,映射器现在返回 void,这意味着 mybatis 正在将所有额外的输出参数动态添加到映射中。 I also made some changes to the call statement, maybe there was an error there too?我还对 call 语句做了一些更改,也许那里也有错误?

The code ended like this:代码是这样结束的:

    //service call
    public Map<String, Object> callProcedure(String param){

            Map<String, Object> map = new HashMap<String, Object>();
            Integer privilegesCount = 0;
            map.put("p_id_grupo_familiar", Integer.valueOf(param));
            asociadoMapper.callProcedure(map);

            return map;
        }
    //mapper
        @Select(value = AsociadoQueries.getDocumentoAsociadoCall)
        @Options(statementType = StatementType.CALLABLE)
        void callProcedure(Map<String,Object> params);

// Call statement

public static final String getDocumentoAsociadoCall = "{ CALL consultas_generales.get_detalle_cliente_gf(" +
            "#{p_id_grupo_familiar,  jdbcType=NUMERIC ,javaType=java.lang.Integer ,mode=IN}," +
            "#{p_tipo_cliente, jdbcType=NUMERIC,javaType=java.lang.Integer ,mode=OUT,},"+
            "#{p_codigo_cliente,  jdbcType=NUMERIC ,javaType=java.lang.Integer ,mode=OUT},"+
            "#{p_nombre_cliente,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_cuit_cliente,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_cuit_rp,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_razon_social_rp,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_domicilio, jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT}"+
            ")}";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM