【问题标题】:Spring JDBCTemplate Stored Procedure with ResultSet and OutPut Parameter带有 ResultSet 和 OutPut 参数的 Spring JDBCTemplate 存储过程
【发布时间】:2018-07-26 01:50:26
【问题描述】:

我创建了一个存储过程,它返回结果行和两个输出参数。 我在春天找不到任何东西可以从中得到ResultSetoutPutParameters。 我想实现类似 this 使用 Spring 框架。

【问题讨论】:

  • 为什么不使用 SimpleJdbcCall? stackoverflow.com/a/45542450
  • 是的,SimpleJdbcCall 不能返回 ResultSet,它返回 List<LinkedCaseInsensitiveMap>

标签: spring resultset jdbctemplate java-stored-procedures output-parameter


【解决方案1】:

我们在代码中使用类似下面的东西

public Map<String, Object> findData() {
        List prmtrsList = new ArrayList();
        prmtrsList.add(new SqlParameter(Types.VARCHAR));
        prmtrsList.add(new SqlParameter(Types.VARCHAR));
        prmtrsList.add(new SqlOutParameter("result", Types.VARCHAR));

        Map<String, Object> resultData = jdbcTemplate.call(connection -> {
            CallableStatement callableStatement = connection.prepareCall("{call STORED_PROC(?, ?, ?)}");
            callableStatement.setString(1, "first");
            callableStatement.setString(2, "last");
            callableStatement.registerOutParameter(3, Types.VARCHAR);
            return callableStatement;
        }, prmtrsList);
        return resultData;
    }

【讨论】:

  • 只是为了从上面返回的 Map resultData 中明确这一点,您可以将结果集提取为 resultData .get("#result-set-1")。其中#result-set-1 显然是第一个结果集
  • 为什么要注册两次参数?
  • 为什么这么冗长?
  • 用纯jdbc不是更方便吗?
  • 是不是因为不需要关闭语句和提交就更容易了?
【解决方案2】:
@SuppressWarnings("rawtypes")
    @Override
    public List<?> applyLeave(int leave_id, int emp_id, boolean is_emer_lev, int is_emer_appr_by, String emp_role,
            int rep_id, String reason, String backup_person, int bak_per_count, String leave_status, String comments,
            int leave_det_id, int leave_type, Timestamp leave_apply_frm_date, int no_of_days, Timestamp worked_date,
            String reason_for_cancellation, boolean active, boolean is_submit, int user_id) {

        StoredProcedureQuery query = entitymanager.createStoredProcedureQuery("sp_iu_leave");

        query.registerStoredProcedureParameter("p_leave_id", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_emp_id", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_is_emgen_leave", Boolean.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_is_emgen_leave_apr_by", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_emp_role", String.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_rpt_person_id", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_reason", String.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_backup_person", String.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_backup_person_cnt", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_leave_status", String.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_comments", String.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_leave_det_id", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_leave_type", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_leave_apply_frm_dt", Timestamp.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_no_of_days", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_worked_date", Timestamp.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_reason_for_cancellation", String.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_active", Boolean.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_is_submit", Boolean.class, ParameterMode.IN)
        .registerStoredProcedureParameter("p_usr_id", Integer.class, ParameterMode.IN)
        .registerStoredProcedureParameter("error_msg", String.class, ParameterMode.OUT);

        query.setParameter("p_leave_id", leave_id);
        query.setParameter("p_emp_id", emp_id);
        query.setParameter("p_is_emgen_leave", is_emer_lev);
        query.setParameter("p_is_emgen_leave_apr_by", is_emer_appr_by);
        query.setParameter("p_emp_role", emp_role);
        query.setParameter("p_rpt_person_id", rep_id);
        query.setParameter("p_reason", reason);
        query.setParameter("p_backup_person", backup_person);
        query.setParameter("p_backup_person_cnt", bak_per_count);
        query.setParameter("p_leave_status", leave_status);
        query.setParameter("p_comments", comments);
        query.setParameter("p_leave_det_id", leave_det_id);
        query.setParameter("p_leave_type", leave_type);
        query.setParameter("p_leave_apply_frm_dt", leave_apply_frm_date);
        query.setParameter("p_no_of_days", no_of_days);
        query.setParameter("p_worked_date", worked_date);
        query.setParameter("p_reason_for_cancellation", reason_for_cancellation);
        query.setParameter("p_active", active);
        query.setParameter("p_is_submit", is_submit);
        query.setParameter("p_usr_id", user_id);
        query.execute();

        String errString = (String) query.getOutputParameterValue("error_msg");
        System.out.println(errString);
        List res = query.getResultList();
        if(errString.equals("NO_ERR"))
        {
            return res;
        }
        else
        {
            return res;
        }

    }

您也可以使用StoredProcedurequery返回结果集,如有错误请回复谢谢!!

【讨论】:

  • 它不是 JDBCTemplate,它的 JPA。
  • 感谢@Alex78191的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2020-02-12
  • 1970-01-01
  • 2012-01-12
  • 2015-02-01
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多