Java调用存储过程的工具类 调用存储过程封装 打印存储过程调用参数

/**
 * 作者:guoyzh
 * 时间:2019/11/29 14:38
 * 功能:StoredProcedure 存储过程调用工具类
 */
public class SPUtils {
    private static SPUtils instance;

    public static SPUtils getInstance() {
        if (instance == null) {
            synchronized (SPUtils.class) {
                if (instance == null) {
                    instance = new SPUtils();
                }
            }
        }
        return instance;
    }

    private SPUtils() {
    }

    /**
     * 调用存储过程
     *
     * @param entityManager 实体控制类
     * @param procedureName 存储过程名称
     * @param params        参数值
     * @return
     */
    public StoredProcedureQuery callStoredProcedure(EntityManager entityManager, String procedureName, List<ParamBean> params) {
        if (ObjectUtils.isEmpty(params)) {
            return null;
        }
        StoredProcedureQuery query = entityManager.createStoredProcedureQuery(procedureName);
        for (ParamBean param : params) {
            // 注册参数
            query.registerStoredProcedureParameter(param.getParamName(), String.class, param.getParamMode());
            if (!ObjectUtils.isEmpty(param.getParamValue())) {
                // 设置参数的值
                query.setParameter(param.getParamName(), param.getParamValue());
            }
            // 将使用过的参数对象转换为null 方便循环结束后手动调用gc进行回收
            param = null;
        }
        // 调用gc将使用过的对象进行回收
        System.gc();
        return query;
    }

    /**
     * 测试期间打印本次请求存储过程日志
     */
    public String getQueryParams(StoredProcedureQuery query) {
        ProcedureParamBindings bindings = (ProcedureParamBindings) ReflectUtils.getBeanFieldValue(query, "paramBindings");
        // 请求参数名称
        Collection<QueryParameter> parameters = bindings.getParameterMetadata().getNamedParameters();
        // 获取调用存储过程的名称
        String procedureName = bindings.getProcedureCall().getProcedureName();
        // 请求参数对应的值 map
        HashMap<ProcedureParameterImpl, ParameterBindImpl> bindingMap = (HashMap) ReflectUtils.getBeanFieldValue(bindings, "bindingMap");
        // 保存数据
        StringBuilder sb = new StringBuilder();
        sb.append("exec ").append(procedureName).append(" ");
        // 填充返回结果
        parameters.stream().forEach(bean -> {
            int isContain = 0;
            for (Map.Entry<ProcedureParameterImpl, ParameterBindImpl> entry : bindingMap.entrySet()) {
                ProcedureParameterImpl key = entry.getKey();
                ParameterBindImpl value = entry.getValue();
                if (key.getName().equals(bean.getName())) {
                    isContain++;
                    sb.append("'").append(value.getValue().toString()).append("'").append(",");
                }
            }
            // 如果结果集中不包含当前key 增加一条空消息
            if (isContain == 0) {
                sb.append("''").append(",");
            }
        });
        if (sb.length() > 0) {
            // 去除最后一个逗号
            sb.deleteCharAt(sb.length() - 1);
        }
        return JsonUtils.toJson(sb.toString());
    }

    @Data
    @AllArgsConstructor
    public static class ParamBean {
        // 参数名称
        private String paramName;
        /*// 参数类型
        private Class paramType;*/
        // 调用存储过程时候输入还是输出字段
        private ParameterMode paramMode;
        // 参数的值
        private Object paramValue;
    }
}
发布了200 篇原创文章 · 获赞 97 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/u010838785/article/details/103510339