SimpleJDBCCall用resultset处理paramater

时间:2016-09-29 07:11:18

标签: mysql spring spring-jdbc

我正在使用spring jdbc。我希望结果集没有param。我分开完成了但是我无法做到。

    CREATE DEFINER=`xxx`@`%` PROCEDURE `client_xxxx`(
    IN p_xxxx TINYINT(1) UNSIGNED,
    IN p_result SMALLINT(2) UNSIGNED,
    OUT p_result BIT ) BEGIN 
       IF EXISTS(SELECT 1 FROM xxx WHERE xxx = 1 AND xxx = 1) THEN
           SELECT ...;
           SET p_result = 0;
       ELSE
         SELECT ...;
         SET p_result = 1;
       END IF;
    END

spring jdbc code

SimpleJdbcCall jdbcCall =  new SimpleJdbcCall(dataSource).withProcedureName(sp);
List<Map<String, Object>> list = (List<Map<String, Object>>) jdbcCall.execute(paramsArray).get("#result-set-1");

list获取带有结果集的结果集如何才能获得p_result

2 个答案:

答案 0 :(得分:0)

我以简单的方式找到它,我想念。

public Map<String, Object> xxx(String sp, Object... paramsArray) {
    SimpleJdbcCall jdbcCall =  new SimpleJdbcCall(dataSource).withProcedureName(sp);
    return jdbcCall.execute(paramsArray);
}

execute()默认提供两个参数 即 1)#results-set-1 2)#update-count-1

#result-set-1结果集即select record 并且#update-count-1返回更新计数。如果我们想要使用带有select参数的out语句来访问结果。我们只需声明out参数。 execute()Map<String, Object>类型提供所有内容。 因此,从地图中我们可以获得stored procedure返回的所有多个值。

例如我的SP喜欢

PROCEDURE xxx(
    IN xxxxTINYINT(1) UNSIGNED,
    IN xxxSMALLINT(2) UNSIGNED,
    OUT p_isconfig BIT
)
BEGIN
  SELECT....
  SET p_isconfig = 1;
END

所以在#result-set-1我得到了选择结果。 并且p_isconfig给了我结果。如果您有任何困惑,那么您可以迭代地图并确定如何获得返回参数。

Iterator i = map.keySet().iterator();
while ( i.hasNext() ) {
   String key = (String) i.next();
   String value = params.get( key );

   System.out.println("key: " + key + " --- value: " + value) ;

}

这样我在读完很多东西后找到了解决方法。如果任何人有此解决方案的其他选项,请与我分享。

答案 1 :(得分:0)

您可以尝试morejdbc(在maven central中使用)来调用您的过程,它更简洁而且类型安全:

import static org.morejdbc.SqlTypes.BIGINT;
import static org.morejdbc.NamedJdbcCall.call;
import org.morejdbc.*;
...
private JdbcTemplate jdbcTemplate;
...
Out<Integer> out = Out.of(INTEGER);
jdbcTemplate.execute(call("client_xxxx")
    .in("p_xxxx", pValue)
    .out("p_result", out));

System.out.println("Result is " + out.get());

对于ref_cursor out参数和Oracle数据库,您可以使用

Out<List<Record>> out = Out.of(OracleSqlTypes.cursor((rs, idx) -> new Record(rs)));
jdbcTemplate.execute(call("client_xxxx")
    .in("p_xxxx", pValue)
    .out("p_result", out)); // will auto-close ref-cursor

System.out.println("Got result records: " + out.get());